|
@@ -1,4 +1,4 @@
|
|
|
-import { SPoint } from "@persagy-web/draw/lib";
|
|
|
+import { SLine, SPoint } from "@persagy-web/draw/lib";
|
|
|
|
|
|
import { intersect, polygon, segments, combine, selectUnion, selectDifference, selectDifferenceRev } from "polybooljs";
|
|
|
|
|
@@ -45,11 +45,11 @@ export class generate {
|
|
|
const Y1 = k * X1 + b;
|
|
|
const Y2 = k * X2 + b;
|
|
|
|
|
|
- return [Number(X1.toFixed(2)), Number(Y1.toFixed(2)), Number(X2.toFixed(2)), Number(Y2.toFixed(2))]
|
|
|
+ return [X1, Y1, X2, Y2]
|
|
|
}
|
|
|
|
|
|
|
|
|
- * 计算一条线的垂线上距离线l的2个点
|
|
|
+ * 计算一条线的过p1垂线上距离线l的2个点
|
|
|
*
|
|
|
* @param p1 点1
|
|
|
* @param p2 点2
|
|
@@ -60,6 +60,14 @@ export class generate {
|
|
|
const dy1 = p1.y - p2.y;
|
|
|
const dx1 = p1.x - p2.x;
|
|
|
|
|
|
+ if (dy1 == 0) {
|
|
|
+ return [p1.x, p1.y - l, p1.x, p1.y + l]
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dx1 == 0) {
|
|
|
+ return [p1.x - l, p1.y, p1.x + l, p1.y]
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
const k1 = dy1 / dx1;
|
|
|
|
|
@@ -76,7 +84,7 @@ export class generate {
|
|
|
const Y1 = k * X1 + b;
|
|
|
const Y2 = k * X2 + b;
|
|
|
|
|
|
- return [Number(X1.toFixed(2)), Number(Y1.toFixed(2)), Number(X2.toFixed(2)), Number(Y2.toFixed(2))]
|
|
|
+ return [X1, Y1, X2, Y2]
|
|
|
}
|
|
|
|
|
|
|
|
@@ -113,12 +121,75 @@ export class generate {
|
|
|
|
|
|
* 一条线生成的4个点,根据这4个点和这条线,将轮廓线排序
|
|
|
*
|
|
|
+ * @description 计算3条线的斜率,差值小的一组
|
|
|
+ *
|
|
|
* @param [number, number, number, number]
|
|
|
* @param [number, number, number, number]
|
|
|
* @param SLine
|
|
|
- * @return 轮廓线数据
|
|
|
+ * @return 两组线的数组
|
|
|
*/
|
|
|
+ static generateOrderLine(arr1: [number, number, number, number], arr2: [number, number, number, number], line: SLine) {
|
|
|
+ if (arr1.length && arr2.length) {
|
|
|
+
|
|
|
+ if (line.dy == 0) {
|
|
|
+ if (arr1[1] - arr2[1] == 0) {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
+ [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ ]
|
|
|
+ } else {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
+ [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ if (line.dx == 0) {
|
|
|
+ if (arr1[0] - arr2[0] == 0) {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
+ [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ ]
|
|
|
+ } else {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
+ [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ ]
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ const k = line.dy / line.dx;
|
|
|
+
|
|
|
+ const l1 = new SLine(arr1[0], arr1[1], arr2[0], arr2[1]);
|
|
|
+
|
|
|
+ const k1 = l1.dy / l1.dx;
|
|
|
+
|
|
|
+ const dk1 = Math.abs(k1 - k);
|
|
|
+
|
|
|
+ const l2 = new SLine(arr1[0], arr1[1], arr2[2], arr2[3]);
|
|
|
+
|
|
|
+ const k2 = l2.dy / l2.dx;
|
|
|
+
|
|
|
+ const dk2 = Math.abs(k2 - k);
|
|
|
+
|
|
|
+
|
|
|
+ if (dk1 < dk2) {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[0], arr2[1]],
|
|
|
+ [arr1[2], arr1[3], arr2[2], arr2[3]],
|
|
|
+ ]
|
|
|
+ } else {
|
|
|
+ return [
|
|
|
+ [arr1[0], arr1[1], arr2[2], arr2[3]],
|
|
|
+ [arr1[2], arr1[3], arr2[0], arr2[1]],
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return []
|
|
|
+ }
|
|
|
|
|
|
|
|
|
static llll() {
|