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

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)
{
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)

@ -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));
}
}
// 通过构建的轮廓对偏移曲线进行裁剪

Loading…
Cancel
Save