|
@@ -41,6 +41,7 @@ export default class RoadService {
|
|
|
rightEdge.setEdgeParent(road.vectorId);
|
|
|
}
|
|
|
|
|
|
+ this.setLanes(road.vectorId);
|
|
|
return road;
|
|
|
}
|
|
|
|
|
@@ -876,27 +877,196 @@ export default class RoadService {
|
|
|
//中心线添加控制点
|
|
|
insert(roadId, cp) {}
|
|
|
|
|
|
- updateDrivewayCount(roadId, dir, type) {
|
|
|
+ // updateDrivewayCount(roadId, dir, type) {
|
|
|
+ // let road = dataService.getRoad(roadId);
|
|
|
+ // if (dir == "left") {
|
|
|
+ // if (type == "add") {
|
|
|
+ // ++road.leftDrivewayCount;
|
|
|
+ // } else if (type == "sub") {
|
|
|
+ // --road.leftDrivewayCount;
|
|
|
+ // if (road.leftDrivewayCount < 0) {
|
|
|
+ // road.leftDrivewayCount = 0;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // } else if (dir == "right") {
|
|
|
+ // if (type == "add") {
|
|
|
+ // ++road.rightDrivewayCount;
|
|
|
+ // } else if (type == "sub") {
|
|
|
+ // --road.rightDrivewayCount;
|
|
|
+ // if (road.rightDrivewayCount < 0) {
|
|
|
+ // road.rightDrivewayCount = 0;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ //设置车道
|
|
|
+ setLanes(roadId) {
|
|
|
let road = dataService.getRoad(roadId);
|
|
|
+ let startPoint = dataService.getPoint(road.startId);
|
|
|
+ let endPoint = dataService.getPoint(road.endId);
|
|
|
+ let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+ const leftCount = road.leftDrivewayCount;
|
|
|
+ const rightCount = road.rightDrivewayCount;
|
|
|
+
|
|
|
+ let midPoint = {
|
|
|
+ x: (startPoint.x + endPoint.x) / 2,
|
|
|
+ y: (startPoint.y + endPoint.y) / 2,
|
|
|
+ };
|
|
|
+ let line = this.getMidLine(road);
|
|
|
+ let point1 = mathUtil.getJoinLinePoint(leftEdge.start, line);
|
|
|
+ let _point1 = mathUtil.getJoinLinePoint(rightEdge.start, line);
|
|
|
+ if (
|
|
|
+ mathUtil.getDistance(point1, midPoint) >
|
|
|
+ mathUtil.getDistance(_point1, midPoint)
|
|
|
+ ) {
|
|
|
+ point1 = _point1;
|
|
|
+ }
|
|
|
+
|
|
|
+ let point2 = mathUtil.getJoinLinePoint(leftEdge.end, line);
|
|
|
+ let _point2 = mathUtil.getJoinLinePoint(rightEdge.end, line);
|
|
|
+ if (
|
|
|
+ mathUtil.getDistance(point2, midPoint) >
|
|
|
+ mathUtil.getDistance(_point2, midPoint)
|
|
|
+ ) {
|
|
|
+ point2 = _point2;
|
|
|
+ }
|
|
|
+
|
|
|
+ road.midDivide = {
|
|
|
+ start: point1,
|
|
|
+ end: point2,
|
|
|
+ display: true,
|
|
|
+ };
|
|
|
+
|
|
|
+ let leftdx1 = leftEdge.start.x - point1.x;
|
|
|
+ leftdx1 = leftdx1 / leftCount;
|
|
|
+
|
|
|
+ let leftdy1 = leftEdge.start.y - point1.y;
|
|
|
+ leftdy1 = leftdy1 / leftCount;
|
|
|
+
|
|
|
+ let leftdx2 = leftEdge.end.x - point2.x;
|
|
|
+ leftdx2 = leftdx2 / leftCount;
|
|
|
+
|
|
|
+ let leftdy2 = leftEdge.end.y - point2.y;
|
|
|
+ leftdy2 = leftdy2 / leftCount;
|
|
|
+
|
|
|
+ let rightdx1 = rightEdge.start.x - point1.x;
|
|
|
+ rightdx1 = rightdx1 / rightCount;
|
|
|
+
|
|
|
+ let rightdy1 = rightEdge.start.y - point1.y;
|
|
|
+ rightdy1 = rightdy1 / rightCount;
|
|
|
+
|
|
|
+ let rightdx2 = rightEdge.end.x - point2.x;
|
|
|
+ rightdx2 = rightdx2 / rightCount;
|
|
|
+
|
|
|
+ let rightdy2 = rightEdge.end.y - point2.y;
|
|
|
+ rightdy2 = rightdy2 / rightCount;
|
|
|
+
|
|
|
+ for (let i = 1; i < leftCount; ++i) {
|
|
|
+ road.leftLanes[i] = {};
|
|
|
+ road.leftLanes[i].start = {};
|
|
|
+ road.leftLanes[i].start.x = point1.x + leftdx1 * i;
|
|
|
+ road.leftLanes[i].start.y = point1.y + leftdy1 * i;
|
|
|
+
|
|
|
+ road.leftLanes[i].end = {};
|
|
|
+ road.leftLanes[i].end.x = point2.x + leftdx2 * i;
|
|
|
+ road.leftLanes[i].end.y = point2.y + leftdy2 * i;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let i = 1; i < rightCount; ++i) {
|
|
|
+ road.rightLanes[i] = {};
|
|
|
+ road.rightLanes[i].start = {};
|
|
|
+ road.rightLanes[i].start.x = point1.x + leftdx1 * i;
|
|
|
+ road.rightLanes[i].start.y = point1.y + leftdy1 * i;
|
|
|
+
|
|
|
+ road.rightLanes[i].end = {};
|
|
|
+ road.rightLanes[i].end.x = point2.x + leftdx2 * i;
|
|
|
+ road.rightLanes[i].end.y = point2.y + leftdy2 * i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //删除或者减少车道
|
|
|
+ //需要考虑车道个数是0(左或者右)的情况
|
|
|
+ updateForAddSubtractLanesCount(roadId, newCount, dir) {
|
|
|
+ let dx1, dy1, dx2, dy2, oldCount, lanes, edgeStartPosition, edgeEndPosition;
|
|
|
+ let road = dataService.getRoad(roadId);
|
|
|
+ if (newCount == 0) {
|
|
|
+ road.midDivide.display = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+
|
|
|
if (dir == "left") {
|
|
|
- if (type == "add") {
|
|
|
- ++road.leftDrivewayCount;
|
|
|
- } else if (type == "sub") {
|
|
|
- --road.leftDrivewayCount;
|
|
|
- if (road.leftDrivewayCount < 0) {
|
|
|
- road.leftDrivewayCount = 0;
|
|
|
- }
|
|
|
+ oldCount = road.leftDrivewayCount;
|
|
|
+ if (oldCount != 0) {
|
|
|
+ dx1 = leftEdge.start.x - road.midDivide.start.x;
|
|
|
+ dx1 = dx1 / oldCount;
|
|
|
+ dy1 = leftEdge.start.y - road.midDivide.start.y;
|
|
|
+ dy1 = dy1 / oldCount;
|
|
|
+
|
|
|
+ dx2 = leftEdge.end.x - road.midDivide.end.x;
|
|
|
+ dx2 = dx2 / oldCount;
|
|
|
+ dy2 = leftEdge.end.y - road.midDivide.end.y;
|
|
|
+ dy2 = dy2 / oldCount;
|
|
|
+ road.midDivide.display = true;
|
|
|
}
|
|
|
} else if (dir == "right") {
|
|
|
- if (type == "add") {
|
|
|
- ++road.rightDrivewayCount;
|
|
|
- } else if (type == "sub") {
|
|
|
- --road.rightDrivewayCount;
|
|
|
- if (road.rightDrivewayCount < 0) {
|
|
|
- road.rightDrivewayCount = 0;
|
|
|
- }
|
|
|
+ oldCount = road.rightDrivewayCount;
|
|
|
+ if (oldCount != 0) {
|
|
|
+ dx1 = rightEdge.start.x - road.midDivide.start.x;
|
|
|
+ dx1 = dx1 / oldCount;
|
|
|
+ dy1 = rightEdge.start.y - road.midDivide.start.y;
|
|
|
+ dy1 = dy1 / oldCount;
|
|
|
+
|
|
|
+ dx2 = rightEdge.end.x - road.midDivide.end.x;
|
|
|
+ dx2 = dx2 / oldCount;
|
|
|
+ dy2 = rightEdge.end.y - road.midDivide.end.y;
|
|
|
+ dy2 = dy2 / oldCount;
|
|
|
+ road.midDivide.display = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ lanes = [];
|
|
|
+ for (let i = 0; i < newCount; ++i) {
|
|
|
+ if (i == newCount - 1) {
|
|
|
+ edgeStartPosition = {
|
|
|
+ x: road.midDivide.start.x + dx1 * newCount,
|
|
|
+ y: road.midDivide.start.y + dy1 * newCount,
|
|
|
+ };
|
|
|
+ edgeEndPosition = {
|
|
|
+ x: road.midDivide.end.x + dx2 * newCount,
|
|
|
+ y: road.midDivide.end.y + dy2 * newCount,
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ lanes[i] = {};
|
|
|
+ lanes[i].start = {};
|
|
|
+ lanes[i].start.x = road.midDivide.start.x + dx1 * (i + 1);
|
|
|
+ lanes[i].start.y = road.midDivide.start.y + dy1 * (i + 1);
|
|
|
+
|
|
|
+ lanes[i].end = {};
|
|
|
+ lanes[i].end.x = road.midDivide.end.x + dx2 * (i + 1);
|
|
|
+ lanes[i].end.y = road.midDivide.end.y + dy2 * (i + 1);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (dir == "left") {
|
|
|
+ road.leftLanes = lanes;
|
|
|
+ mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
|
|
|
+ mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
|
|
|
+ road.leftDrivewayCount = newCount;
|
|
|
+ } else if (dir == "right") {
|
|
|
+ road.rightLanes = lanes;
|
|
|
+ mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
|
|
|
+ mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
|
|
|
+ road.rightDrivewayCount = newCount;
|
|
|
+ }
|
|
|
+ let join = mathUtil.getJoinLinePoint(
|
|
|
+ leftEdge.start,
|
|
|
+ mathUtil.createLine1(rightEdge.start, rightEdge.end)
|
|
|
+ );
|
|
|
+ road.width = mathUtil.getDistance(leftEdge.start, join);
|
|
|
}
|
|
|
/****************************************************************************************************************************************************************/
|
|
|
}
|