123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668 |
- import { dataService } from "./DataService";
- import { curveRoadPointService } from "./CurveRoadPointService";
- import { curveEdgeService } from "./CurveEdgeService";
- import { mathUtil } from "../Util/MathUtil.js";
- import CurveRoad from "../Geometry/CurveRoad.js";
- import VectorType from "../enum/VectorType";
- import Constant from "../Constant";
- import RoadService from "./RoadService";
- export default class CurveRoadService extends RoadService {
- constructor() {
- super();
- }
- create(startId, endId, vectorId) {
- let curveRoad = new CurveRoad(startId, endId, vectorId);
- dataService.addCurveRoad(curveRoad);
- let startPoint = dataService.getCurveRoadPoint(startId);
- startPoint.setPointParent(curveRoad.vectorId);
- startPoint.setIndex(0);
- let endPoint = dataService.getCurveRoadPoint(endId);
- endPoint.setPointParent(curveRoad.vectorId);
- endPoint.setIndex(2);
- let edgePoints;
- if (curveRoad.way == Constant.oneWay) {
- edgePoints = mathUtil.RectangleVertex(
- startPoint,
- endPoint,
- curveRoad.singleRoadWidth
- );
- } else {
- edgePoints = mathUtil.RectangleVertex(
- startPoint,
- endPoint,
- curveRoad.leftWidth +
- curveRoad.rightWidth +
- curveRoad.midDivide.midDivideWidth
- );
- }
- let leftEdge = curveEdgeService.create(
- edgePoints.leftEdgeStart,
- edgePoints.leftEdgeEnd,
- null,
- vectorId
- );
- let rightEdge = curveEdgeService.create(
- edgePoints.rightEdgeStart,
- edgePoints.rightEdgeEnd,
- null,
- vectorId
- );
- curveRoad.setLeftEdge(leftEdge.vectorId);
- curveRoad.setRightEdge(rightEdge.vectorId);
- if (!vectorId) {
- leftEdge.setEdgeParent(curveRoad.vectorId);
- rightEdge.setEdgeParent(curveRoad.vectorId);
- }
- curveRoad.points.push(startPoint);
- curveRoad.points.push(endPoint);
- leftEdge.points.push(edgePoints.leftEdgeStart);
- leftEdge.points.push(edgePoints.leftEdgeEnd);
- rightEdge.points.push(edgePoints.rightEdgeStart);
- rightEdge.points.push(edgePoints.rightEdgeEnd);
- this.addCPoint(
- curveRoad,
- {
- x: (startPoint.x + endPoint.x) / 2,
- y: (startPoint.y + endPoint.y) / 2,
- },
- 0
- );
- this.setLanes(curveRoad.vectorId);
- return curveRoad;
- }
- //不能加首尾,只能加中间
- //完全不处理车道,都放在setLanes上处理
- addCPoint(curveRoad, position, startIndex) {
- let point = curveRoadPointService.create(position);
- curveRoad.points.splice(startIndex + 1, 0, point);
- point.setPointParent(curveRoad.vectorId, startIndex);
- point.setIndex(startIndex + 1);
- for (let i = startIndex + 2; i < curveRoad.points.length; ++i) {
- curveRoad.points[i].setIndex(i);
- }
- let leftCount = curveRoad.leftDrivewayCount;
- let rightCount = curveRoad.rightDrivewayCount;
- let leftJoin = null;
- let rightJoin = null;
- const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- let line1 = mathUtil.createLine1(
- curveRoad.points[startIndex],
- curveRoad.points[startIndex + 1]
- );
- let line2 = mathUtil.createLine1(
- curveRoad.points[startIndex + 1],
- curveRoad.points[startIndex + 2]
- );
- const leftLine = mathUtil.createLine1(
- leftCurveEdge.points[startIndex],
- leftCurveEdge.points[startIndex + 1]
- );
- let leftLine1 = mathUtil.createLine3(
- line1,
- leftCurveEdge.points[startIndex]
- );
- let leftLine2 = mathUtil.createLine3(
- line2,
- leftCurveEdge.points[startIndex + 1]
- );
- const rightLine = mathUtil.createLine1(
- rightCurveEdge.points[startIndex],
- rightCurveEdge.points[startIndex + 1]
- );
- let rightLine1 = mathUtil.createLine3(
- line1,
- rightCurveEdge.points[startIndex]
- );
- let rightLine2 = mathUtil.createLine3(
- line2,
- rightCurveEdge.points[startIndex + 1]
- );
- const line = mathUtil.createLine1(
- curveRoad.points[startIndex],
- curveRoad.points[startIndex + 2]
- );
- if (
- mathUtil.Angle(
- curveRoad.points[startIndex + 1],
- curveRoad.points[startIndex],
- curveRoad.points[startIndex + 2]
- ) > Constant.maxAngle
- ) {
- const join = mathUtil.getJoinLinePoint(position, line);
- let dx = position.x - join.x;
- let dy = position.y - join.y;
- leftJoin = mathUtil.getJoinLinePoint(position, leftLine);
- leftJoin.x += dx;
- leftJoin.y += dy;
- leftCurveEdge.points.splice(startIndex + 1, 0, leftJoin);
- curveEdgeService.setCurves(leftCurveEdge);
- rightJoin = mathUtil.getJoinLinePoint(position, rightLine);
- rightJoin.x += dx;
- rightJoin.y += dy;
- rightCurveEdge.points.splice(startIndex + 1, 0, rightJoin);
- curveEdgeService.setCurves(rightCurveEdge);
- } else {
- leftJoin = mathUtil.getIntersectionPoint(leftLine1, leftLine2);
- leftCurveEdge.points.splice(startIndex + 1, 0, leftJoin);
- curveEdgeService.setCurves(leftCurveEdge);
- rightJoin = mathUtil.getIntersectionPoint(rightLine1, rightLine2);
- rightCurveEdge.points.splice(startIndex + 1, 0, rightJoin);
- curveEdgeService.setCurves(rightCurveEdge);
- }
- this.setCurves(curveRoad);
- }
- subCPoint(curveRoad, index) {
- dataService.deleteCurveRoadPoint(curveRoad.points[index].vectorId);
- curveRoad.points.splice(index, 1);
- for (let i = index; i < curveRoad.points.length; ++i) {
- curveRoad.points[i].setIndex(i);
- }
- this.setCurves(curveRoad);
- const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- leftCurveEdge.points.splice(index, 1);
- curveEdgeService.setCurves(leftCurveEdge);
- const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- rightCurveEdge.points.splice(index, 1);
- curveEdgeService.setCurves(rightCurveEdge);
- }
- //单向车道
- setOneWayLanes(curveRoad) {
- let points = curveRoad.points;
- const leftEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- const rightEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- const leftEdgePoints = leftEdge.points;
- const rightEdgePoints = rightEdge.points;
- const singleRoadDrivewayCount = curveRoad.singleRoadDrivewayCount;
- let singleLanes = [];
- let singleLanesCurves = [];
- for (let i = 0; i < singleRoadDrivewayCount - 1; ++i) {
- for (let j = 0; j < points.length; ++j) {
- if (!singleLanes[i]) {
- singleLanes[i] = [];
- }
- const dx =
- (leftEdgePoints[j].x - rightEdgePoints[j].x) /
- singleRoadDrivewayCount;
- const dy =
- (leftEdgePoints[j].y - rightEdgePoints[j].y) /
- singleRoadDrivewayCount;
- singleLanes[i][j] = {};
- singleLanes[i][j].x = points[j].x + dx;
- singleLanes[i][j].y = points[j].y + dy;
- }
- singleLanesCurves[i] = mathUtil.getCurvesByPoints(singleLanes[i]);
- }
- curveRoad.singleLanes = singleLanes;
- curveRoad.singleLanesCurves = singleLanesCurves;
- }
- //双向车道
- setTwoWayLanes(curveRoad, dir) {
- let points = curveRoad.points;
- const leftEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- const rightEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- const leftEdgePoints = leftEdge.points;
- const rightEdgePoints = rightEdge.points;
- const leftCount = curveRoad.leftDrivewayCount;
- const rightCount = curveRoad.rightDrivewayCount;
- if (!curveRoad.midDivide) {
- curveRoad.midDivide = {
- leftMidDivide: [],
- leftMidDivideCurves: [],
- rightMidDivide: [],
- rightMidDivideCurves: [],
- };
- }
- let leftMidDivide = [];
- let rightMidDivide = [];
- let leftLanes = [];
- let leftLanesCurves = [];
- let rightLanes = [];
- let rightLanesCurves = [];
- if (dir == "left" || !dir) {
- for (let i = 0; i < leftCount - 1; ++i) {
- for (let j = 0; j < points.length; ++j) {
- if (!leftLanes[i]) {
- leftLanes[i] = [];
- }
- const leftRatio =
- curveRoad.leftWidth /
- (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
- const leftdx =
- ((leftEdgePoints[j].x - points[j].x) * leftRatio) / leftCount;
- const leftdy =
- ((leftEdgePoints[j].y - points[j].y) * leftRatio) / leftCount;
- const middx = (leftEdgePoints[j].x - points[j].x) * (1 - leftRatio);
- const middy = (leftEdgePoints[j].y - points[j].y) * (1 - leftRatio);
- leftLanes[i][j] = {};
- leftLanes[i][j].x = points[j].x + middx + leftdx * (i + 1);
- leftLanes[i][j].y = points[j].y + middy + leftdy * (i + 1);
- if (!leftMidDivide[j]) {
- leftMidDivide[j] = {};
- leftMidDivide[j].x = points[j].x + middx;
- leftMidDivide[j].y = points[j].y + middy;
- }
- }
- leftLanesCurves[i] = mathUtil.getCurvesByPoints(leftLanes[i]);
- }
- if (leftMidDivide.length == 0) {
- for (let j = 0; j < points.length; ++j) {
- const leftRatio =
- curveRoad.leftWidth /
- (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] = {};
- leftMidDivide[j].x = points[j].x + middx;
- leftMidDivide[j].y = points[j].y + middy;
- }
- }
- curveRoad.midDivide.leftMidDivide = leftMidDivide;
- curveRoad.midDivide.leftMidDivideCurves =
- mathUtil.getCurvesByPoints(leftMidDivide);
- curveRoad.leftLanes = leftLanes;
- curveRoad.leftLanesCurves = leftLanesCurves;
- }
- if (dir == "right" || !dir) {
- for (let i = 0; i < rightCount - 1; ++i) {
- for (let j = 0; j < points.length; ++j) {
- if (!rightLanes[i]) {
- rightLanes[i] = [];
- }
- const rightRatio =
- curveRoad.rightWidth /
- (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
- const rightdx =
- ((rightEdgePoints[j].x - points[j].x) * rightRatio) / rightCount;
- const rightdy =
- ((rightEdgePoints[j].y - points[j].y) * rightRatio) / rightCount;
- const middx = (rightEdgePoints[j].x - points[j].x) * (1 - rightRatio);
- const middy = (rightEdgePoints[j].y - points[j].y) * (1 - rightRatio);
- rightLanes[i][j] = {};
- rightLanes[i][j].x = points[j].x + middx + rightdx * (i + 1);
- rightLanes[i][j].y = points[j].y + middy + rightdy * (i + 1);
- if (!rightMidDivide[j]) {
- rightMidDivide[j] = {};
- rightMidDivide[j].x = points[j].x + middx;
- rightMidDivide[j].y = points[j].y + middy;
- }
- }
- rightLanesCurves[i] = mathUtil.getCurvesByPoints(rightLanes[i]);
- }
- if (rightMidDivide.length == 0) {
- for (let j = 0; j < points.length; ++j) {
- const rightRatio =
- curveRoad.rightWidth /
- (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] = {};
- rightMidDivide[j].x = points[j].x + middx;
- rightMidDivide[j].y = points[j].y + middy;
- }
- }
- curveRoad.midDivide.rightMidDivide = rightMidDivide;
- curveRoad.midDivide.rightMidDivideCurves =
- mathUtil.getCurvesByPoints(rightMidDivide);
- curveRoad.rightLanes = rightLanes;
- curveRoad.rightLanesCurves = rightLanesCurves;
- }
- }
- //车道
- //points的第一个元素是start,最后一个是end
- setLanes(curveRoadId, dir) {
- let curveRoad = dataService.getCurveRoad(curveRoadId);
- if (curveRoad.way == Constant.oneWay) {
- this.setOneWayLanes(curveRoad);
- } else if (curveRoad.way == Constant.twoWay) {
- this.setTwoWayLanes(curveRoad, dir);
- }
- }
- //删除或者减少车道
- updateForAddSubtractLanesCount(curveRoad, newCount, dir) {
- let curveEdge, oldCount, lanes;
- const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- if (newCount < 0) {
- newCount = 0;
- }
- let ratio = null;
- if (curveRoad.way == Constant.twoWay) {
- if (dir == "left") {
- curveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- oldCount = curveRoad.leftDrivewayCount;
- curveRoad.leftDrivewayCount = newCount;
- lanes = curveRoad.leftLanes;
- ratio =
- curveRoad.leftWidth /
- (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
- } else if (dir == "right") {
- curveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- oldCount = curveRoad.rightDrivewayCount;
- curveRoad.rightDrivewayCount = newCount;
- lanes = curveRoad.rightLanes;
- ratio =
- curveRoad.rightWidth /
- (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
- }
- }
- if (newCount == oldCount) {
- return;
- } else if (newCount == 0) {
- this.mulToSinglelane(curveRoad);
- return;
- } else if (oldCount == 0) {
- this.singleToMullane(curveRoad);
- return;
- }
- if (curveRoad.way == Constant.twoWay) {
- for (let i = 0; i < curveRoad.points.length; ++i) {
- const middx =
- (curveEdge.points[i].x - curveRoad.points[i].x) * (1 - ratio);
- const middy =
- (curveEdge.points[i].y - curveRoad.points[i].y) * (1 - ratio);
- const dx =
- ((curveEdge.points[i].x - curveRoad.points[i].x) * ratio) / oldCount;
- curveEdge.points[i].x = curveRoad.points[i].x + middx + dx * newCount;
- const dy =
- ((curveEdge.points[i].y - curveRoad.points[i].y) * ratio) / oldCount;
- curveEdge.points[i].y = curveRoad.points[i].y + middy + dy * newCount;
- }
- mathUtil.clonePoint(curveEdge.start, curveEdge.points[0]);
- mathUtil.clonePoint(
- curveEdge.end,
- curveEdge.points[curveEdge.points.length - 1]
- );
- curveEdgeService.setCurves(curveEdge);
- const line = mathUtil.createLine1(
- curveRoad.points[0],
- curveRoad.points[1]
- );
- if (dir == "left") {
- const leftWidth =
- mathUtil.getDisForPoinLine(leftCurveEdge.start, line) -
- curveRoad.midDivide.midDivideWidth / 2;
- curveRoad.setWidth(leftWidth, "left");
- } else if (dir == "right") {
- const rightWidth =
- mathUtil.getDisForPoinLine(rightCurveEdge.start, line) -
- curveRoad.midDivide.midDivideWidth / 2;
- curveRoad.setWidth(rightWidth, "right");
- }
- } else if (curveRoad.way == Constant.oneWay) {
- oldCount = curveRoad.singleRoadDrivewayCount;
- for (let i = 0; i < curveRoad.points.length; ++i) {
- let dx =
- (leftCurveEdge.points[i].x - rightCurveEdge.points[i].x) / oldCount;
- let dy =
- (leftCurveEdge.points[i].y - rightCurveEdge.points[i].y) / oldCount;
- leftCurveEdge.points[i].x = curveRoad.points[i].x + (dx * newCount) / 2;
- leftCurveEdge.points[i].y = curveRoad.points[i].y + (dy * newCount) / 2;
- mathUtil.clonePoint(leftCurveEdge.start, leftCurveEdge.points[0]);
- mathUtil.clonePoint(
- leftCurveEdge.end,
- leftCurveEdge.points[leftCurveEdge.points.length - 1]
- );
- curveEdgeService.setCurves(leftCurveEdge);
- dx = -1 * dx;
- dy = -1 * dy;
- rightCurveEdge.points[i].x =
- curveRoad.points[i].x + (dx * newCount) / 2;
- rightCurveEdge.points[i].y =
- curveRoad.points[i].y + (dy * newCount) / 2;
- mathUtil.clonePoint(rightCurveEdge.start, rightCurveEdge.points[0]);
- mathUtil.clonePoint(
- rightCurveEdge.end,
- rightCurveEdge.points[rightCurveEdge.points.length - 1]
- );
- curveEdgeService.setCurves(rightCurveEdge);
- }
- const line = mathUtil.createLine1(
- curveRoad.leftCurveEdge.points[0],
- curveRoad.leftCurveEdge.points[1]
- );
- const singleRoadWidth = mathUtil.getDisForPoinLine(
- rightCurveEdge.start,
- line
- );
- curveRoad.setWidth(singleRoadWidth);
- }
- this.setLanes(curveRoad.vectorId, dir);
- }
- //单车道转多车道,默认是转换成左右两边各一个
- //不改变路的宽度
- singleToMullane(curveRoad) {}
- //多车道转单车道
- mulToSinglelane(curveRoad) {
- if (curveRoad.leftDrivewayCount > 0) {
- this.updateForAddSubtractLanesCount(curveRoad, 1, "left");
- }
- if (curveRoad.rightDrivewayCount > 0) {
- this.updateForAddSubtractLanesCount(curveRoad, 1, "right");
- }
- curveRoad.leftDrivewayCount = 0;
- curveRoad.rightDrivewayCount = 0;
- curveRoad.leftLanesCurves = [];
- curveRoad.rightLanesCurves = [];
- curveRoad.leftLanes = [];
- curveRoad.rightLanes = [];
- }
- updateForMovePoint(pointId, position) {
- let curvePoint = dataService.getCurveRoadPoint(pointId);
- let curveRoadId = curvePoint.getParent();
- let curveRoad = dataService.getCurveRoad(curveRoadId);
- const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- let startPoint = dataService.getCurveRoadPoint(curveRoad.startId);
- let endPoint = dataService.getCurveRoadPoint(curveRoad.endId);
- let index = curvePoint.getIndex();
- mathUtil.clonePoint(curveRoad.points[index], position);
- if (index == 0) {
- mathUtil.clonePoint(startPoint, position);
- } else if (index == curveRoad.points.length - 1) {
- mathUtil.clonePoint(endPoint, position);
- }
- let edgePoints = null;
- if (curveRoad.way == Constant.oneWay) {
- edgePoints = mathUtil.getOffset(
- curveRoad.points,
- curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2,
- curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2
- );
- } else if (curveRoad.way == Constant.twoWay) {
- const line = mathUtil.createLine1(
- curveRoad.points[0],
- curveRoad.points[1]
- );
- 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;
- leftCurveEdge.start = leftCurveEdge.points[0];
- leftCurveEdge.end = leftCurveEdge.points[leftCurveEdge.points.length - 1];
- rightCurveEdge.points = edgePoints.rightEdgePoints;
- rightCurveEdge.start = rightCurveEdge.points[0];
- rightCurveEdge.end =
- rightCurveEdge.points[rightCurveEdge.points.length - 1];
- curveEdgeService.setCurves(leftCurveEdge);
- curveEdgeService.setCurves(rightCurveEdge);
- this.setCurves(curveRoad);
- this.setLanes(curveRoadId);
- }
- //变宽或者变窄(车道数据不变)
- //单向的情况下,左右两边同时变宽或者变窄,即:dir无效
- updateForWidth(curveRoadId, newWidth, dir) {
- let curveRoad = dataService.getCurveRoad(curveRoadId);
- let leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- let rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- let ratio = null;
- let dx = null;
- let dy = null;
- //需要考虑中间带
- if (dir == "left") {
- ratio =
- (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
- (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
- } else if (dir == "right") {
- ratio =
- (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
- (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
- } else {
- if (curveRoad.way == Constant.oneWay) {
- ratio = newWidth / curveRoad.singleRoadWidth;
- }
- }
- for (let i = 0; i < curveRoad.points.length; ++i) {
- if (dir == "left") {
- 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;
- } else if (dir == "right") {
- 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;
- rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
- } else {
- if (curveRoad.way == Constant.oneWay) {
- 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;
- 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;
- rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
- } else if (curveRoad.way == Constant.twoWay) {
- ratio = newWidth / (curveRoad.leftWidth + curveRoad.rightWidth);
- ratio =
- (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.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;
- rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
- }
- }
- }
- if (dir == "left") {
- curveEdgeService.setCurves(leftCurveEdge);
- curveRoad.setWidth(newWidth, dir);
- } else if (dir == "right") {
- curveEdgeService.setCurves(rightCurveEdge);
- curveRoad.setWidth(newWidth, dir);
- } else {
- curveEdgeService.setCurves(leftCurveEdge);
- curveEdgeService.setCurves(rightCurveEdge);
- if (curveRoad.way == Constant.oneWay) {
- curveRoad.setWidth(newWidth);
- } else if (curveRoad.way == Constant.twoWay) {
- curveRoad.setWidth(
- (newWidth * curveRoad.leftWidth) /
- (curveRoad.leftWidth + curveRoad.rightWidth),
- "left"
- );
- curveRoad.setWidth(
- (newWidth * curveRoad.rightWidth) /
- (curveRoad.leftWidth + curveRoad.rightWidth),
- "right"
- );
- }
- }
- this.setLanes(curveRoadId, dir);
- }
- setCurves(curveRoad) {
- curveRoad.curves = mathUtil.getCurvesByPoints(curveRoad.points);
- }
- unlock(curveRoadId) {
- let curveRoad = dataService.getCurveRoad(curveRoadId);
- let leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
- let rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
- let lanes = curveRoad.lanes;
- for (let i = 0; i < curveRoad.curves.length; ++i) {
- dataService.createCurveLine(curveRoad.curves[i]);
- }
- for (let i = 0; i < leftCurveEdge.curves.length; ++i) {
- dataService.createCurveLine(leftCurveEdge.curves[i]);
- }
- for (let i = 0; i < rightCurveEdge.curves.length; ++i) {
- dataService.createCurveLine(rightCurveEdge.curves[i]);
- }
- for (let i = 0; i < lanes.length; ++i) {
- for (let j = 0; j < lanes[i].curves.length; ++j) {
- dataService.createCurveLine(lanes[i].curves[j]);
- }
- }
- dataService.deleteCurveRoad(curveRoadId);
- }
- }
- const curveRoadService = new CurveRoadService();
- export { curveRoadService };
|