补圆弧时交点需要大于偏移距离允许提前连接,轮廓加入顶点圆

pull/68/head
Zoe 6 years ago
parent dad4f5e7a4
commit 4a09a99667

@ -69,6 +69,7 @@ describe("闭合多段线", () =>
} }
for (let i = -1.5; i < 0; i += 0.01) 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); expect(cus[0].GetOffsetCurves(i).length).toBe(1);
} }
for (let i = 2; i < 10; i += 1) for (let i = 2; i < 10; i += 1)

@ -1,6 +1,6 @@
import { Box3, Vector3 } from "three"; import { Box3, Vector3 } from "three";
import { arrayLast, arrayRemoveIf, arraySortByNumber } from "../Common/ArrayExt"; 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 { FixIndex } from "../Common/Utils";
import { Arc } from "../DatabaseServices/Arc"; import { Arc } from "../DatabaseServices/Arc";
import { Circle } from "../DatabaseServices/Circle"; import { Circle } from "../DatabaseServices/Circle";
@ -42,16 +42,20 @@ export class PolyOffestUtil
let expCus = this.m_Polyline.Explode(); let expCus = this.m_Polyline.Explode();
let offres = this.OffestCurve(expCus, this.m_OffestDist); 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") // console.time("join")
this.TrimAndBuildContour(offres); 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); // testContours(this.m_Contours);
// console.timeEnd("join") // console.timeEnd("join")
//裁剪 //裁剪
@ -231,7 +235,6 @@ export class PolyOffestUtil
//下一线段起始点 //下一线段起始点
let nextStartPt: Vector3 = offResList[0].curve.StartPoint; let nextStartPt: Vector3 = offResList[0].curve.StartPoint;
let cirContours: Contour[] = []
for (let i = 0; i < offResList.length; i++) 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; 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); this.fillArc(startIndex, endIndex, nextStartPt, frontLine, laterLine);
cirContours.push(Contour.CreateContour([cir])); continue;
if (startIndex > endIndex)
{
this.fillArc(startIndex, endIndex, nextStartPt, frontLine, laterLine);
continue;
}
} }
//#endregion //#endregion
@ -311,7 +309,6 @@ export class PolyOffestUtil
this.m_Polyline.GetCurveAtParam(offResList[0].index), this.m_Polyline.GetCurveAtParam(offResList[0].index),
this.m_RetCurves[0]); this.m_RetCurves[0]);
}; };
this.m_Contours.push(...cirContours);
} }
/** /**
@ -469,7 +466,14 @@ export class PolyOffestUtil
if (index === cirs.length - 1) if (index === cirs.length - 1)
iPtsLater = [laterLine.StartPoint]; iPtsLater = [laterLine.StartPoint];
else 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)//直接和最后一条连接 if (iPtsLater.length > 0)//直接和最后一条连接
{ {
@ -537,7 +541,7 @@ export class PolyOffestUtil
return; return;
this.m_RetCurves.push(cu); this.m_RetCurves.push(cu);
this.m_Contours.push(this.BuildContour(cu)); // this.m_Contours.push(this.BuildContour(cu));
} }
} }
// 通过构建的轮廓对偏移曲线进行裁剪 // 通过构建的轮廓对偏移曲线进行裁剪

Loading…
Cancel
Save