diff --git a/__test__/Polyline/offset.test.ts b/__test__/Polyline/offset.test.ts index e6f435400..69421a258 100644 --- a/__test__/Polyline/offset.test.ts +++ b/__test__/Polyline/offset.test.ts @@ -69,6 +69,7 @@ describe("闭合多段线", () => } for (let i = -1.5; i < 0; i += 0.01) { + if (cus[0].GetOffsetCurves(i).length === 0) console.log(i); expect(cus[0].GetOffsetCurves(i).length).toBe(1); } for (let i = 2; i < 10; i += 1) diff --git a/src/GraphicsSystem/OffestPolyline.ts b/src/GraphicsSystem/OffestPolyline.ts index 47a24bb6d..428b22a9e 100644 --- a/src/GraphicsSystem/OffestPolyline.ts +++ b/src/GraphicsSystem/OffestPolyline.ts @@ -1,6 +1,6 @@ import { Box3, Vector3 } from "three"; import { arrayLast, arrayRemoveIf, arraySortByNumber } from "../Common/ArrayExt"; -import { curveLinkGroup, GetPointAtCurveDir } from "../Common/CurveUtils"; +import { curveLinkGroup, GetPointAtCurveDir, Vec2DTo3D } from "../Common/CurveUtils"; import { FixIndex } from "../Common/Utils"; import { Arc } from "../DatabaseServices/Arc"; import { Circle } from "../DatabaseServices/Circle"; @@ -42,16 +42,20 @@ export class PolyOffestUtil let expCus = this.m_Polyline.Explode(); let offres = this.OffestCurve(expCus, this.m_OffestDist); - //暂只传入首尾点的圆做轮廓 - if (!this.m_Polyline.IsClose) - { - let cir1 = new Circle(this.m_Polyline.StartPoint, this.m_AbsDist); - let cir2 = new Circle(this.m_Polyline.EndPoint, this.m_AbsDist); - this.m_Contours.push(Contour.CreateContour([cir1])); - this.m_Contours.push(Contour.CreateContour([cir2])); - } + // console.time("join") this.TrimAndBuildContour(offres); + + for (let i = 0, count = this.m_Polyline.EndParam; i < count; i++) + { + if (i === count && this.m_Polyline.IsClose) + { + break; + } + let center = Vec2DTo3D(this.m_Polyline.GetPoint2dAt(i)).applyMatrix4(this.m_Polyline.OCS); + let cir = new Circle(center, this.m_AbsDist); + this.m_Contours.push(Contour.CreateContour([cir])); + } // testContours(this.m_Contours); // console.timeEnd("join") //裁剪 @@ -231,7 +235,6 @@ export class PolyOffestUtil //下一线段起始点 let nextStartPt: Vector3 = offResList[0].curve.StartPoint; - let cirContours: Contour[] = [] for (let i = 0; i < offResList.length; i++) { //源线段对应索引 @@ -257,15 +260,10 @@ export class PolyOffestUtil let isFillArc = FixIndex(startIndex + 1, this.m_Polyline.EndParam) !== endIndex; //丢失圆弧时在丢失圆弧的起点构造一个圆 - if (isFillArc) + if (isFillArc && startIndex > endIndex) { - let cir = new Circle(this.m_Polyline.GetPointAtParam(startIndex + 1), this.m_AbsDist); - cirContours.push(Contour.CreateContour([cir])); - if (startIndex > endIndex) - { - this.fillArc(startIndex, endIndex, nextStartPt, frontLine, laterLine); - continue; - } + this.fillArc(startIndex, endIndex, nextStartPt, frontLine, laterLine); + continue; } //#endregion @@ -311,7 +309,6 @@ export class PolyOffestUtil this.m_Polyline.GetCurveAtParam(offResList[0].index), this.m_RetCurves[0]); }; - this.m_Contours.push(...cirContours); } /** @@ -469,7 +466,14 @@ export class PolyOffestUtil if (index === cirs.length - 1) iPtsLater = [laterLine.StartPoint]; else - iPtsLater = c1.IntersectWith(laterLine, 0); + { + //和前面圆的交点需要大于偏移距离才能提前相交 + iPtsLater = c1.IntersectWith(laterLine, 0).filter(p => + { + let dist = p.distanceToSquared(this.m_Polyline.GetClosestPointTo(p, false)); + return dist + 1e-3 > this.m_dist2; + }); + } if (iPtsLater.length > 0)//直接和最后一条连接 { @@ -537,7 +541,7 @@ export class PolyOffestUtil return; this.m_RetCurves.push(cu); - this.m_Contours.push(this.BuildContour(cu)); + // this.m_Contours.push(this.BuildContour(cu)); } } // 通过构建的轮廓对偏移曲线进行裁剪