xushiting пре 2 година
родитељ
комит
05bf68249d

+ 1 - 0
src/graphic/Controls/AddRoad.js

@@ -323,6 +323,7 @@ export default class AddRoad {
     const end = curveRoadPointService.create(this.endInfo.position);
     curveRoadService.create(start.vectorId, end.vectorId);
     listenLayer.clear();
+    this.clear();
   }
   /******************************************************************************************************************************************************************************/
   clear() {

+ 60 - 0
src/graphic/Geometry/ControlPoint.js

@@ -1,3 +1,6 @@
+import Constant from "../Constant.js";
+import { dataService } from "../Service/DataService.js";
+import { mathUtil } from "../Util/MathUtil.js";
 import VectorType from "../enum/VectorType.js";
 import Geometry from "./Geometry";
 
@@ -25,6 +28,8 @@ export default class ControlPoint extends Geometry {
       dir: null,
     };
 
+    this.extremePoint = null; //极值
+    this.curves = [];
     this.geoType = VectorType.ControlPoint;
     this.setId(vectorId);
 
@@ -36,6 +41,61 @@ export default class ControlPoint extends Geometry {
     this.y = position.y;
   }
 
+  setExtremePoint() {
+    let points = [];
+    let edge1 = dataService.getRoadEdge(this.edgeInfo1.id);
+    if (this.edgeInfo1.dir == "start") {
+      points[0] = edge1.start;
+    } else if (this.edgeInfo1.dir == "end") {
+      points[0] = edge1.end;
+    }
+    points[1] = {
+      x: this.x,
+      y: this.y,
+    };
+    let edge2 = dataService.getRoadEdge(this.edgeInfo2.id);
+    if (this.edgeInfo2.dir == "start") {
+      points[2] = edge2.start;
+    } else if (this.edgeInfo2.dir == "end") {
+      points[2] = edge2.end;
+    }
+    let curves = mathUtil.getCurvesByPoints(points);
+    let joinInfo = mathUtil.getHitInfoForCurves(
+      points[1],
+      curves,
+      Constant.defaultRoadWidth
+    );
+    this.extremePoint = {};
+    mathUtil.clonePoint(this.extremePoint, joinInfo.position);
+    this.curves = mathUtil.getCurvesByPoints([
+      points[0],
+      this.extremePoint,
+      points[2],
+    ]);
+  }
+
+  setCurves() {
+    let points = [];
+    let edge1 = dataService.getRoadEdge(this.edgeInfo1.id);
+    if (this.edgeInfo1.dir == "start") {
+      points[0] = edge1.start;
+    } else if (this.edgeInfo1.dir == "end") {
+      points[0] = edge1.end;
+    }
+    points[1] = {
+      x: this.x,
+      y: this.y,
+    };
+    let edge2 = dataService.getRoadEdge(this.edgeInfo2.id);
+    if (this.edgeInfo2.dir == "start") {
+      points[2] = edge2.start;
+    } else if (this.edgeInfo2.dir == "end") {
+      points[2] = edge2.end;
+    }
+    points[1] = this.extremePoint;
+    this.curves = mathUtil.getCurvesByPoints(points);
+  }
+
   setEdgeInfo(edgeId1, dir1, edgeId2, dir2) {
     this.edgeInfo1.id = edgeId1;
     this.edgeInfo1.dir = dir1;

+ 0 - 4
src/graphic/Layer.js

@@ -586,7 +586,6 @@ export default class Layer {
         needAutoRedraw = true;
         if (addRoad.canAdd) {
           addRoad.buildRoad();
-          addRoad.clear();
           this.history.save();
           elementService.hideAll();
         }
@@ -594,14 +593,12 @@ export default class Layer {
       case LayerEvents.AddingLine:
         needAutoRedraw = true;
         addLine.buildLine();
-        addLine.clear();
         this.history.save();
         elementService.hideAll();
         break;
       case LayerEvents.AddingCircle:
         needAutoRedraw = true;
         addCircle.buildCircle();
-        addCircle.clear();
         this.history.save();
         elementService.hideAll();
         break;
@@ -612,7 +609,6 @@ export default class Layer {
         needAutoRedraw = true;
         if (addRoad.canAdd) {
           addRoad.buildCurveRoad();
-          addRoad.clear();
           this.history.save();
           elementService.hideAll();
         }

+ 3 - 37
src/graphic/Service/ControlPointService.js

@@ -54,6 +54,7 @@ export default class ControlPointService {
     }
     edge1.setPosition(position1, dir1);
     edge2.setPosition(position2, dir2);
+    controlPoint.setExtremePoint();
   }
 
   //newleft,end------------road.leftEdgeId,end
@@ -72,42 +73,6 @@ export default class ControlPointService {
     }
     dataService.addControlPoint(controlPoint);
   }
-  //position在直线edge.start,edge.end上
-  // isPointOnEdgeRay(edge, dir, position) {
-  //   let point1, point2;
-  //   if (dir == "start") {
-  //     point1 = edge.start;
-  //     point2 = edge.end;
-  //   } else if (dir == "end") {
-  //     point1 = edge.end;
-  //     point2 = edge.start;
-  //   }
-
-  //   let v1 = {
-  //     x: position.x - point1.x,
-  //     y: position.y - point1.y,
-  //   };
-
-  //   let v2 = {
-  //     x: point2.x - point1.x,
-  //     y: point2.y - point1.y,
-  //   };
-
-  //   let v = {
-  //     x: v1.x + v2.x,
-  //     y: v1.y + v2.y,
-  //   };
-
-  //   let d = mathUtil.getDistance(v, { x: 0, y: 0 });
-  //   let d1 = mathUtil.getDistance(position, point1);
-  //   let d2 = mathUtil.getDistance(point2, point1);
-
-  //   if (Math.abs(d - d1 - d2) < 0.01) {
-  //     return true;
-  //   } else {
-  //     return false;
-  //   }
-  // }
 
   //角度小,road宽的时候,可能edge顺序会倒,但是road的顺序不会
   isPointOnEdgeRay(edge, dir, position) {
@@ -154,7 +119,8 @@ export default class ControlPointService {
 
   updateForMovePoint(controlPointId, newPosition) {
     let controlPoint = dataService.getControlPoint2(controlPointId);
-    mathUtil.clonePoint(controlPoint, newPosition);
+    mathUtil.clonePoint(controlPoint.extremePoint, newPosition);
+    controlPoint.setCurves();
   }
 }
 

+ 0 - 3
src/graphic/Service/CurveEdgeService.js

@@ -1,8 +1,5 @@
 import CurveRoadEdge from "../Geometry/CurveRoadEdge.js";
-import Constant from "../Constant.js";
 import { dataService } from "./DataService.js";
-import { roadService } from "./RoadService.js";
-import { controlPointService } from "./ControlPointService.js";
 import { mathUtil } from "../Util/MathUtil.js";
 
 export default class CurveEdgeService {

+ 6 - 8
src/graphic/Service/CurveRoadService.js

@@ -512,17 +512,15 @@ export default class CurveRoadService extends RoadService {
     if (curveRoad.way == Constant.oneWay) {
       edgePoints = mathUtil.getOffset(
         curveRoad.points,
-        curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2,
-        curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2
+        curveRoad.leftWidth,
+        curveRoad.rightWidth
       );
     } else if (curveRoad.way == Constant.twoWay) {
-      const line = mathUtil.createLine1(
-        curveRoad.points[0],
-        curveRoad.points[1]
+      edgePoints = mathUtil.getOffset(
+        curveRoad.points,
+        curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2,
+        curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2
       );
-      const leftWidth = mathUtil.getDisForPoinLine(leftCurveEdge.start, line);
-      const rightWidth = mathUtil.getDisForPoinLine(rightCurveEdge.start, line);
-      edgePoints = mathUtil.getOffset(curveRoad.points, leftWidth, rightWidth);
     }
 
     leftCurveEdge.points = edgePoints.leftEdgePoints;

+ 28 - 11
src/graphic/Service/EdgeService.js

@@ -25,20 +25,37 @@ export default class EdgeService {
     let endPoint = dataService.getRoadPoint(road.endId);
     let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
     let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
-
-    let edgePoints = mathUtil.RectangleVertex(
-      startPoint,
-      endPoint,
-      road.leftWidth * 2
-    );
+    let edgePoints;
+    if (road.way == Constant.oneWay) {
+      edgePoints = mathUtil.RectangleVertex(
+        startPoint,
+        endPoint,
+        road.leftWidth * 2
+      );
+    } else {
+      edgePoints = mathUtil.RectangleVertex(
+        startPoint,
+        endPoint,
+        road.leftWidth * 2 + road.midDivide.midDivideWidth
+      );
+    }
     mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
     mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
 
-    edgePoints = mathUtil.RectangleVertex(
-      startPoint,
-      endPoint,
-      road.rightWidth * 2
-    );
+    if (road.way == Constant.oneWay) {
+      edgePoints = mathUtil.RectangleVertex(
+        startPoint,
+        endPoint,
+        road.rightWidth * 2
+      );
+    } else {
+      edgePoints = mathUtil.RectangleVertex(
+        startPoint,
+        endPoint,
+        road.rightWidth * 2 + road.midDivide.midDivideWidth
+      );
+    }
+
     mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
     mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
   }

+ 2 - 0
src/graphic/Service/RoadService.js

@@ -145,6 +145,7 @@ export default class RoadService {
         mathUtil.clonePoint(leftEdge.start, oldLeftEdgeStartPoint);
         mathUtil.clonePoint(rightEdge.start, oldRightEdgeStartPoint);
       }
+      cpt.setExtremePoint();
     } else if (dir == "end") {
       let cpt = dataService.getControlPointForEdgeId(road.leftEdgeId, "start");
       controlPointService.replaceEdgeId(
@@ -170,6 +171,7 @@ export default class RoadService {
         mathUtil.clonePoint(leftEdge.end, oldLeftEdgeEndPoint);
         mathUtil.clonePoint(rightEdge.end, oldRightEdgeEndPoint);
       }
+      cpt.setExtremePoint();
     }
 
     return newRoad.vectorId;