开发:回归暴露多段线根据大圆弧切割的函数

pull/2209/MERGE
ChenX 1 year ago
parent be45726618
commit ece622b3eb

@ -0,0 +1,113 @@
import { Vector2 } from "three";
import { arrayLast } from "../Common/ArrayExt";
import { Vector2ApplyMatrix4 } from "../Common/Matrix4Utils";
import { Arc } from "../DatabaseServices/Entity/Arc";
import { Circle } from "../DatabaseServices/Entity/Circle";
import { Polyline } from "../DatabaseServices/Entity/Polyline";
import { IContourData } from "../Production/Convert2PtsBul";
import { AsVector2, equaln, equalv2 } from "./GeUtils";
/**
* 线,(1/4) API
* @param cu 线
* @param [isOutline=true] ,
* @param [isSplite=true] true,
* @returns +
*/
export function ConverToPolylineAndSplitArc(cu: Polyline | Circle, isOutline = true, isSplite = true): IContourData
{
let ptsBuls: { pts: Vector2[]; buls: number[]; };
if (cu instanceof Circle)
{
let pl = ConverCircleToPolyline(cu);
ptsBuls = pl.PtsBuls;
}
else
{
if (isOutline && cu.IsClose && cu.Normal.z * cu.Area2 < 0)
cu.Reverse();
if (isSplite)
ptsBuls = SplitePolylineAtArc(cu);
else
ptsBuls = cu.PtsBuls;
}
let ocs = cu.OCSNoClone;
if (!equaln(ocs.elements[0], 1)
|| !equaln(ocs.elements[9], 0)
|| !equaln(ocs.elements[10], 0)
)
{
for (let i = 0; i < ptsBuls.pts.length; i++)
{
Vector2ApplyMatrix4(ocs, ptsBuls.pts[i]);
ptsBuls.buls[i] *= cu.Normal.z;
}
}
return ptsBuls;
}
function ConverCircleToPolyline(cir: Circle): Polyline
{
let arcs = cir.GetSplitCurves([0, 0.25, 0.5, 0.75]);
let pl = new Polyline();
pl.OCS = cir.OCSNoClone;
for (let arc of arcs)
pl.Join(arc);
return pl;
}
const SPLITBUL = Math.tan(Math.PI / 8);
function GetSpliteCount(allAngle: number)
{
return Math.ceil(Math.abs(allAngle) / Math.PI * 2);
}
/** 打断多段线超过1/4圆的圆弧*/
function SplitePolylineAtArc(cu: Polyline): IContourData
{
let ptsBuls = cu.PtsBuls;
let ocsInv = cu.OCSInv;
let result: IContourData = { pts: [], buls: [] };
if (ptsBuls.pts.length === 0)
return result;
for (let i = 0; i < ptsBuls.buls.length - 1; i++)
{
let bul = ptsBuls.buls[i];
if (Math.abs(bul) > SPLITBUL + 1e-8)
{
let allAngle = Math.atan(bul) * 4;
let splitCount = GetSpliteCount(allAngle);
let arc = cu.GetCurveAtIndex(i) as Arc;
let paramDiv = 1 / splitCount;
let newBul = Math.tan((allAngle / splitCount) / 4);
for (let i = 0; i < splitCount; i++)
{
let param = i * paramDiv;
let p = arc.GetPointAtParam(param).applyMatrix4(ocsInv);
let p2 = AsVector2(p);
//暂时不处理0长度段
if (true || result.pts.length === 0 || !equalv2(p2, arrayLast(result.pts), 1e-2))
{
result.pts.push(p2);
result.buls.push(newBul);
}
}
}
else
{
//暂时不处理0长度段
if (true || result.pts.length === 0 || !equalv2(ptsBuls.pts[i], arrayLast(result.pts), 1e-2))
{
result.pts.push(ptsBuls.pts[i]);
result.buls.push(ptsBuls.buls[i]);
}
}
}
result.pts.push(arrayLast(ptsBuls.pts));
result.buls.push(arrayLast(ptsBuls.buls));
return result;
}

@ -13,6 +13,7 @@ export * from "./GraphicsSystem/BoolOperateUtils";
export { FeedingToolPath } from "./GraphicsSystem/ToolPath/FeedingToolPath"; export { FeedingToolPath } from "./GraphicsSystem/ToolPath/FeedingToolPath";
export * from "./GraphicsSystem/ToolPath/VKnifToolPath"; export * from "./GraphicsSystem/ToolPath/VKnifToolPath";
export * from "./Production/Product"; export * from "./Production/Product";
export * from "./Geometry/ConverToPolylineAndSplitArc";
//del_exp_start //del_exp_start
*/ */

Loading…
Cancel
Save