Browse Source

绘制墙

haojianlong 4 years ago
parent
commit
820788ece7

+ 38 - 14
src/utils/graph/CustomWall.ts

@@ -21,6 +21,8 @@ export class CustomWall extends SGraphStyleItem {
     private maxY = Number.MIN_SAFE_INTEGER;
     /** 折点信息 */
     pointList: SPoint[] = [];
+    /** Z 轴坐标 */
+    Z: number = 0;
     /** 是否绘制完成 */
     _status: SItemStatus = SItemStatus.Normal;
     get status(): SItemStatus {
@@ -515,6 +517,7 @@ export class CustomWall extends SGraphStyleItem {
      * @return 对象储存的相关数据
      */
     toData(): any {
+        this.pointList = generate.simplyOutline(this.pointList)
         if (this.pointList.length == 2) {
             const fGroup = generate.getVertical(this.pointList[0], this.pointList[1], this.data.Width);
             const sGroup = generate.getVertical(this.pointList[1], this.pointList[0], this.data.Width);
@@ -524,37 +527,58 @@ export class CustomWall extends SGraphStyleItem {
                     {
                         X: Number(doubleGroup[0][0].toFixed(2)),
                         Y: -Number(doubleGroup[0][1].toFixed(2)),
-                        Z: 0
+                        Z: this.Z
                     },
                     {
                         X: Number(doubleGroup[0][2].toFixed(2)),
                         Y: -Number(doubleGroup[0][3].toFixed(2)),
-                        Z: 0
+                        Z: this.Z
                     },
                     {
                         X: Number(doubleGroup[1][2].toFixed(2)),
                         Y: -Number(doubleGroup[1][3].toFixed(2)),
-                        Z: 0
+                        Z: this.Z
                     },
                     {
                         X: Number(doubleGroup[1][0].toFixed(2)),
                         Y: -Number(doubleGroup[1][1].toFixed(2)),
-                        Z: 0
+                        Z: this.Z
                     }
                 ]
             ]
         } else if (this.pointList.length > 2) {
-            // const list = this.pointList;
-            // const fGroup = generate.getVertical(list[0], list[1], this.data.Width);
-            // const lGroup = generate.getVertical(list[list.length - 1], list[list.length - 2], this.data.Width);
-            // let outline = [...fGroup];
-            // for (let i = 1; i < list.length - 1; i++) {
-            //     const midGroup = generate.getBisector(list[i - 1], list[i], list[i + 1], this.data.Width);
-            //     console.log(midGroup);
-            //     const midDoubleGroup = generate.generateOrderLine(fGroup, midGroup, this.data.Width);
-            // }
+            const list = this.pointList;
+            let fGroup = generate.getVertical(list[0], list[1], this.data.Width);
+            let lGroup = generate.getVertical(list[list.length - 1], list[list.length - 2], this.data.Width);
+            let array = [], outline1 = [], outline2 = [];
+            outline1.push({ X: fGroup[0], Y: -fGroup[1], Z: this.Z });
+            outline2.push({ X: fGroup[2], Y: -fGroup[3], Z: this.Z });
+            for (let i = 1; i < list.length - 1; i++) {
+                const midGroup = generate.getBisector(list[i - 1], list[i], list[i + 1], this.data.Width);
+                const midDoubleGroup = generate.generateOrderLine(fGroup, midGroup, new SLine(list[i - 1], list[i]));
+                fGroup = [...midGroup]
+                array.push(midDoubleGroup);
+                if (generate.isEqual(midDoubleGroup[0][0], outline1[outline1.length - 1].X) && generate.isEqual(midDoubleGroup[0][1], -outline1[outline1.length - 1].Y)) {
+                    outline1.push({ X: midDoubleGroup[0][2], Y: -midDoubleGroup[0][3], Z: this.Z });
+                    outline2.push({ X: midDoubleGroup[1][2], Y: -midDoubleGroup[1][3], Z: this.Z });
+                } else {
+                    outline1.push({ X: midDoubleGroup[1][2], Y: -midDoubleGroup[1][3], Z: this.Z });
+                    outline2.push({ X: midDoubleGroup[0][2], Y: -midDoubleGroup[0][3], Z: this.Z });
+                }
+            }
+            let temp = generate.generateOrderLine(fGroup, lGroup, new SLine(list[list.length - 2], list[list.length - 1]));
+            array.push(temp)
+            if (generate.isEqual(temp[0][0], outline1[outline1.length - 1].X) && generate.isEqual(temp[0][1], -outline1[outline1.length - 1].Y)) {
+                outline1.push({ X: temp[0][2], Y: -temp[0][3], Z: this.Z });
+                outline2.push({ X: temp[1][2], Y: -temp[1][3], Z: this.Z });
+            } else {
+                outline1.push({ X: temp[1][2], Y: -temp[1][3], Z: this.Z });
+                outline2.push({ X: temp[0][2], Y: -temp[0][3], Z: this.Z });
+            }
+            this.data.OutLine = [
+                outline1.concat(outline2.reverse())
+            ]
         }
-
         return this.data;
     }
 

+ 59 - 21
src/utils/graph/generate.ts

@@ -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 = {

+ 4 - 2
src/views/maintain/space/components/spaceGraph.vue

@@ -37,7 +37,7 @@
                         <el-button type="primary" @click="saveMap">保 存</el-button>
                         <el-button plain @click="cancelGraphy">取 消</el-button>
                     </div>
-                    <!-- 保存墙 -->
+                    <!-- 删除业务空间 -->
                     <div v-if="type==7">
                         <el-button type="primary" @click="deleteRoom">删 除</el-button>
                         <el-button plain @click="cancelGraphy">取 消</el-button>
@@ -418,7 +418,9 @@ export default class spaceGraph extends Vue {
                 this.scene?.initSpaceColor();
                 if (this.type == 3) {
                     console.log(3);
-                } else {
+                } else if (this.type == 6) {
+                    console.log(6)
+                } else  {
                     this.scene?.initZoneColor();
                     this.type = -1;
                     // this.zoneDisable = true;