fix #IWFYB 修正布尔运算因为精度运算导致的板件切割错误

pull/297/MERGE
ChenX 5 years ago
parent e96cac1398
commit 1f2163a129

@ -0,0 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`布尔_误差共线_误差交点 1`] = `739590.0297771678`;
exports[`布尔_误差共线_误差交点 2`] = `739582.752529773`;

@ -0,0 +1,20 @@
import { LoadRegionsFromFileData } from "../Utils/LoadEntity.util";
import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils";
test('布尔_误差共线_误差交点', () =>
{
let d = [2, "Region", 3, 2, 128, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [600, 0], 0, [600, 1241.380049628613], 0, [0, 1241.380049628613], 0, [0, 0], 0, true, 0, "Region", 3, 2, 129, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1232.380049628613, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1232.380049628613, 0, 1], 2, 4, [0, 0], 0, [582, 0], 0, [582, 8.999955254199449], 0, [0, 8.999955254199449], 0, true, 0];
let regs = LoadRegionsFromFileData(d);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].Area).toMatchSnapshot();
//弧形情况
d = [2, "Region", 3, 2, 156, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 141.87083942583706, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 141.87083942583706, 0, 1], 2, 4, [600, 0], 0, [600, 1241.380049628613], 0, [0, 1241.380049628613], 0, [0, 0], 0, true, 0, "Region", 3, 2, 155, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 1374.2508890544507, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 1374.2508890544507, 0, 1], 2, 4, [0, 0], 0, [582, 0], 0.26581272283978424, [582, 8.999955254199449], 0, [0, 8.999955254199449], 0, true, 0];
regs = LoadRegionsFromFileData(d);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(regs[0].Area).toMatchSnapshot();
});

@ -11,6 +11,6 @@ test('EdgeGeometry生成', () =>
{
let line = br.GetDrawObjectFromRenderType(RenderType.Wireframe) as Line;
//@ts-ignore
expect(line.geometry.attributes.position.length).toMatchSnapshot();
expect(line.geometry.attributes.position.count).toMatchSnapshot();
}
});

@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`EdgeGeometry生成 1`] = `1296`;
exports[`EdgeGeometry生成 1`] = `432`;
exports[`EdgeGeometry生成 2`] = `2592`;
exports[`EdgeGeometry生成 2`] = `864`;
exports[`EdgeGeometry生成 3`] = `438`;
exports[`EdgeGeometry生成 3`] = `146`;

@ -22,8 +22,8 @@
"devDependencies": {
"@types/blueimp-md5": "^2.7.0",
"@types/html-webpack-plugin": "^3.2.0",
"@types/jest": "^24.0.12",
"@types/node": "^12.0.0",
"@types/jest": "^24.0.13",
"@types/node": "^12.0.1",
"@types/react": "^16.8.17",
"@types/react-color": "^3.0.0",
"@types/react-dom": "^16.8.4",
@ -58,7 +58,7 @@
"source-map-loader": "^0.2.4",
"style-loader": "^0.23.1",
"terser-webpack-plugin": "^1.2.2",
"ts-jest": "^23.10.5",
"ts-jest": "^24.0.2",
"ts-loader": "^6.0.0",
"ts-node": "^8.1.0",
"tsconfig-paths": "^3.8.0",

@ -8,7 +8,7 @@ export class NonAssociativeCutting implements Command
async exec()
{
let brsRes2 = await app.m_Editor.GetSelection({
Msg: "选择所有切割的板件",
Msg: "选择切割的板件",
UseSelect: true,
Filter: { filterTypes: [Board] }
});
@ -19,7 +19,7 @@ export class NonAssociativeCutting implements Command
app.m_Editor.Prompt(`选择切割的板件: 总计${brs2.length}`);
let brsRes = await app.m_Editor.GetSelection({
Msg: "选择所有被切割的板件(空格选择剩余全部)",
Msg: "选择被切割的板件<全部选择>",
UseSelect: true,
Filter: {
filterTypes: [Board],

@ -132,9 +132,9 @@ export abstract class Curve extends Entity
Reverse(): this { return this; }
//点在曲线上
PtOnCurve(pt: Vector3): boolean
PtOnCurve(pt: Vector3, fuzz = 1e-6): boolean
{
return equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6) || this.ParamOnCurve(this.GetParamAtPoint(pt));
return equalv3(this.StartPoint, pt, fuzz) || equalv3(this.EndPoint, pt, fuzz) || this.ParamOnCurve(this.GetParamAtPoint(pt));
}
//点在曲线中,不在起点或者终点.

@ -5,8 +5,7 @@ import { Circle } from '../DatabaseServices/Circle';
import { Curve } from '../DatabaseServices/Curve';
import { Line } from '../DatabaseServices/Line';
import { Polyline } from '../DatabaseServices/Polyline';
import { comparePoint, equaln, equalv3, midPoint } from '../Geometry/GeUtils';
import { comparePoint, equaln, equalv3 } from '../Geometry/GeUtils';
/**
* .
@ -52,12 +51,12 @@ export function reverseIntersectOption(intType: IntersectOption)
* @param {Intersect} extType .
* @returns {Array<Vector3>}
*/
function CheckPointOnCurve(intPts: Vector3[], c1: Curve, c2: Curve, extType: IntersectOption): Array<Vector3>
function CheckPointOnCurve(intPts: Vector3[], c1: Curve, c2: Curve, extType: IntersectOption, fuzz = 1e-4): Array<Vector3>
{
return intPts.filter(p =>
{
return (extType & IntersectOption.ExtendThis || c1.PtOnCurve(p)) && (extType & IntersectOption.ExtendArg || c2.PtOnCurve(p))
})
return (extType & IntersectOption.ExtendThis || c1.PtOnCurve(p, fuzz)) && (extType & IntersectOption.ExtendArg || c2.PtOnCurve(p, fuzz))
});
}
export function IntersectCircleAndCircle(cu1: Circle | Arc, cu2: Circle | Arc)
@ -274,7 +273,7 @@ function ShortestLine3AndLine3(p1: Vector3, p2: Vector3, p3: Vector3, p4: Vector
}
//直线和直线
export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOption): Vector3[]
export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOption, fuzz = 1e-4): Vector3[]
{
// if (l1.Is2D && l2.Is2D)
// {
@ -282,20 +281,30 @@ export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOptio
// if (p) return [p];
// else return [];
// }
let [pt1, pt2, pt3, pt4] = [l1.StartPoint, l1.EndPoint, l2.StartPoint, l2.EndPoint];
let pts = ShortestLine3AndLine3(l1.StartPoint, l1.EndPoint, l2.StartPoint, l2.EndPoint);
let pts = ShortestLine3AndLine3(pt1, pt2, pt3, pt4);
if (!pts) return [];
let pt = pts[0];
let { closestPt: p1, param: param1 } = l1.GetClosestAtPoint(pt, true);
let { closestPt: p2, param: param2 } = l2.GetClosestAtPoint(pt, true);
if (
!equalv3(pt, p1, 1e-6)
|| !equalv3(pt, p2, 1e-6)
|| !(extType & IntersectOption.ExtendThis || l1.ParamOnCurve(param1))
|| !(extType & IntersectOption.ExtendArg || l2.ParamOnCurve(param2))
)
if (!equalv3(pt, p1, fuzz) || !equalv3(pt, p2, fuzz))
return [];
if (!(extType & IntersectOption.ExtendThis
|| l1.ParamOnCurve(param1, 0)
|| equalv3(pt1, pt, fuzz)
|| equalv3(pt2, pt, fuzz)
))
return [];
if (!(extType & IntersectOption.ExtendArg
|| l2.ParamOnCurve(param2, 0)
|| equalv3(pt3, pt, fuzz)
|| equalv3(pt4, pt, fuzz)
))
return [];
return [pt];

Loading…
Cancel
Save