|
@@ -949,32 +949,30 @@ export default class RoadService {
|
|
|
let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
|
|
|
const leftCount = road.leftDrivewayCount;
|
|
|
const rightCount = road.rightDrivewayCount;
|
|
|
+ const leftRatio =
|
|
|
+ road.leftWidth / (road.leftWidth + road.midDivideWidth / 2);
|
|
|
+ const rightRatio =
|
|
|
+ road.rightWidth / (road.rightWidth + road.midDivideWidth / 2);
|
|
|
|
|
|
- let leftdx1 = leftEdge.start.x - startPoint.x;
|
|
|
- leftdx1 = leftdx1 / leftCount;
|
|
|
+ let leftdx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / leftCount;
|
|
|
+ let leftdy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / leftCount;
|
|
|
|
|
|
- let leftdy1 = leftEdge.start.y - startPoint.y;
|
|
|
- leftdy1 = leftdy1 / leftCount;
|
|
|
+ let leftdx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / leftCount;
|
|
|
+ let leftdy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / leftCount;
|
|
|
|
|
|
- let leftdx2 = leftEdge.end.x - endPoint.x;
|
|
|
- leftdx2 = leftdx2 / leftCount;
|
|
|
+ let rightdx1 =
|
|
|
+ ((rightEdge.start.x - startPoint.x) * rightRatio) / rightCount;
|
|
|
+ let rightdy1 =
|
|
|
+ ((rightEdge.start.y - startPoint.y) * rightRatio) / rightCount;
|
|
|
|
|
|
- let leftdy2 = leftEdge.end.y - endPoint.y;
|
|
|
- leftdy2 = leftdy2 / leftCount;
|
|
|
-
|
|
|
- let rightdx1 = rightEdge.start.x - startPoint.x;
|
|
|
- rightdx1 = rightdx1 / rightCount;
|
|
|
-
|
|
|
- let rightdy1 = rightEdge.start.y - startPoint.y;
|
|
|
- rightdy1 = rightdy1 / rightCount;
|
|
|
-
|
|
|
- let rightdx2 = rightEdge.end.x - endPoint.x;
|
|
|
- rightdx2 = rightdx2 / rightCount;
|
|
|
-
|
|
|
- let rightdy2 = rightEdge.end.y - endPoint.y;
|
|
|
- rightdy2 = rightdy2 / rightCount;
|
|
|
+ let rightdx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / rightCount;
|
|
|
+ let rightdy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / rightCount;
|
|
|
|
|
|
if (dir1 == "left" || !dir1) {
|
|
|
+ let middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
|
|
|
+ let middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
|
|
|
+ let middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
|
|
|
+ let middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
|
|
|
for (let i = 0; i < leftCount - 1; ++i) {
|
|
|
if (!road.leftLanes[i]) {
|
|
|
road.leftLanes[i] = {};
|
|
@@ -982,20 +980,24 @@ export default class RoadService {
|
|
|
|
|
|
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].start.x = startPoint.x + middx1 + leftdx1 * (i + 1);
|
|
|
+ road.leftLanes[i].start.y = startPoint.y + middy1 + leftdy1 * (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[i].end.x = endPoint.x + middx2 + leftdx2 * (i + 1);
|
|
|
+ road.leftLanes[i].end.y = endPoint.y + middy2 + leftdy2 * (i + 1);
|
|
|
}
|
|
|
}
|
|
|
road.leftLanes.splice(leftCount - 1);
|
|
|
}
|
|
|
|
|
|
if (dir1 == "right" || !dir1) {
|
|
|
+ let middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
|
|
|
+ let middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
|
|
|
+ let middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
|
|
|
+ let middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
|
|
|
for (let i = 0; i < rightCount - 1; ++i) {
|
|
|
if (!road.rightLanes[i]) {
|
|
|
road.rightLanes[i] = {};
|
|
@@ -1003,14 +1005,16 @@ export default class RoadService {
|
|
|
|
|
|
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].start.x =
|
|
|
+ startPoint.x + middx1 + rightdx1 * (i + 1);
|
|
|
+ road.rightLanes[i].start.y =
|
|
|
+ startPoint.y + middy1 + rightdy1 * (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[i].end.x = endPoint.x + middx2 + rightdx2 * (i + 1);
|
|
|
+ road.rightLanes[i].end.y = endPoint.y + middy2 + rightdy2 * (i + 1);
|
|
|
}
|
|
|
}
|
|
|
road.rightLanes.splice(rightCount - 1);
|
|
@@ -1054,33 +1058,43 @@ export default class RoadService {
|
|
|
let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
|
|
|
let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
|
|
|
|
|
|
+ const leftRatio =
|
|
|
+ road.leftWidth / (road.leftWidth + road.midDivideWidth / 2);
|
|
|
+ const rightRatio =
|
|
|
+ road.rightWidth / (road.rightWidth + road.midDivideWidth / 2);
|
|
|
+
|
|
|
+ let middx1, middy1, middx2, middy2;
|
|
|
+
|
|
|
if (dir == "left") {
|
|
|
oldCount = road.leftDrivewayCount;
|
|
|
if (oldCount != 0) {
|
|
|
- dx1 = leftEdge.start.x - startPoint.x;
|
|
|
- dx1 = dx1 / oldCount;
|
|
|
- dy1 = leftEdge.start.y - startPoint.y;
|
|
|
- dy1 = dy1 / oldCount;
|
|
|
-
|
|
|
- dx2 = leftEdge.end.x - endPoint.x;
|
|
|
- dx2 = dx2 / oldCount;
|
|
|
- dy2 = leftEdge.end.y - endPoint.y;
|
|
|
- dy2 = dy2 / oldCount;
|
|
|
+ dx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / oldCount;
|
|
|
+ dy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / oldCount;
|
|
|
+
|
|
|
+ dx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / oldCount;
|
|
|
+ dy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / oldCount;
|
|
|
}
|
|
|
+
|
|
|
+ middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
|
|
|
+ middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
|
|
|
+ middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
|
|
|
+ middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
|
|
|
+
|
|
|
road.leftDrivewayCount = newCount;
|
|
|
} else if (dir == "right") {
|
|
|
oldCount = road.rightDrivewayCount;
|
|
|
if (oldCount != 0) {
|
|
|
- dx1 = rightEdge.start.x - startPoint.x;
|
|
|
- dx1 = dx1 / oldCount;
|
|
|
- dy1 = rightEdge.start.y - startPoint.y;
|
|
|
- dy1 = dy1 / oldCount;
|
|
|
-
|
|
|
- dx2 = rightEdge.end.x - endPoint.x;
|
|
|
- dx2 = dx2 / oldCount;
|
|
|
- dy2 = rightEdge.end.y - endPoint.y;
|
|
|
- dy2 = dy2 / oldCount;
|
|
|
+ dx1 = ((rightEdge.start.x - startPoint.x) * rightRatio) / oldCount;
|
|
|
+ dy1 = ((rightEdge.start.y - startPoint.y) * rightRatio) / oldCount;
|
|
|
+
|
|
|
+ dx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / oldCount;
|
|
|
+ dy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / oldCount;
|
|
|
}
|
|
|
+ middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
|
|
|
+ middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
|
|
|
+ middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
|
|
|
+ middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
|
|
|
+
|
|
|
road.rightDrivewayCount = newCount;
|
|
|
}
|
|
|
|
|
@@ -1095,31 +1109,35 @@ export default class RoadService {
|
|
|
}
|
|
|
|
|
|
edgeStartPosition = {
|
|
|
- x: startPoint.x + dx1 * newCount,
|
|
|
- y: startPoint.y + dy1 * newCount,
|
|
|
+ x: startPoint.x + middx1 + dx1 * newCount,
|
|
|
+ y: startPoint.y + middy1 + dy1 * newCount,
|
|
|
};
|
|
|
edgeEndPosition = {
|
|
|
- x: endPoint.x + dx2 * newCount,
|
|
|
- y: endPoint.y + dy2 * newCount,
|
|
|
+ x: endPoint.x + middx2 + dx2 * newCount,
|
|
|
+ y: endPoint.y + middy2 + dy2 * newCount,
|
|
|
};
|
|
|
|
|
|
if (dir == "left") {
|
|
|
mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
|
|
|
mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
|
|
|
- road.leftDrivewayCount = newCount;
|
|
|
} else if (dir == "right") {
|
|
|
mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
|
|
|
mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
|
|
|
- road.rightDrivewayCount = newCount;
|
|
|
}
|
|
|
|
|
|
let line = roadService.getMidLine(road);
|
|
|
if (dir == "left") {
|
|
|
let join = mathUtil.getJoinLinePoint(leftEdge.start, line);
|
|
|
- road.setWidth(mathUtil.getDistance(leftEdge.start, join), dir);
|
|
|
+ road.setWidth(
|
|
|
+ mathUtil.getDistance(leftEdge.start, join) - road.midDivideWidth / 2,
|
|
|
+ dir
|
|
|
+ );
|
|
|
} else if (dir == "right") {
|
|
|
let join = mathUtil.getJoinLinePoint(rightEdge.start, line);
|
|
|
- road.setWidth(mathUtil.getDistance(rightEdge.start, join), dir);
|
|
|
+ road.setWidth(
|
|
|
+ mathUtil.getDistance(rightEdge.start, join) - road.midDivideWidth / 2,
|
|
|
+ dir
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
edgeService.updateEdgeForMulRoad(road.startId);
|
|
@@ -1133,7 +1151,7 @@ export default class RoadService {
|
|
|
let endPoint = dataService.getRoadPoint(road.endId);
|
|
|
let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
|
|
|
let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
|
|
|
- road.setWidth(newWidth, dir);
|
|
|
+ road.setWidth(newWidth + road.midDivideWidth / 2, dir);
|
|
|
let edgePoints = mathUtil.RectangleVertex(startPoint, endPoint, newWidth);
|
|
|
if (dir == "left") {
|
|
|
mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
|