From 9610c09c0a5bfd8c7c2d4bd37afd04330b3098fe Mon Sep 17 00:00:00 2001 From: ChenX Date: Wed, 8 Jun 2022 16:36:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=E5=88=A0=E9=99=A4=E5=A2=99?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=A4=B1=E8=B4=A5,=E7=BD=91=E6=B4=9E?= =?UTF-8?q?=E5=8F=8D=E5=BA=94=E5=99=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Room/ParseService/GetCurveParam.ts | 2 +- src/Reactor/RoomHoleReactor.ts | 104 +++++++++--------- 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/DatabaseServices/Room/ParseService/GetCurveParam.ts b/src/DatabaseServices/Room/ParseService/GetCurveParam.ts index 0fe7cf29f..92f59ce0d 100644 --- a/src/DatabaseServices/Room/ParseService/GetCurveParam.ts +++ b/src/DatabaseServices/Room/ParseService/GetCurveParam.ts @@ -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) diff --git a/src/Reactor/RoomHoleReactor.ts b/src/Reactor/RoomHoleReactor.ts index 21926f97c..20fa314ce 100644 --- a/src/Reactor/RoomHoleReactor.ts +++ b/src/Reactor/RoomHoleReactor.ts @@ -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)