Ver código fonte

继续绘图

xushiting 2 anos atrás
pai
commit
e2c4e62685
2 arquivos alterados com 141 adições e 66 exclusões
  1. 70 46
      src/graphic/Service/EdgeService.js
  2. 71 20
      src/graphic/Service/RoadService.js

+ 70 - 46
src/graphic/Service/EdgeService.js

@@ -19,54 +19,78 @@ export default class EdgeService {
     return line;
   }
 
-  //计算默认的edge
+  // //计算默认的edge
+  // computerDefaultEdge(roadId) {
+  //   // console.log("开始执行computerDefaultEdge");
+  //   let road = dataService.getRoad(roadId);
+  //   let line = roadService.getMidLine(road);
+
+  //   let lines = mathUtil.getParallelLineForDistance(line, road.width / 2);
+  //   let startPoint = dataService.getPoint(road.startId);
+  //   let endPoint = dataService.getPoint(road.endId);
+
+  //   let leftEdge = dataService.getEdge(road.leftEdgeId);
+  //   let rightEdge = dataService.getEdge(road.rightEdgeId);
+
+  //   let point = null;
+  //   let points = [];
+
+  //   //先计算start部分
+  //   point = startPoint;
+  //   points.push(endPoint);
+  //   points.push(startPoint);
+  //   let point1 = mathUtil.getJoinLinePoint(point, lines.line1);
+  //   let point2 = mathUtil.getJoinLinePoint(point, lines.line2);
+  //   points[2] = point1;
+
+  //   if (mathUtil.isClockwise(points)) {
+  //     mathUtil.clonePoint(rightEdge.start, point1);
+  //     mathUtil.clonePoint(leftEdge.start, point2);
+  //   } else {
+  //     mathUtil.clonePoint(leftEdge.start, point1);
+  //     mathUtil.clonePoint(rightEdge.start, point2);
+  //   }
+
+  //   //再计算end部分
+  //   points = [];
+  //   point = endPoint;
+  //   points.push(startPoint);
+  //   points.push(endPoint);
+  //   point1 = mathUtil.getJoinLinePoint(point, lines.line1);
+  //   point2 = mathUtil.getJoinLinePoint(point, lines.line2);
+  //   points[2] = point1;
+
+  //   if (mathUtil.isClockwise(points)) {
+  //     mathUtil.clonePoint(leftEdge.end, point1);
+  //     mathUtil.clonePoint(rightEdge.end, point2);
+  //   } else {
+  //     mathUtil.clonePoint(rightEdge.end, point1);
+  //     mathUtil.clonePoint(leftEdge.end, point2);
+  //   }
+  // }
+
   computerDefaultEdge(roadId) {
-    // console.log("开始执行computerDefaultEdge");
     let road = dataService.getRoad(roadId);
-    let line = roadService.getMidLine(road);
-
-    let lines = mathUtil.getParallelLineForDistance(line, road.width / 2);
     let startPoint = dataService.getPoint(road.startId);
     let endPoint = dataService.getPoint(road.endId);
-
     let leftEdge = dataService.getEdge(road.leftEdgeId);
     let rightEdge = dataService.getEdge(road.rightEdgeId);
 
-    let point = null;
-    let points = [];
-
-    //先计算start部分
-    point = startPoint;
-    points.push(endPoint);
-    points.push(startPoint);
-    let point1 = mathUtil.getJoinLinePoint(point, lines.line1);
-    let point2 = mathUtil.getJoinLinePoint(point, lines.line2);
-    points[2] = point1;
-
-    if (mathUtil.isClockwise(points)) {
-      mathUtil.clonePoint(rightEdge.start, point1);
-      mathUtil.clonePoint(leftEdge.start, point2);
-    } else {
-      mathUtil.clonePoint(leftEdge.start, point1);
-      mathUtil.clonePoint(rightEdge.start, point2);
-    }
-
-    //再计算end部分
-    points = [];
-    point = endPoint;
-    points.push(startPoint);
-    points.push(endPoint);
-    point1 = mathUtil.getJoinLinePoint(point, lines.line1);
-    point2 = mathUtil.getJoinLinePoint(point, lines.line2);
-    points[2] = point1;
-
-    if (mathUtil.isClockwise(points)) {
-      mathUtil.clonePoint(leftEdge.end, point1);
-      mathUtil.clonePoint(rightEdge.end, point2);
-    } else {
-      mathUtil.clonePoint(rightEdge.end, point1);
-      mathUtil.clonePoint(leftEdge.end, point2);
-    }
+    const line = roadService.getMidLine(road);
+    const leftWidth = mathUtil.getDisForPoinLine(leftEdge.start, line);
+    const rightWidth = mathUtil.getDisForPoinLine(rightEdge.start, line);
+
+    let edgePoints = mathUtil.RectangleVertex(
+      startPoint,
+      endPoint,
+      leftWidth * 2
+    );
+    mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
+    mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
+
+    edgePoints = mathUtil.RectangleVertex(startPoint, endPoint, rightWidth * 2);
+    mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
+    mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
   }
 
   //单独的墙的一端
@@ -797,7 +821,7 @@ export default class EdgeService {
     if (Object.keys(parent).length == 1) {
       dir = roadService.getDirction(pointId, Object.keys(parent)[0]);
       this.updateDefaultEdge(Object.keys(parent)[0], dir);
-      roadService.setLanes(Object.keys(parent)[0], dir);
+      roadService.setLanes(Object.keys(parent)[0]);
       roadService.setMidDivide(Object.keys(parent)[0], dir);
     } else if (Object.keys(parent).length == 2) {
       this.updateEdgeForTwoRoad(Object.keys(parent)[0], Object.keys(parent)[1]);
@@ -844,18 +868,18 @@ export default class EdgeService {
       }
       this.updateSingleEdgeForTwoRoad(startRoadId, endRoadId);
       dir = roadService.getDirction(pointId, startRoadId);
-      roadService.setLanes(startRoadId, dir);
+      roadService.setLanes(startRoadId);
       roadService.setMidDivide(startRoadId, dir);
       dir = roadService.getDirction(pointId, endRoadId);
-      roadService.setLanes(endRoadId, dir);
+      roadService.setLanes(endRoadId);
       roadService.setMidDivide(endRoadId, dir);
 
       this.updateSingleEdgeForTwoRoad(endRoadId, _startRoadId);
       dir = roadService.getDirction(pointId, endRoadId);
-      roadService.setLanes(endRoadId, dir);
+      roadService.setLanes(endRoadId);
       roadService.setMidDivide(endRoadId, dir);
       dir = roadService.getDirction(pointId, _startRoadId);
-      roadService.setLanes(_startRoadId, dir);
+      roadService.setLanes(_startRoadId);
       roadService.setMidDivide(_startRoadId, dir);
     } else {
       console.error(

+ 71 - 20
src/graphic/Service/RoadService.js

@@ -517,7 +517,7 @@ export default class RoadService {
     this.setRoadPointId(roadId, pointId, dir);
     // 第四步更新Edge
     edgeService.updateDefaultEdge(roadId, dir);
-    this.setLanes(roadId, dir);
+    this.setLanes(roadId, null, dir);
     this.setMidDivide(roadId, dir);
   }
 
@@ -861,6 +861,24 @@ export default class RoadService {
           y: startJoin1.y,
         };
       }
+
+      //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
+      for (let i = 0; i < road.leftLanes.length; ++i) {
+        const line = mathUtil.createLine1(
+          road.leftLanes[i].start,
+          road.leftLanes[i].end
+        );
+        const join = mathUtil.getJoinLinePoint(road.midDivide.start, line);
+        mathUtil.clonePoint(road.leftLanes[i].start, join);
+      }
+      for (let i = 0; i < road.rightLanes.length; ++i) {
+        const line = mathUtil.createLine1(
+          road.rightLanes[i].start,
+          road.rightLanes[i].end
+        );
+        const join = mathUtil.getJoinLinePoint(road.midDivide.start, line);
+        mathUtil.clonePoint(road.rightLanes[i].start, join);
+      }
     }
 
     const endJoin1 = mathUtil.getJoinLinePoint(leftEdge.end, line);
@@ -869,16 +887,34 @@ export default class RoadService {
     const distance4 = mathUtil.getDistance(endJoin2, mid);
     if (!dir || dir == "end") {
       if (distance3 > distance4) {
-        road.midDivide.start = {
+        road.midDivide.end = {
           x: endJoin2.x,
           y: endJoin2.y,
         };
       } else {
-        road.midDivide.start = {
+        road.midDivide.end = {
           x: endJoin1.x,
           y: endJoin1.y,
         };
       }
+
+      //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
+      for (let i = 0; i < road.leftLanes.length; ++i) {
+        const line = mathUtil.createLine1(
+          road.leftLanes[i].start,
+          road.leftLanes[i].end
+        );
+        const join = mathUtil.getJoinLinePoint(road.midDivide.end, line);
+        mathUtil.clonePoint(road.leftLanes[i].end, join);
+      }
+      for (let i = 0; i < road.rightLanes.length; ++i) {
+        const line = mathUtil.createLine1(
+          road.rightLanes[i].start,
+          road.rightLanes[i].end
+        );
+        const join = mathUtil.getJoinLinePoint(road.midDivide.end, line);
+        mathUtil.clonePoint(road.rightLanes[i].end, join);
+      }
     }
     this.setMidDivideDisplay(roadId);
   }
@@ -900,7 +936,8 @@ export default class RoadService {
   }
 
   //设置车道
-  setLanes(roadId, dir) {
+  //dir1表示left或者right,dir2表示start或者end
+  setLanes(roadId, dir1, dir2) {
     let road = dataService.getRoad(roadId);
     let startPoint = dataService.getPoint(road.startId);
     let endPoint = dataService.getPoint(road.endId);
@@ -933,32 +970,46 @@ export default class RoadService {
     let rightdy2 = rightEdge.end.y - endPoint.y;
     rightdy2 = rightdy2 / rightCount;
 
-    if (dir == "left" || !dir) {
+    if (dir1 == "left" || !dir1) {
       for (let i = 0; i < leftCount - 1; ++i) {
-        road.leftLanes[i] = {};
+        if (!road.leftLanes[i]) {
+          road.leftLanes[i] = {};
+        }
 
-        road.leftLanes[i].start = {};
-        road.leftLanes[i].start.x = startPoint.x + leftdx1 * (i + 1);
-        road.leftLanes[i].start.y = startPoint.y + leftdy1 * (i + 1);
+        if (dir2 == "start" || !dir2) {
+          road.leftLanes[i].start = {};
+          road.leftLanes[i].start.x = startPoint.x + leftdx1 * (i + 1);
+          road.leftLanes[i].start.y = startPoint.y + leftdy1 * (i + 1);
+        }
 
-        road.leftLanes[i].end = {};
-        road.leftLanes[i].end.x = endPoint.x + leftdx2 * (i + 1);
-        road.leftLanes[i].end.y = endPoint.y + leftdy2 * (i + 1);
+        if (dir2 == "end" || !dir2) {
+          road.leftLanes[i].end = {};
+          road.leftLanes[i].end.x = endPoint.x + leftdx2 * (i + 1);
+          road.leftLanes[i].end.y = endPoint.y + leftdy2 * (i + 1);
+        }
       }
+      road.leftLanes.splice(leftCount - 1);
     }
 
-    if (dir == "right" || !dir) {
+    if (dir1 == "right" || !dir1) {
       for (let i = 0; i < rightCount - 1; ++i) {
-        road.rightLanes[i] = {};
+        if (!road.rightLanes[i]) {
+          road.rightLanes[i] = {};
+        }
 
-        road.rightLanes[i].start = {};
-        road.rightLanes[i].start.x = startPoint.x + rightdx1 * (i + 1);
-        road.rightLanes[i].start.y = startPoint.y + rightdy1 * (i + 1);
+        if (dir2 == "start" || !dir2) {
+          road.rightLanes[i].start = {};
+          road.rightLanes[i].start.x = startPoint.x + rightdx1 * (i + 1);
+          road.rightLanes[i].start.y = startPoint.y + rightdy1 * (i + 1);
+        }
 
-        road.rightLanes[i].end = {};
-        road.rightLanes[i].end.x = endPoint.x + rightdx2 * (i + 1);
-        road.rightLanes[i].end.y = endPoint.y + rightdy2 * (i + 1);
+        if (dir2 == "end" || !dir2) {
+          road.rightLanes[i].end = {};
+          road.rightLanes[i].end.x = endPoint.x + rightdx2 * (i + 1);
+          road.rightLanes[i].end.y = endPoint.y + rightdy2 * (i + 1);
+        }
       }
+      road.rightLanes.splice(rightCount - 1);
     }
   }