优化代码

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

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

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

Loading…
Cancel
Save