优化代码

pull/243/MERGE
ChenX 6 years ago
parent 4c7ded7fc0
commit fe3d49474f

@ -1,6 +1,6 @@
import * as THREE from "three";
import { Vector3 } from "three";
import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt";
import { arrayRemoveDuplicateBySort, arrayRemoveIf } from "../Common/ArrayExt";
import { curveLinkGroup, equalCurve, Vec3DTo2D } from "../Common/CurveUtils";
import { Status } from "../Common/Status";
import { FixIndex } from "../Common/Utils";
@ -252,51 +252,40 @@ export class Contour
}
getSubtractList(target: Contour)
{
let subtractList: Curve[] = [];
let sourceOutline = this.m_Curve;
let targetOutline = target.Curve;
if (target.CuInOutline(sourceOutline))
return [];
let interPts = sourceOutline.IntersectWith(targetOutline, IntersectOption.OnBothOperands);
let sourceContainerTarget = this.CuInOutline(targetOutline);
let targetContainerSource = target.CuInOutline(sourceOutline);
//包含.相交.分离(三种状态)
if (sourceContainerTarget && interPts.length === 0)//源包含目标
{
subtractList.push(sourceOutline, targetOutline);
}
else if (targetContainerSource)//目标包含源
{
return [];
return [sourceOutline, targetOutline];
}
else if (interPts.length === 0)//分离
{
subtractList.push(sourceOutline);
return [sourceOutline];
}
else//相交 interPts.length > 0
{
let pars1 = interPts.map(p => sourceOutline.GetParamAtPoint(p));
let pars2 = interPts.map(p => targetOutline.GetParamAtPoint(p));
let subtractList: Curve[] = [];
let sourceCus: Array<Polyline | Arc> = sourceOutline.GetSplitCurves(pars1);
let targetCus: Array<Polyline | Arc> = targetOutline.GetSplitCurves(pars2);
//是否有相等的曲线
let hasEqualCus = false;
let equalCus: WeakSet<Curve> = new WeakSet();
let sourceCus = sourceOutline.GetSplitCurvesByPts(interPts);
let targetCus = targetOutline.GetSplitCurvesByPts(interPts);
for (let pl of sourceCus)
{
//有一样的曲线直接跳过
hasEqualCus = targetCus.some(l =>
let hasEqualCus = false;
arrayRemoveIf(targetCus, cu =>
{
if (equalCurve(pl, l))
{
equalCus.add(l);
return true;
}
return false;
if (hasEqualCus) return false;
hasEqualCus = equalCurve(cu, pl);
return hasEqualCus;
});
if (hasEqualCus)
continue;
@ -309,16 +298,14 @@ export class Contour
for (let pl of targetCus)
{
if (equalCus.has(pl))
continue;
if (this.CuInOutline(pl))
{
subtractList.push(pl);
}
}
return subtractList;
}
return subtractList;
}
/**
* 线

@ -32,11 +32,14 @@ function getIntPtContextPts(sourceCur: Curve, cu: Curve, pts: Vector3[])
if (interPts.length > 0)
{
let pars = interPts.map(pt => cu.GetParamAtPoint(pt));
pars.forEach(par =>
for (let par of pars)
{
par >= 0.02 && pts.push(cu.GetPointAtParam(par - 0.01));
par <= (cu.EndParam - 0.02) && pts.push(cu.GetPointAtParam(par + 0.01));
})
if (par >= 0.02)
pts.push(cu.GetPointAtParam(par - 0.01));
if (par <= (cu.EndParam - 0.02))
pts.push(cu.GetPointAtParam(par + 0.01));
}
}
}
//判断点点是否全部都在封闭区域内或者在曲线上
@ -46,7 +49,7 @@ function IsPtsAllInOrOnReg(sourceReg: Polyline | Circle | Ellipse, pts: Vector3[
{
//是否点在封闭曲线内
return sourceReg.PtOnCurve(pt) || sourceReg.PtInCurve(pt);
})
});
}
//判断点是否全部都在封闭区域外或者在曲线上

Loading…
Cancel
Save