|
@@ -22,6 +22,9 @@ import { SLine, SPoint, SRect } from "@saga-web/draw/lib";
|
|
|
import { MinDis } from "../types/MinDis";
|
|
|
import { Point } from "../types/Point";
|
|
|
import { PointToLine } from "../types/PointToLine";
|
|
|
+import { Outline } from "../types/Outline";
|
|
|
+// @ts-ignore
|
|
|
+import { intersect } from "polybooljs";
|
|
|
|
|
|
export class SMathUtil {
|
|
|
/**
|
|
@@ -221,4 +224,74 @@ export class SMathUtil {
|
|
|
});
|
|
|
return Arr;
|
|
|
} // Function transferToSPoint()
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算数组中每一项的交集,并返回外轮廓与内轮廓
|
|
|
+ *
|
|
|
+ */
|
|
|
+ static getIntersectInArray(array: number[][][]): Outline[] {
|
|
|
+ let outlineList: Outline[] = [];
|
|
|
+ if (!array.length) {
|
|
|
+ // 无数据不做处理
|
|
|
+ } else if (array.length == 1) {
|
|
|
+ // 只有一条则为外轮廓
|
|
|
+ let outline: Outline = {
|
|
|
+ Outer: [],
|
|
|
+ Inner: []
|
|
|
+ };
|
|
|
+ outline.Outer = array[0].map(t => {
|
|
|
+ return new SPoint(t[0], t[1]);
|
|
|
+ });
|
|
|
+ outlineList.push(outline);
|
|
|
+ } else {
|
|
|
+ // 多条的时候,最后一条未外轮廓,倒序遍历与之相交的为内轮廓,不相交为另外的外轮廓
|
|
|
+ let poly2 = {
|
|
|
+ regions: [],
|
|
|
+ inverted: false
|
|
|
+ };
|
|
|
+ // @ts-ignore
|
|
|
+ poly2.regions.push(array[array.length - 1]);
|
|
|
+ let indexArr: number[] = [array.length - 1];
|
|
|
+ for (let i = array.length - 2; i > 0; i--) {
|
|
|
+ let poly1 = {
|
|
|
+ regions: [],
|
|
|
+ inverted: false
|
|
|
+ };
|
|
|
+ // @ts-ignore
|
|
|
+ poly1.regions.push(array[i]);
|
|
|
+ let intersectObj = intersect(poly1, poly2);
|
|
|
+ console.log(intersectObj);
|
|
|
+ if (!intersectObj.regions.length) {
|
|
|
+ indexArr.unshift(i);
|
|
|
+ poly2.regions = [];
|
|
|
+ // @ts-ignore
|
|
|
+ poly2.regions.push(array[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ indexArr.unshift(0);
|
|
|
+ console.log(indexArr);
|
|
|
+ for (let i = 0; i < indexArr.length - 1; i++) {
|
|
|
+ let axArr = array.slice(
|
|
|
+ i == 0 ? 0 : indexArr[i] + 1,
|
|
|
+ indexArr[i + 1]
|
|
|
+ );
|
|
|
+ let outline: Outline = {
|
|
|
+ Outer: [],
|
|
|
+ Inner: []
|
|
|
+ };
|
|
|
+ outline.Outer = array[indexArr[i + 1]].map(t => {
|
|
|
+ return new SPoint(t[0], t[1]);
|
|
|
+ });
|
|
|
+ outline.Inner = axArr.map(t => {
|
|
|
+ let temp = t.map(item => {
|
|
|
+ return new SPoint(item[0], item[1]);
|
|
|
+ });
|
|
|
+ return temp;
|
|
|
+ });
|
|
|
+ outlineList.push(outline);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ console.log(outlineList);
|
|
|
+ return outlineList;
|
|
|
+ } // Function getIntersectInArray()
|
|
|
} // Class SMathUtil
|