修复:删除墙重复失败,网洞反应器错误

pull/1906/MERGE
ChenX 2 years ago
parent 3cf3ba42f7
commit 9610c09c0a

@ -75,7 +75,7 @@ export class GetLineParam
{
let param = this.GetParamAtPoint(p);
let np = this.GetPointAtParam(param);
return [param, param > -1e-5 && param < 1.00001 && Vector2.prototype.distanceToSquared.call(np, p) < 1e-4];
return [param, Vector2.prototype.distanceToSquared.call(np, p) < 1e-4];
}
GetPointAtParam(param: number)

@ -4,7 +4,7 @@ import { Curve } from "../DatabaseServices/Entity/Curve";
import { RoomHolePolyline } from "../DatabaseServices/Room/Entity/Wall/Hole/RoomHolePolyline";
import { RoomWallBase } from "../DatabaseServices/Room/Entity/Wall/RoomWallBase";
import { CreateGetCurveParam } from "../DatabaseServices/Room/ParseService/GetCurveParam";
import { ParseWallRange } from "../DatabaseServices/Room/ParseService/Hole/RoomWallPlaceIHoleHelper";
import { FindBestRange, ParseWallRange } from "../DatabaseServices/Room/ParseService/Hole/RoomWallPlaceIHoleHelper";
import { RoomWallParse } from "../DatabaseServices/Room/ParseService/RoomWallParse";
import { CurveMap } from "../Geometry/CurveMap";
import { equalv2 } from "../Geometry/GeUtils";
@ -137,13 +137,36 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
let orgWall = hole.RelevancyWalls[0].Object;
let paramGet = CreateGetCurveParam(orgWall);
let ranges = ParseWallRange(orgWall, paramGet);
let [p1Param, p1Closeto] = paramGet.GetParamAtPoint2(p1);
let [p2Param, p2Closeto] = paramGet.GetParamAtPoint2(p2);
let range1 = FindBestRange(p1Param, ranges);
let range2 = FindBestRange(p2Param, ranges);
if (p1Closeto && p2Closeto)
{
wall.StartPoint = p1;
wall.EndPoint = p2;
if (range1 && range1 === range2)
{
wall.StartPoint = p1;
wall.EndPoint = p2;
}
else
{
let range = range1 ?? range2 ?? FindBestRange((p1Param + p2Param) * 0.5, ranges);
if (!range)
{
hole.Erase();
return;
}
p1Param = Math.max(p1Param, range[0]);
p2Param = Math.min(p2Param, range[1]);
wall.StartPoint = paramGet.GetPointAtParam(p1Param);
wall.EndPoint = paramGet.GetPointAtParam(p2Param);
}
}
else
{
@ -160,7 +183,16 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
let p1Param = holeData.StartParam;
let p2Param = holeData.EndParam;
//TODO:注意 这个实现导致的墙洞的尺寸发生变化! 在墙尺寸变化的时候
let range = FindBestRange(p1Param, ranges) ?? FindBestRange(p1Param, ranges) ?? FindBestRange((p1Param + p2Param) * 0.5, ranges);
if (!range)
{
hole.Erase();
return;
}
p1Param = Math.max(p1Param, range[0]);
p2Param = Math.min(p2Param, range[1]);
wall.StartPoint = paramGet.GetPointAtParam(p1Param);
wall.EndPoint = paramGet.GetPointAtParam(p2Param);
}
@ -210,57 +242,31 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
}
else//拐角点仍然对齐
{
let p1 = pts[0];
let p2 = pts[2];
let orgWall1 = hole.RelevancyWalls[0].Object;
let orgWall2 = hole.RelevancyWalls[1].Object;
let paramGet1 = CreateGetCurveParam(orgWall1);
let paramGet2 = CreateGetCurveParam(orgWall2);
let [p1Param, p1Closeto] = paramGet1.GetParamAtPoint2(p1);
let [p2Param, p2Closeto] = paramGet2.GetParamAtPoint2(p2);
if (p1Closeto && p2Closeto)//所有的点都在墙上
{
fakerWalls[0].StartPoint = p1;
fakerWalls[1].EndPoint = p2;
}
else//有点不在墙上
{
if (!p1Closeto || true)//为了保证正确的范围点 所以做成true
{
let length1 = pts[0].distanceTo(pts[1]);
let orgWall = hole.RelevancyWalls[0].Object;
let ranges = ParseWallRange(orgWall);
if (!r1.isReverse)
length1 = Math.min(length1, orgWall.Length * ranges[0][1]);
else
length1 = Math.min(length1, orgWall.Length * (1 - arrayLast(ranges)[0]));
fakerWalls[0].StartPoint = fakerWalls[0].GetPointAtDistance(fakerWalls[0].Length - length1);
}
let length1 = pts[0].distanceTo(pts[1]);
let orgWall = hole.RelevancyWalls[0].Object;
let ranges = ParseWallRange(orgWall);
if (!r1.isReverse)
length1 = Math.min(length1, orgWall.Length * ranges[0][1]);
else
fakerWalls[0].StartPoint = p1;
length1 = Math.min(length1, orgWall.Length * (1 - arrayLast(ranges)[0]));
if (!p2Closeto || true)
{
let length2 = pts[1].distanceTo(pts[2]);
let orgWall = hole.RelevancyWalls[1].Object;
let ranges = ParseWallRange(orgWall);
if (r2.isReverse)
length2 = Math.min(length2, orgWall.Length * (1 - arrayLast(ranges)[0]));
else
length2 = Math.min(length2, orgWall.Length * ranges[0][1]);
fakerWalls[1].EndPoint = fakerWalls[1].GetPointAtDistance(length2);
}
fakerWalls[0].StartPoint = fakerWalls[0].GetPointAtDistance(fakerWalls[0].Length - length1);
}
{
let length2 = pts[1].distanceTo(pts[2]);
let orgWall = hole.RelevancyWalls[1].Object;
let ranges = ParseWallRange(orgWall);
if (r2.isReverse)
length2 = Math.min(length2, orgWall.Length * (1 - arrayLast(ranges)[0]));
else
fakerWalls[1].EndPoint = p2;
length2 = Math.min(length2, orgWall.Length * ranges[0][1]);
updateHole = true;
fakerWalls[1].EndPoint = fakerWalls[1].GetPointAtDistance(length2);
}
updateHole = true;
}
}
else if (pts.length === 4)

Loading…
Cancel
Save