修复:某些情况下布尔运算结果错误

pull/2584/MERGE
ChenX 7 months ago
parent dfc5f61b2a
commit 0be97b0ec8

@ -1,3 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`因为判断同向错误导致的布尔运算错误 1`] = `"2"`;
exports[`因为判断同向错误导致的布尔运算错误 2`] = `"730.55880"`;
exports[`简单差集 1`] = `377232.7083535502`;

@ -2,6 +2,7 @@ import { arraySum } from "../../src/Common/ArrayExt";
import { Region } from "../../src/DatabaseServices/Entity/Region";
import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils";
import { LoadRegionsFromFileData } from "../Utils/LoadEntity.util";
import "../Utils/jest.util";
//没有洞
test('2没有洞的面域,相交', () =>
@ -234,3 +235,15 @@ function testRegionsBool(regs: Region[], uShapeCount: number, uHoleCount: number
expect(shapeCount3).toBe(sShapeCount);
expect(holeCount3).toBe(sHoleCount);
}
test('因为判断同向错误导致的布尔运算错误', () =>
{
let d =
{ "file": [2, "Region", 10, 2, 113, 0, 1, 1, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, 2, 6, [51.327397755710166, 8.9999999999999], 0, [76.44091661722764, 52.49789062498048], 0, [51.327397755698925, 95.99578124997062], 0, [1.09445458902535, 95.99578124997072], 0, [-22.143756126866503, 55.746019613071404], 0.02750377742868334, [4.842938509491432, 9.000000000000057], 0, true, 0, "Region", 10, 2, 114, 0, 1, 2, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, 2, 6, [19.91736643882509, -40.4978906249944], 0, [66.68620799036073, -40.49789062499439], 0, [90.06767604432, -3.986144747614162e-12], 0, [66.68620799036296, 40.49789062500167], 0, [19.917366438823027, 40.49789062500167], 0, [-3.4641016151380235, -2.1316282072803006e-13], 0, true, 0], "basePt": { "x": 61.922626502995854, "y": 38.997890625008054, "z": -6.363451432349935e-16 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 298.994974874372, 121.44053601340033, 0, 1] };
let regs = LoadRegionsFromFileData(d.file);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].ShapeManager.ShapeCount).toMatchNumberSnapshot(0);
expect(regs[0].Area).toMatchNumberSnapshot();
});

@ -476,17 +476,20 @@ export class Contour
for (let sourceSplitcu of sourceSplitCurves)
{
let sourceDir = sourceSplitcu.GetFirstDeriv(sourceSplitcu.MidParam).normalize();
let index = targetSplitCurves.findIndex(cu => fastEqualCurve(cu, sourceSplitcu, 0.05));
if (index !== -1)
{
let targetSplitcu = targetSplitCurves[index];
let isEqualNormal = equalv3(sourceOutline.Normal, targetSplitCurve_CurvesMap.get(targetSplitcu).Normal, 1e-3);
let targetDir = targetSplitcu.GetFirstDeriv(targetSplitcu.MidParam).normalize();
if (isEqualNormal === !equalv3(targetDir, sourceDir, 1e-3))//不同向
if (isEqualNormal === !equalv3(sourceSplitcu.StartPoint, targetSplitcu.StartPoint, 0.05))//不同向
{
subtractList.push(sourceSplitcu);
// TestDraw(sourceSplitcu.Clone(), 1);
// TestDraw(targetSplitcu.Clone(), 1);
}
// else
// TestDraw(sourceSplitcu.Clone(), 2);
targetSplitCurves.splice(index, 1);

@ -135,7 +135,18 @@ export class FeedingToolPath extends Singleton
let shapeMg = new ShapeManager();
let cons = this.GetContours(retCus as Polyline[], offsetCus);
shapeMg.AppendShapeList(cons.map(c => new Shape(c)));
//testcode
// let reg = new Region(shapeMg).Clone();
// let reg2 = new Region(holesMg).Clone();
// TestDraw(reg, 1);
// TestDraw(reg2, 2);
shapeMg.BoolOper(holesMg, BoolOpeartionType.Subtract);
// let reg3 = new Region(shapeMg).Clone();
// TestDraw(reg3, 3);
for (let s of shapeMg.ShapeList)
{
if (isOut && tempOffsetCus.length > 1)

Loading…
Cancel
Save