修复:盖子线方向错误导致的解析错误

pull/1925/MERGE
ChenX 2 years ago
parent 7f359c03bb
commit b5f1adacf3

@ -260,3 +260,24 @@ test('z不为0时分析错误', () =>
for (let c of walls[0].LidCurves)
expect(c.Length).toMatchNumberSnapshot();
});
test('直线与圆弧正确的删除盖子线', () =>
{
let d =
{ "file": [2, "RoomWallLine", 1, 3, 8, 2, 321, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5814.300457333236, -2014.354128653851, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5814.300457333236, -2014.354128653851, 0, 1], 0, 120, 0, 2700, 4062.232098765433, -1342.7555592592594, 0, 4062.232098765433, -564.4939173809105, 0, "RoomWallArc", 3, 8, 2, 329, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10274.71129794628, -2578.8480460347614, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 79.4, 0, 2700, 2, 398.1787418476097, 3.141592653589793, 0, true], "basePt": { "x": 9816.53255609867, "y": -3357.10968791311, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] };
let walls = LoadEntityFromFileData<RoomWallLine>(d);
TestWallCurveParse(walls);
});
test("直线与圆弧正确的删除盖子线(盒子问题导致点不在线内)", () =>
{
let d =
{ "file": [2, "RoomWallLine", 1, 3, 8, 2, 100, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -4002.9032397050305, 1355.3730089236885, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -4002.9032397050305, 1355.3730089236885, 0, 1], 0, 120, 0, 2700, 4062.232098765433, -1342.7555592592594, 0, 4062.232098765433, -564.4939173809105, 0, "RoomWallArc", 3, 8, 2, 101, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 457.50760090801305, 790.879091542778, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -9817.203697038267, 3369.7271375775395, 0, 1], 0, 79.4, 0, 2700, 2, 398.1787418476097, 3.141592653589793, 0, true], "basePt": { "x": -0.6711409395975352, "y": 12.61744966442916, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] };
let walls = LoadEntityFromFileData<RoomWallLine>(d);
TestWallCurveParse(walls);
});

@ -1342,6 +1342,134 @@ Array [
]
`;
exports[`直线与圆弧正确的删除盖子线 1`] = `
Array [
0,
778.2616418783487,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 2`] = `
Array [
0,
778.2616418783487,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 3`] = `
Array [
120,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 4`] = `
Array [
-20.299999999999272,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 5`] = `
Array [
-20.30000000000109,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 6`] = `
Array [
2.6812339980917268e-14,
437.87874184760966,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 7`] = `
Array [
2.1950492188302275e-14,
358.4787418476097,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线 8`] = `
Array [
79.39999999999964,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 1`] = `
Array [
0,
778.2616418783487,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 2`] = `
Array [
0,
778.2616418783487,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 3`] = `
Array [
120,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 4`] = `
Array [
-20.299999999999102,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 5`] = `
Array [
-20.30000000000092,
0,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 6`] = `
Array [
2.6812339980917268e-14,
437.87874184760966,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 7`] = `
Array [
2.1950492188302275e-14,
358.4787418476097,
0,
]
`;
exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 8`] = `
Array [
79.40000000000009,
0,
0,
]
`;
exports[`直线圆弧2 1`] = `
Array [
1487.019691385767,

@ -18,7 +18,7 @@ export class CurveTrim
public _Box: Box3;
constructor(public _curve: Line | Arc)
{
this._Box = _curve.BoundingBox;
this._Box = _curve.BoundingBox.expandByVector(new Vector3(0.01, 0.01));
}
TrimBy(contour: Contour, box: Box3, saveSyntropy = false)
@ -123,7 +123,7 @@ export class CurveTrimLine extends CurveTrim
if (cu.ParamOnCurve(d.param) && equalv3(d.closestPt, p, 1e-5))//点在线上
{
let derv = cu.GetFistDeriv(d.param).normalize();
return equalv3(derv, this.derv) || (saveSyntropy && equalv3(derv.negate(), this.derv));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向
return equalv3(derv, this.derv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), this.derv, 1e-4));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向
}
}
else
@ -131,7 +131,7 @@ export class CurveTrimLine extends CurveTrim
if (cu.PtOnCurve(p, 1e-5))
{
let derv = cu.GetFistDeriv(cu.GetParamAtPoint2(p)).normalize();
return equalv3(this.derv, derv) || (saveSyntropy && equalv3(derv.negate(), this.derv));
return equalv3(this.derv, derv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), this.derv, 1e-4));
}
}
}
@ -190,7 +190,7 @@ export class CurveTrimArc extends CurveTrim
if (cu.ParamOnCurve(d.param) && equalv3(d.closestPt, p, 1e-5))//点在线上 //这个代码似乎是错误的,因为直线和圆弧不可能重合
{
let derv = cu.GetFistDeriv(d.param).normalize();
return equalv3(derv, thisDerv) || (saveSyntropy && equalv3(derv.negate(), thisDerv));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向
return equalv3(derv, thisDerv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), thisDerv, 1e-4));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向
}
}
else
@ -198,7 +198,7 @@ export class CurveTrimArc extends CurveTrim
if (cu.PtOnCurve(p, 1e-5))
{
let cuDerv = cu.GetFistDeriv(cu.GetParamAtPoint2(p)).normalize();
return equalv3(thisDerv, cuDerv) || (saveSyntropy && equalv3(cuDerv.negate(), thisDerv));
return equalv3(thisDerv, cuDerv, 1e-4) || (saveSyntropy && equalv3(cuDerv.negate(), thisDerv, 1e-4));
}
}
}

@ -14,7 +14,7 @@ import { Line } from "../../Entity/Line";
import { Polyline } from "../../Entity/Polyline";
import { RoomWallBase } from "../Entity/Wall/RoomWallBase";
import { CurveTrim, CurveTrimArc, CurveTrimLine } from "./CurveTrim";
import { CreateGetCurveParam, GetCurveParam, GetLineParam, LEFT_ROTATE_MTX2 } from './GetCurveParam';
import { CreateGetCurveParam, GetCurveParam, GetLineParam } from './GetCurveParam';
import { RoomRegionParse } from './RoomRegionParse';
import { RoomWallExtendAndBreak } from "./RoomWallExtendAndBreak";
@ -678,9 +678,7 @@ export class RoomWallParse
if (!dir)
{
dir = offsetCurve.GetFistDeriv(0).normalize();
LEFT_ROTATE_MTX2.applyVector(dir);
if (type !== CurveType.Left) dir.negate();
dir = offsetCurve.GetFistDeriv(0).normalize().negate();
}
trim = new CurveTrimLine(offsetCurve, dir);
@ -770,9 +768,12 @@ export class RoomWallParse
let fb = new Flatbush(trimContours.length);
this.boxs = [];
let v = new Vector3(1e-2, 1e-2);
for (let con of trimContours)
{
let box = con.BoundingBox;
box.expandByVector(v);
fb.add(box.min.x, box.min.y, box.max.x, box.max.y);
this.boxs.push(box);
}

Loading…
Cancel
Save