降低精度,保证面域布尔能够得到正常的结果,测试全部通过

pull/240/MERGE
ChenX 6 years ago
parent 918c91529c
commit be67519e0b

@ -9,6 +9,11 @@ test("#IRFL2面域消失", () =>
let regs: Region[] = LoadRegionsFromFileData(data); let regs: Region[] = LoadRegionsFromFileData(data);
expect(regs.length).toBe(2); expect(regs.length).toBe(2);
regs[0].BooleanOper(regs[1], BoolOpeartionType.Intersection); let reg = regs[0].Clone();
expect(regs[0].ShapeManager.ShapeList.length).toBe(2); reg.BooleanOper(regs[1], BoolOpeartionType.Subtract);
expect(reg.ShapeManager.ShapeList.length).toBe(2);
reg = regs[0].Clone();
reg.BooleanOper(regs[1], BoolOpeartionType.Intersection);
expect(reg.ShapeManager.ShapeList.length).toBe(1);
}); });

@ -30,7 +30,7 @@ exports[`圆求交错误导致的线丢失 6`] = `4757.46853225238`;
exports[`圆求交错误导致的线丢失 7`] = `3783.74866210012`; exports[`圆求交错误导致的线丢失 7`] = `3783.74866210012`;
exports[`圆求交错误导致的线丢失 8`] = `4972.0124797018525`; exports[`圆求交错误导致的线丢失 8`] = `4972.012479701851`;
exports[`圆求交错误导致的线丢失 9`] = `1148.6632687596896`; exports[`圆求交错误导致的线丢失 9`] = `1148.6632687596896`;

@ -192,12 +192,12 @@ export function equalCurve(cu1: Curve, cu2: Curve)
let buls1 = ptsBuls1.buls; let buls1 = ptsBuls1.buls;
let buls2 = ptsBuls2.buls; let buls2 = ptsBuls2.buls;
if (cu1.IsClose && equalv2(pts1[0], arrayLast(pts1))) if (cu1.IsClose && equalv2(pts1[0], arrayLast(pts1), 1e-6))
{ {
pts1.pop(); pts1.pop();
buls1.pop(); buls1.pop();
} }
if (cu2.IsClose && equalv2(pts2[0], arrayLast(pts2))) if (cu2.IsClose && equalv2(pts2[0], arrayLast(pts2), 1e-6))
{ {
pts2.pop(); pts2.pop();
buls2.pop(); buls2.pop();
@ -211,7 +211,8 @@ export function equalCurve(cu1: Curve, cu2: Curve)
equalArray(pts1, pts2, (p1: Vector2, p2: Vector2) => equalArray(pts1, pts2, (p1: Vector2, p2: Vector2) =>
equalv3( equalv3(
Vec2DTo3D(p1).applyMatrix4(cu1.OCS), Vec2DTo3D(p1).applyMatrix4(cu1.OCS),
Vec2DTo3D(p2).applyMatrix4(cu2.OCS) Vec2DTo3D(p2).applyMatrix4(cu2.OCS),
1e-4
) )
); );
} }

@ -29,9 +29,7 @@ export function matrixSetVector(mat: Matrix4, col: number, v: Vector3)
*/ */
export function matrixAlignCoordSys(matrixFrom: Matrix4, matrixTo: Matrix4): Matrix4 export function matrixAlignCoordSys(matrixFrom: Matrix4, matrixTo: Matrix4): Matrix4
{ {
let matrix = new Matrix4().getInverse(matrixTo); return new Matrix4().getInverse(matrixTo).multiply(matrixFrom);
return new Matrix4().multiplyMatrices(matrix, matrixFrom);
} }
/** /**

@ -1,6 +1,8 @@
import * as THREE from "three"; import * as THREE from "three";
import { Vector3 } from "three"; import { Vector3 } from "three";
import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt";
import { curveLinkGroup, equalCurve, Vec3DTo2D } from "../Common/CurveUtils"; import { curveLinkGroup, equalCurve, Vec3DTo2D } from "../Common/CurveUtils";
import { Status } from "../Common/Status";
import { FixIndex } from "../Common/Utils"; import { FixIndex } from "../Common/Utils";
import { equaln, rotatePoint } from "../Geometry/GeUtils"; import { equaln, rotatePoint } from "../Geometry/GeUtils";
import { RegionParse, Route } from "../Geometry/RegionParse"; import { RegionParse, Route } from "../Geometry/RegionParse";
@ -10,8 +12,6 @@ import { Arc } from "./Arc";
import { Circle } from "./Circle"; import { Circle } from "./Circle";
import { Curve } from "./Curve"; import { Curve } from "./Curve";
import { Polyline } from "./Polyline"; import { Polyline } from "./Polyline";
import { arrayRemoveDuplicateBySort } from "../Common/ArrayExt";
import { Status } from "../Common/Status";
let cache = new WeakMap(); let cache = new WeakMap();
@ -359,7 +359,7 @@ export class Contour
else else
{ {
if (cache.has(g)) if (cache.has(g))
return cache.get(g) return cache.get(g);
let pl = new Polyline(); let pl = new Polyline();

@ -128,17 +128,17 @@ export abstract class Curve extends Entity
//点在曲线上 //点在曲线上
PtOnCurve(pt: Vector3): boolean PtOnCurve(pt: Vector3): boolean
{ {
return equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12) || this.ParamOnCurve(this.GetParamAtPoint(pt)); return equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6) || this.ParamOnCurve(this.GetParamAtPoint(pt));
} }
//点在曲线中,不在起点或者终点. //点在曲线中,不在起点或者终点.
PtOnCurve2(pt: Vector3): boolean PtOnCurve2(pt: Vector3): boolean
{ {
return !(equalv3(this.StartPoint, pt, 1e-12) || equalv3(this.EndPoint, pt, 1e-12)) && this.ParamOnCurve(this.GetParamAtPoint(pt), 0); return !(equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6)) && this.ParamOnCurve(this.GetParamAtPoint(pt), 0);
} }
//参数在曲线上 容差,1e-12 //参数在曲线上 容差,1e-6
ParamOnCurve(param: number, fuzz = 1e-12): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; } ParamOnCurve(param: number, fuzz = 1e-6): boolean { return !isNaN(param) && param >= -fuzz && param <= this.EndParam + fuzz; }
GetOffsetCurves(offsetDist: number): Array<Curve> { return; } GetOffsetCurves(offsetDist: number): Array<Curve> { return; }
GetClosestPointTo(pt: Vector3, extend: boolean): Vector3 { return; } GetClosestPointTo(pt: Vector3, extend: boolean): Vector3 { return; }

@ -73,7 +73,7 @@ export class CurveMap
*/ */
private GenerateP(v: Vector3): Vector3 private GenerateP(v: Vector3): Vector3
{ {
let str = v.toArray().map(v => ToFixed(v)).join(","); let str = v.toArray().map(v => ToFixed(v, 4)).join(",");
if (this.m_vecMap.has(str)) if (this.m_vecMap.has(str))
return this.m_vecMap.get(str); return this.m_vecMap.get(str);
this.m_vecMap.set(str, v); this.m_vecMap.set(str, v);

Loading…
Cancel
Save