|
@@ -25,10 +25,10 @@ export class generate {
|
|
|
const k2 = dy2 / dx2;
|
|
|
// 线1与x轴的夹角
|
|
|
const temp1 = Math.atan(k1)
|
|
|
- const a1 = k1 >= 0 ? temp1 : temp1 + Math.PI;
|
|
|
+ let a1 = dx1 >= 0 ? temp1 : temp1 + Math.PI;
|
|
|
// 线2与x轴的夹角
|
|
|
const temp2 = Math.atan(k2)
|
|
|
- const a2 = k2 >= 0 ? temp2 : temp2 + Math.PI;
|
|
|
+ let a2 = dx2 >= 0 ? temp2 : temp2 + Math.PI;
|
|
|
// 角平分线斜率
|
|
|
const k = Math.tan((a1 + a2) / 2);
|
|
|
// 角平分线b
|
|
@@ -45,7 +45,7 @@ export class generate {
|
|
|
const Y1 = k * X1 + b;
|
|
|
const Y2 = k * X2 + b;
|
|
|
|
|
|
- return [X1, Y1, X2, Y2]
|
|
|
+ return [Number(X1.toFixed(6)), Number(Y1.toFixed(6)), Number(X2.toFixed(6)), Number(Y2.toFixed(6))]
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -61,11 +61,11 @@ export class generate {
|
|
|
const dx1 = p1.x - p2.x;
|
|
|
|
|
|
if (dy1 == 0) {
|
|
|
- return [p1.x, p1.y - l, p1.x, p1.y + l]
|
|
|
+ return [Number(p1.x.toFixed(6)), Number((p1.y - l).toFixed(6)), Number(p1.x.toFixed(6)), Number((p1.y + l).toFixed(6))]
|
|
|
}
|
|
|
|
|
|
if (dx1 == 0) {
|
|
|
- return [p1.x - l, p1.y, p1.x + l, p1.y]
|
|
|
+ return [Number((p1.x - l).toFixed(6)), Number(p1.y.toFixed(6)), Number((p1.x + l).toFixed(6)), Number(p1.y.toFixed(6))]
|
|
|
}
|
|
|
|
|
|
// 线1的斜率
|
|
@@ -84,7 +84,7 @@ export class generate {
|
|
|
const Y1 = k * X1 + b;
|
|
|
const Y2 = k * X2 + b;
|
|
|
|
|
|
- return [X1, Y1, X2, Y2]
|
|
|
+ return [Number(X1.toFixed(6)), Number(Y1.toFixed(6)), Number(X2.toFixed(6)), Number(Y2.toFixed(6))]
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -132,32 +132,31 @@ export class generate {
|
|
|
if (arr1.length && arr2.length) {
|
|
|
// 排除特殊情况
|
|
|
if (line.dy == 0) { // 线本身是水平的
|
|
|
- if (arr1[1] - arr2[1] == 0) {
|
|
|
+ if (generate.isEqual(arr1[1], arr2[1])) {
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
- [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
]
|
|
|
} else {
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
- [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
]
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (line.dx == 0) { // 线本身是垂直的
|
|
|
- if (arr1[0] - arr2[0] == 0) { // 与另外一组的第一个点的连线是水平的
|
|
|
+ if (generate.isEqual(arr1[0], arr2[0])) { // 与另外一组的第一个点的连线是水平的
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
- [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
]
|
|
|
} else { // 与另外一组的第二个点的连线是竖直的
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
- [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
]
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
// 标准线的斜率
|
|
@@ -178,19 +177,58 @@ export class generate {
|
|
|
// 判断差值小的放一组
|
|
|
if (dk1 < dk2) {
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
- [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
]
|
|
|
} else {
|
|
|
return [
|
|
|
- [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
- [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ [Number(arr1[0].toFixed(6)), Number(arr1[1].toFixed(6)), Number(arr2[2].toFixed(6)), Number(arr2[3].toFixed(6))],
|
|
|
+ [Number(arr1[2].toFixed(6)), Number(arr1[3].toFixed(6)), Number(arr2[0].toFixed(6)), Number(arr2[1].toFixed(6))],
|
|
|
]
|
|
|
}
|
|
|
}
|
|
|
return []
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 删除轮廓线中共线的点
|
|
|
+ *
|
|
|
+ * @description 连续2条线的斜率相等则这3点共线,删除中间的一个点
|
|
|
+ * @param outline 轮廓线数据
|
|
|
+ * @return 简化后的轮廓线数据
|
|
|
+ */
|
|
|
+ static simplyOutline(outline: SPoint[]): SPoint[] {
|
|
|
+ if (outline.length > 2) {
|
|
|
+ for (let i = 1; i < outline.length - 1; i++) {
|
|
|
+ if (outline[i].y - outline[i - 1].y == 0 && outline[i + 1].y - outline[i].y == 0) {
|
|
|
+ outline.splice(i, 1);
|
|
|
+ i--;
|
|
|
+ } else if (outline[i].x - outline[i - 1].x == 0 && outline[i + 1].x - outline[i].x == 0) {
|
|
|
+ outline.splice(i, 1);
|
|
|
+ i--;
|
|
|
+ } else if (
|
|
|
+ outline[i].y - outline[i - 1].y == outline[i + 1].y - outline[i].y &&
|
|
|
+ outline[i].x - outline[i - 1].x == outline[i + 1].x - outline[i].x
|
|
|
+ ) {
|
|
|
+ outline.splice(i, 1);
|
|
|
+ i--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return outline
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解决0.1+0.2!=0.3的问题
|
|
|
+ *
|
|
|
+ * @param a 第一个数
|
|
|
+ * @param b 第二个数
|
|
|
+ * @return 是否相等
|
|
|
+ */
|
|
|
+ static isEqual(a: number, b: number) {
|
|
|
+ return Math.abs(a - b) < Math.pow(2, -52);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
static llll() {
|
|
|
const a = {
|