|
|
|
@ -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,16 +260,11 @@ export class PolyOffestUtil
|
|
|
|
|
let isFillArc = FixIndex(startIndex + 1, this.m_Polyline.EndParam) !== endIndex;
|
|
|
|
|
|
|
|
|
|
//丢失圆弧时在丢失圆弧的起点构造一个圆
|
|
|
|
|
if (isFillArc)
|
|
|
|
|
{
|
|
|
|
|
let cir = new Circle(this.m_Polyline.GetPointAtParam(startIndex + 1), this.m_AbsDist);
|
|
|
|
|
cirContours.push(Contour.CreateContour([cir]));
|
|
|
|
|
if (startIndex > endIndex)
|
|
|
|
|
if (isFillArc && startIndex > endIndex)
|
|
|
|
|
{
|
|
|
|
|
this.fillArc(startIndex, endIndex, nextStartPt, frontLine, laterLine);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//#endregion
|
|
|
|
|
|
|
|
|
|
//#region 2.修剪延伸,根据真假交点
|
|
|
|
@ -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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 通过构建的轮廓对偏移曲线进行裁剪
|
|
|
|
|