xushiting %!s(int64=2) %!d(string=hai) anos
pai
achega
5d1a3029c0

+ 7 - 1
src/graphic/Geometry/CurveRoad.js

@@ -13,7 +13,13 @@ export default class CurveRoad extends Road {
     this.rightDrivewayCount = Setting.curveRoadRightDrivewayCount; //右边的车道个数
     this.leftWidth = Setting.leftCurveRoadWidth;
     this.rightWidth = Setting.rightCurveRoadWidth;
-    this.midDivideWidth = Setting.curveRoadMidDivideWidth;
+    this.midDivide = {
+      leftMidDivide: [],
+      leftMidDivideCurves: [],
+      rightMidDivide: [],
+      rightMidDivideCurves: [],
+      midDivideWidth: Setting.curveRoadMidDivideWidth,
+    };
     this.curves = [];
     this.singleCurveRoadWidth = Setting.singleCurveRoadWidth;
     this.singleCurveRoadDrivewayCount = Setting.singleCurveRoadDrivewayCount;

+ 8 - 2
src/graphic/Geometry/Road.js

@@ -13,8 +13,14 @@ export default class Road extends Geometry {
     this.leftLanes = []; //二维数组。第一维表示第几个车道,第二维是一组点
     this.rightLanes = [];
     this.singleLanes = []; //单向车道
-    this.midDivide = null; //道路中间隔离栏 ,起点和终点与startId和endId方向一致。但是坐标有区别。因为隔离栏要比start-end短一些
-    this.midDivideWidth = Setting.roadMidDivideWidth; //单向车道没有中间栏
+    //道路中间隔离栏 ,起点和终点与startId和endId方向一致。但是坐标有区别。因为隔离栏要比start-end短一些
+    //单向车道没有中间栏
+    this.midDivide = {
+      leftMidDivide: null,
+      rightMidDivide: null,
+      midDivideWidth: Setting.roadMidDivideWidth,
+    };
+
     this.leftDrivewayCount = Setting.roadLeftDrivewayCount; //左边的车道个数
     this.rightDrivewayCount = Setting.roadRightDrivewayCount; //右边的车道个数
     this.geoType = VectorType.Road;

+ 23 - 19
src/graphic/Service/CurveRoadService.js

@@ -34,7 +34,9 @@ export default class CurveRoadService extends RoadService {
       edgePoints = mathUtil.RectangleVertex(
         startPoint,
         endPoint,
-        curveRoad.leftWidth + curveRoad.rightWidth + curveRoad.midDivideWidth
+        curveRoad.leftWidth +
+          curveRoad.rightWidth +
+          curveRoad.midDivide.midDivideWidth
       );
     }
 
@@ -256,7 +258,7 @@ export default class CurveRoadService extends RoadService {
           }
           const leftRatio =
             curveRoad.leftWidth /
-            (curveRoad.leftWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
           const leftdx =
             ((leftEdgePoints[j].x - points[j].x) * leftRatio) / leftCount;
           const leftdy =
@@ -279,7 +281,7 @@ export default class CurveRoadService extends RoadService {
         for (let j = 0; j < points.length; ++j) {
           const leftRatio =
             curveRoad.leftWidth /
-            (curveRoad.leftWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
           const middx = (leftEdgePoints[j].x - points[j].x) * (1 - leftRatio);
           const middy = (leftEdgePoints[j].y - points[j].y) * (1 - leftRatio);
           leftMidDivide[j] = {};
@@ -303,7 +305,7 @@ export default class CurveRoadService extends RoadService {
           }
           const rightRatio =
             curveRoad.rightWidth /
-            (curveRoad.rightWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
           const rightdx =
             ((rightEdgePoints[j].x - points[j].x) * rightRatio) / rightCount;
           const rightdy =
@@ -325,7 +327,7 @@ export default class CurveRoadService extends RoadService {
         for (let j = 0; j < points.length; ++j) {
           const rightRatio =
             curveRoad.rightWidth /
-            (curveRoad.rightWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
           const middx = (rightEdgePoints[j].x - points[j].x) * (1 - rightRatio);
           const middy = (rightEdgePoints[j].y - points[j].y) * (1 - rightRatio);
           rightMidDivide[j] = {};
@@ -370,7 +372,7 @@ export default class CurveRoadService extends RoadService {
         lanes = curveRoad.leftLanes;
         ratio =
           curveRoad.leftWidth /
-          (curveRoad.leftWidth + curveRoad.midDivideWidth / 2);
+          (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
       } else if (dir == "right") {
         curveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
         oldCount = curveRoad.rightDrivewayCount;
@@ -378,7 +380,7 @@ export default class CurveRoadService extends RoadService {
         lanes = curveRoad.rightLanes;
         ratio =
           curveRoad.rightWidth /
-          (curveRoad.rightWidth + curveRoad.midDivideWidth / 2);
+          (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
       }
     }
 
@@ -419,12 +421,12 @@ export default class CurveRoadService extends RoadService {
       if (dir == "left") {
         const leftWidth =
           mathUtil.getDisForPoinLine(leftCurveEdge.start, line) -
-          curveRoad.midDivideWidth / 2;
+          curveRoad.midDivide.midDivideWidth / 2;
         curveRoad.setWidth(leftWidth, "left");
       } else if (dir == "right") {
         const rightWidth =
           mathUtil.getDisForPoinLine(rightCurveEdge.start, line) -
-          curveRoad.midDivideWidth / 2;
+          curveRoad.midDivide.midDivideWidth / 2;
         curveRoad.setWidth(rightWidth, "right");
       }
     } else if (curveRoad.way == Constant.oneWay) {
@@ -510,8 +512,8 @@ export default class CurveRoadService extends RoadService {
     if (curveRoad.way == Constant.oneWay) {
       edgePoints = mathUtil.getOffset(
         curveRoad.points,
-        curveRoad.leftWidth + curveRoad.midDivideWidth / 2,
-        curveRoad.rightWidth + curveRoad.midDivideWidth / 2
+        curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2,
+        curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2
       );
     } else if (curveRoad.way == Constant.twoWay) {
       const line = mathUtil.createLine1(
@@ -551,12 +553,12 @@ export default class CurveRoadService extends RoadService {
     //需要考虑中间带
     if (dir == "left") {
       ratio =
-        (newWidth + curveRoad.midDivideWidth / 2) /
-        (curveRoad.leftWidth + curveRoad.midDivideWidth / 2);
+        (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
+        (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
     } else if (dir == "right") {
       ratio =
-        (newWidth + curveRoad.midDivideWidth / 2) /
-        (curveRoad.rightWidth + curveRoad.midDivideWidth / 2);
+        (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
+        (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
     } else {
       if (curveRoad.way == Constant.oneWay) {
         ratio = newWidth / curveRoad.singleRoadWidth;
@@ -587,16 +589,18 @@ export default class CurveRoadService extends RoadService {
         } else if (curveRoad.way == Constant.twoWay) {
           ratio = newWidth / (curveRoad.leftWidth + curveRoad.rightWidth);
           ratio =
-            (curveRoad.leftWidth * ratio + curveRoad.midDivideWidth / 2) /
-            (curveRoad.leftWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.leftWidth * ratio +
+              curveRoad.midDivide.midDivideWidth / 2) /
+            (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
           dx = (leftCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
           leftCurveEdge.points[i].x = curveRoad.points[i].x + dx;
           dy = (leftCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
           leftCurveEdge.points[i].y = curveRoad.points[i].y + dy;
           ratio = newWidth / (curveRoad.leftWidth + curveRoad.rightWidth);
           ratio =
-            (curveRoad.rightWidth * ratio + curveRoad.midDivideWidth / 2) /
-            (curveRoad.rightWidth + curveRoad.midDivideWidth / 2);
+            (curveRoad.rightWidth * ratio +
+              curveRoad.midDivide.midDivideWidth / 2) /
+            (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
           dx = (rightCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
           rightCurveEdge.points[i].x = curveRoad.points[i].x + dx;
           dy = (rightCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;

+ 14 - 11
src/graphic/Service/RoadService.js

@@ -30,7 +30,7 @@ export default class RoadService {
       edgePoints = mathUtil.RectangleVertex(
         startPoint,
         endPoint,
-        road.leftWidth + road.rightWidth + road.midDivideWidth
+        road.leftWidth + road.rightWidth + road.midDivide.midDivideWidth
       );
     }
     let leftEdge = edgeService.create(
@@ -1034,9 +1034,9 @@ export default class RoadService {
     const leftCount = road.leftDrivewayCount;
     const rightCount = road.rightDrivewayCount;
     const leftRatio =
-      road.leftWidth / (road.leftWidth + road.midDivideWidth / 2);
+      road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
     const rightRatio =
-      road.rightWidth / (road.rightWidth + road.midDivideWidth / 2);
+      road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
 
     let leftdx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / leftCount;
     let leftdy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / leftCount;
@@ -1173,9 +1173,10 @@ export default class RoadService {
     let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
 
     if (road.way == Constant.twoWay) {
-      leftRatio = road.leftWidth / (road.leftWidth + road.midDivideWidth / 2);
+      leftRatio =
+        road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
       rightRatio =
-        road.rightWidth / (road.rightWidth + road.midDivideWidth / 2);
+        road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
       if (dir == "left") {
         oldCount = road.leftDrivewayCount;
         if (oldCount != 0) {
@@ -1242,13 +1243,15 @@ export default class RoadService {
       if (dir == "left") {
         let join = mathUtil.getJoinLinePoint(leftEdge.start, line);
         road.setWidth(
-          mathUtil.getDistance(leftEdge.start, join) - road.midDivideWidth / 2,
+          mathUtil.getDistance(leftEdge.start, join) -
+            road.midDivide.midDivideWidth / 2,
           dir
         );
       } else if (dir == "right") {
         let join = mathUtil.getJoinLinePoint(rightEdge.start, line);
         road.setWidth(
-          mathUtil.getDistance(rightEdge.start, join) - road.midDivideWidth / 2,
+          mathUtil.getDistance(rightEdge.start, join) -
+            road.midDivide.midDivideWidth / 2,
           dir
         );
       }
@@ -1318,7 +1321,7 @@ export default class RoadService {
         edgePoints = mathUtil.RectangleVertex(
           startPoint,
           endPoint,
-          newWidth + road.midDivideWidth / 2
+          newWidth + road.midDivide.midDivideWidth / 2
         );
         mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
         mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
@@ -1327,7 +1330,7 @@ export default class RoadService {
         edgePoints = mathUtil.RectangleVertex(
           startPoint,
           endPoint,
-          newWidth + road.midDivideWidth / 2
+          newWidth + road.midDivide.midDivideWidth / 2
         );
         mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
         mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
@@ -1339,7 +1342,7 @@ export default class RoadService {
           startPoint,
           endPoint,
           (newWidth * road.leftWidth) / (road.leftWidth + road.rightWidth) +
-            road.midDivideWidth / 2
+            road.midDivide.midDivideWidth / 2
         );
         mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
         mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
@@ -1351,7 +1354,7 @@ export default class RoadService {
           startPoint,
           endPoint,
           (newWidth * road.rightWidth) / (road.leftWidth + road.rightWidth) +
-            road.midDivideWidth / 2
+            road.midDivide.midDivideWidth / 2
         );
         mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
         mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);