|
@@ -40,7 +40,7 @@ export default class RoadService {
|
|
|
leftEdge.setEdgeParent(road.vectorId);
|
|
|
rightEdge.setEdgeParent(road.vectorId);
|
|
|
}
|
|
|
-
|
|
|
+ this.setMidDivide(road.vectorId);
|
|
|
this.setLanes(road.vectorId);
|
|
|
return road;
|
|
|
}
|
|
@@ -517,7 +517,8 @@ export default class RoadService {
|
|
|
this.setRoadPointId(roadId, pointId, dir);
|
|
|
// 第四步更新Edge
|
|
|
edgeService.updateDefaultEdge(roadId, dir);
|
|
|
- roadService.setLanes(roadId, dir);
|
|
|
+ this.setLanes(roadId, dir);
|
|
|
+ this.setMidDivide(roadId, dir);
|
|
|
}
|
|
|
|
|
|
setRoadPointId = function (roadId, pointId, dir) {
|
|
@@ -825,6 +826,64 @@ export default class RoadService {
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
+ //设置中间带
|
|
|
+ setMidDivide(roadId, dir) {
|
|
|
+ const road = dataService.getRoad(roadId);
|
|
|
+ const startPoint = dataService.getPoint(road.startId);
|
|
|
+ const endPoint = dataService.getPoint(road.endId);
|
|
|
+ const leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ const rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+
|
|
|
+ //离中心最近的点才是中间带的起点和终点
|
|
|
+ const mid = {
|
|
|
+ x: (startPoint.x + endPoint.x) / 2,
|
|
|
+ y: (startPoint.y + endPoint.y) / 2,
|
|
|
+ };
|
|
|
+ const line = this.getMidLine(road);
|
|
|
+ const startJoin1 = mathUtil.getJoinLinePoint(leftEdge.start, line);
|
|
|
+ const startJoin2 = mathUtil.getJoinLinePoint(rightEdge.start, line);
|
|
|
+ const distance1 = mathUtil.getDistance(startJoin1, mid);
|
|
|
+ const distance2 = mathUtil.getDistance(startJoin2, mid);
|
|
|
+ if (!dir || dir == "start") {
|
|
|
+ if (distance1 > distance2) {
|
|
|
+ road.midDivide.start = {
|
|
|
+ x: startJoin2.x,
|
|
|
+ y: startJoin2.y,
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ road.midDivide.start = {
|
|
|
+ x: startJoin1.x,
|
|
|
+ y: startJoin1.y,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const endJoin1 = mathUtil.getJoinLinePoint(leftEdge.end, line);
|
|
|
+ const endJoin2 = mathUtil.getJoinLinePoint(rightEdge.end, line);
|
|
|
+ const distance3 = mathUtil.getDistance(endJoin1, mid);
|
|
|
+ const distance4 = mathUtil.getDistance(endJoin2, mid);
|
|
|
+ if (!dir || dir == "end") {
|
|
|
+ if (distance3 > distance4) {
|
|
|
+ road.midDivide.start = {
|
|
|
+ x: endJoin2.x,
|
|
|
+ y: endJoin2.y,
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ road.midDivide.start = {
|
|
|
+ x: endJoin1.x,
|
|
|
+ y: endJoin1.y,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ setMidDivideForPointId(pointId) {
|
|
|
+ const point = dataService.getPoint(pointId);
|
|
|
+ for (let key in point.parent) {
|
|
|
+ this.setMidDivide(key, point.parent[key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//设置车道
|
|
|
setLanes(roadId, dir) {
|
|
|
let road = dataService.getRoad(roadId);
|
|
@@ -858,15 +917,6 @@ export default class RoadService {
|
|
|
// point2 = _point2;
|
|
|
// }
|
|
|
|
|
|
- road.midDivide = {
|
|
|
- start: {},
|
|
|
- end: {},
|
|
|
- display: true,
|
|
|
- };
|
|
|
-
|
|
|
- mathUtil.clonePoint(road.midDivide.start, startPoint);
|
|
|
- mathUtil.clonePoint(road.midDivide.end, endPoint);
|
|
|
-
|
|
|
let leftdx1 = leftEdge.start.x - startPoint.x;
|
|
|
leftdx1 = leftdx1 / leftCount;
|
|
|
|
|
@@ -938,64 +988,63 @@ export default class RoadService {
|
|
|
let dx1, dy1, dx2, dy2, oldCount, lanes, edgeStartPosition, edgeEndPosition;
|
|
|
let road = dataService.getRoad(roadId);
|
|
|
if (newCount == 0) {
|
|
|
- road.midDivide.display = false;
|
|
|
+ //需要添加隐藏隔离栏
|
|
|
return;
|
|
|
}
|
|
|
+ let startPoint = dataService.getPoint(road.startId);
|
|
|
+ let endPoint = dataService.getPoint(road.endId);
|
|
|
let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
|
|
|
if (dir == "left") {
|
|
|
- oldCount = road.leftDrivewayCount;
|
|
|
+ oldCount = road.leftDrivewayCount + 1;
|
|
|
if (oldCount != 0) {
|
|
|
- dx1 = leftEdge.start.x - road.midDivide.start.x;
|
|
|
+ dx1 = leftEdge.start.x - startPoint.x;
|
|
|
dx1 = dx1 / oldCount;
|
|
|
- dy1 = leftEdge.start.y - road.midDivide.start.y;
|
|
|
+ dy1 = leftEdge.start.y - startPoint.y;
|
|
|
dy1 = dy1 / oldCount;
|
|
|
|
|
|
- dx2 = leftEdge.end.x - road.midDivide.end.x;
|
|
|
+ dx2 = leftEdge.end.x - endPoint.x;
|
|
|
dx2 = dx2 / oldCount;
|
|
|
- dy2 = leftEdge.end.y - road.midDivide.end.y;
|
|
|
+ dy2 = leftEdge.end.y - endPoint.y;
|
|
|
dy2 = dy2 / oldCount;
|
|
|
- road.midDivide.display = true;
|
|
|
+ //road.midDivide.display = true;
|
|
|
}
|
|
|
} else if (dir == "right") {
|
|
|
- oldCount = road.rightDrivewayCount;
|
|
|
+ oldCount = road.rightDrivewayCount + 1;
|
|
|
if (oldCount != 0) {
|
|
|
- dx1 = rightEdge.start.x - road.midDivide.start.x;
|
|
|
+ dx1 = rightEdge.start.x - startPoint.x;
|
|
|
dx1 = dx1 / oldCount;
|
|
|
- dy1 = rightEdge.start.y - road.midDivide.start.y;
|
|
|
+ dy1 = rightEdge.start.y - startPoint.y;
|
|
|
dy1 = dy1 / oldCount;
|
|
|
|
|
|
- dx2 = rightEdge.end.x - road.midDivide.end.x;
|
|
|
+ dx2 = rightEdge.end.x - endPoint.x;
|
|
|
dx2 = dx2 / oldCount;
|
|
|
- dy2 = rightEdge.end.y - road.midDivide.end.y;
|
|
|
+ dy2 = rightEdge.end.y - endPoint.y;
|
|
|
dy2 = dy2 / oldCount;
|
|
|
- road.midDivide.display = true;
|
|
|
+ //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);
|
|
|
- }
|
|
|
+ lanes[i] = {};
|
|
|
+ lanes[i].start = {};
|
|
|
+ lanes[i].start.x = startPoint.x + dx1 * (i + 1);
|
|
|
+ lanes[i].start.y = startPoint.y + dy1 * (i + 1);
|
|
|
+
|
|
|
+ lanes[i].end = {};
|
|
|
+ lanes[i].end.x = endPoint.x + dx2 * (i + 1);
|
|
|
+ lanes[i].end.y = endPoint.y + dy2 * (i + 1);
|
|
|
}
|
|
|
+ edgeStartPosition = {
|
|
|
+ x: startPoint.x + dx1 * (newCount + 1),
|
|
|
+ y: startPoint.y + dy1 * (newCount + 1),
|
|
|
+ };
|
|
|
+ edgeEndPosition = {
|
|
|
+ x: endPoint.x + dx2 * (newCount + 1),
|
|
|
+ y: endPoint.y + dy2 * (newCount + 1),
|
|
|
+ };
|
|
|
|
|
|
if (dir == "left") {
|
|
|
road.leftLanes = lanes;
|