|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 获得全部闭合曲线
|
|
|
|
|