优化:多段线偏移保持第一个点的位置

pull/2338/head
ChenX 1 year ago
parent 338225ca3e
commit 9bfbedcc6c

@ -62,17 +62,13 @@ Object {
0,
0,
0,
0,
0.41421356237309503,
0,
],
"pts": Array [
Vector2 {
"x": 239.7404845937969,
"y": 2.842170943040401e-14,
},
Vector2 {
"x": 597,
"y": 8.526512829121202e-14,
"y": 1.1368683772161603e-13,
},
Vector2 {
"x": 597.0000000000001,
@ -92,7 +88,11 @@ Object {
},
Vector2 {
"x": 0,
"y": 239.74048459379705,
"y": 239.74048459379708,
},
Vector2 {
"x": 239.74048459379694,
"y": 2.842170943040401e-14,
},
],
}
@ -110,27 +110,27 @@ Array [
exports[`每段封边对应 4`] = `
Object {
"buls": Array [
0.5761636686505207,
-0,
0.5761636686505207,
-0,
-0,
],
"pts": Array [
Vector2 {
"x": 196.74752165480945,
"y": 0,
"x": 0,
"y": 5.684341886080802e-14,
},
Vector2 {
"x": 196.74752165480942,
"y": 348,
"x": 196.74752165480933,
"y": 0,
},
Vector2 {
"x": 0,
"y": 348,
"x": 196.74752165480942,
"y": 348.00000000000006,
},
Vector2 {
"x": 0,
"y": 0,
"y": 348.00000000000006,
},
],
}

@ -50,7 +50,7 @@ exports[`圆弧如果连接就自交,需要补圆弧才能解决 2`] = `"948.214
exports[`圆弧连接后逆向 1`] = `1`;
exports[`圆弧连接后逆向 2`] = `"4159.59626"`;
exports[`圆弧连接后逆向 2`] = `"4159.59627"`;
exports[`圆弧连接成圆 1`] = `7`;
@ -88,29 +88,29 @@ exports[`圆求交错误导致的线丢失 1`] = `4148.655275462343`;
exports[`圆求交错误导致的线丢失 2`] = `4425.280774659384`;
exports[`圆求交错误导致的线丢失 3`] = `4021.9003160283755`;
exports[`圆求交错误导致的线丢失 3`] = `4021.900316028377`;
exports[`圆求交错误导致的线丢失 4`] = `4581.224228650708`;
exports[`圆求交错误导致的线丢失 4`] = `4581.224228650707`;
exports[`圆求交错误导致的线丢失 5`] = `3900.6078808627653`;
exports[`圆求交错误导致的线丢失 6`] = `4757.468532252447`;
exports[`圆求交错误导致的线丢失 6`] = `4757.4685322524465`;
exports[`圆求交错误导致的线丢失 7`] = `3783.7486269392593`;
exports[`圆求交错误导致的线丢失 8`] = `4972.012479701948`;
exports[`圆求交错误导致的线丢失 8`] = `4972.012479701949`;
exports[`圆求交错误导致的线丢失 9`] = `1148.6626298787855`;
exports[`圆求交错误导致的线丢失 9`] = `1148.6626298787853`;
exports[`圆求交错误导致的线丢失 10`] = `5979.881810920421`;
exports[`圆求交错误导致的线丢失 10`] = `5979.881810920422`;
exports[`圆求交错误导致的线丢失 11`] = `1049.959063092209`;
exports[`圆求交错误导致的线丢失 11`] = `1049.9590630922082`;
exports[`圆求交错误导致的线丢失 12`] = `6051.226641876335`;
exports[`圆求交错误导致的线丢失 13`] = `722.4732418587947`;
exports[`圆求交错误导致的线丢失 14`] = `6316.98088721295`;
exports[`圆求交错误导致的线丢失 14`] = `6316.980887212949`;
exports[`复杂圆盘选点 1`] = `1`;
@ -176,11 +176,11 @@ exports[`点在多段线内 1`] = `1`;
exports[`点在多段线内 2`] = `"1589.94630"`;
exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675189454805246`;
exports[`简单图形因为点在线内算法错误导致的丢失 1`] = `8.675189454805244`;
exports[`简单图形因为点在线内算法错误导致的丢失 2`] = `8.252841733482933`;
exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `7.149404849854285`;
exports[`简单图形因为点在线内算法错误导致的丢失 3`] = `7.1494048498542835`;
exports[`简单图形因为点在线内算法错误导致的丢失 4`] = `6.693604273021893`;
@ -196,7 +196,7 @@ exports[`精度过高导致的曲线丢失 4`] = `"97661.61008"`;
exports[`精度过高导致直连失败 1`] = `1`;
exports[`精度过高导致直连失败 2`] = `"32040.01391"`;
exports[`精度过高导致直连失败 2`] = `"32040.01361"`;
exports[`精度过高导致直连失败 3`] = `1`;
@ -226,7 +226,7 @@ exports[`纯圆生成的多段线偏移 4`] = `"6328.57819"`;
exports[`补充bug测试 1`] = `7385.123391644355`;
exports[`补充bug测试 2`] = `7455.861403941377`;
exports[`补充bug测试 2`] = `7455.861403941376`;
exports[`补圆弧测试 补圆弧测试1 1`] = `1`;

@ -4,8 +4,8 @@ exports[`因为错误的点在多段线内部导致的偏移错误 1`] = `"2029.
exports[`圆裁剪精度 1`] = `1`;
exports[`圆裁剪精度 2`] = `"8360.63312"`;
exports[`圆裁剪精度 2`] = `"8360.63303"`;
exports[`圆裁剪精度 3`] = `1`;
exports[`圆裁剪精度 4`] = `"8385.98861"`;
exports[`圆裁剪精度 4`] = `"8385.98870"`;

@ -4,9 +4,9 @@ exports[`补充bug测试#IKWGF 1`] = `0.4457395323616311`;
exports[`补充bug测试#IKWGF 2`] = `10.732981364094256`;
exports[`补充bug测试#IKWGF 3`] = `1.1376403544773555`;
exports[`补充bug测试#IKWGF 3`] = `1.1376403544773552`;
exports[`补充bug测试#IKWGF 4`] = `12.786911814880932`;
exports[`补充bug测试#IKWGF 4`] = `12.786911814880929`;
exports[`补充bug测试#IKWGF 5`] = `10.586692094955232`;
@ -14,12 +14,12 @@ exports[`补充bug测试#IKWGF 6`] = `0.624693344084014`;
exports[`补充bug测试#IKWGF 7`] = `14.067113755971711`;
exports[`补充bug测试#IKWGF 8`] = `11.89101792289923`;
exports[`补充bug测试#IKWGF 8`] = `11.891017922899252`;
exports[`补充bug测试#IKWGF 9`] = `2.168984971098264`;
exports[`补充bug测试#IKWGF 10`] = `0.39474593983901435`;
exports[`补充bug测试#IKWGF 10`] = `0.3947459398390142`;
exports[`补充bug测试#IKWGF 11`] = `10.698868451254269`;
exports[`补充bug测试#IKWGF 11`] = `10.69886845125427`;
exports[`补充bug测试#IKWGF 12`] = `1.0803374679586235`;

@ -11,7 +11,7 @@ import { Line } from "../DatabaseServices/Entity/Line";
import { Polyline } from "../DatabaseServices/Entity/Polyline";
import { IntersectsBox } from "../Geometry/Box";
import { CurveMap, Route, Vertice } from "../Geometry/CurveMap";
import { IdentityMtx4, SelectNearP, angle, equaln, equalv2, equalv3 } from "../Geometry/GeUtils";
import { AsVector2, IdentityMtx4, SelectNearP, angle, equaln, equalv2, equalv3 } from "../Geometry/GeUtils";
import { IntersectOption } from "../GraphicsSystem/IntersectWith";
interface IOffsetResult
@ -684,7 +684,7 @@ export class OffsetPolyline
let preP: Vector3;
let searchNext = (s: Vertice, pl: Polyline): Vertice =>
let searchNext = (s: Vertice, pl: Polyline, isJoinEnd = true): Vertice =>
{
let minDist = Infinity;
let minR: Route;
@ -704,17 +704,60 @@ export class OffsetPolyline
else
{
minR = r;
minDist = 0;
break;
}
}
if (minR)
if (minR && Math.sqrt(minDist) < 0.085)
{
used.add(minR.curve);
preP = minR.e;
let status = pl.Join(minR.curve, false, 8e-2);
if (status !== Status.True)
console.warn("连接失败");
// let status = pl.Join(minR.curve, false, 8e-2);
// if (status !== Status.True)
// console.warn("连接失败");
//#region fast join (为了避免Polyline.Join 导致的顺序错误)
let cu = minR.curve;
//bul
let bul = 0;
if (cu instanceof Arc)
{
bul = cu.Bul;
if (minR.isReverse)
bul *= -1;
if (!isJoinEnd)
bul *= -1;
}
if (pl.LineData.length === 0)
{
pl.LineData.push({
pt: AsVector2(minR.s),
bul: bul
});
}
if (isJoinEnd)
{
pl.LineData[pl.LineData.length - 1].bul = bul;
pl.LineData.push({
pt: AsVector2(minR.e),
bul: 0
});
}
else
{
pl.LineData.unshift({
pt: AsVector2(minR.e),
bul
});
}
//#endregion
return minR.to;
}
};
@ -725,10 +768,11 @@ export class OffsetPolyline
let pl = new Polyline();
let ss = s;
while (ss && !pl.IsClose)
ss = searchNext(ss, pl);
ss = searchNext(ss, pl, true);
ss = s;
preP = pl.StartPoint;
while (ss && !pl.IsClose)
ss = searchNext(ss, pl);
ss = searchNext(ss, pl, false);
if (pl.NumberOfVertices > 1)
{

Loading…
Cancel
Save