CurveRoadService.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. import { dataService } from "./DataService";
  2. import { curveRoadPointService } from "./CurveRoadPointService";
  3. import { curveEdgeService } from "./CurveEdgeService";
  4. import { mathUtil } from "../Util/MathUtil.js";
  5. import CurveRoad from "../Geometry/CurveRoad.js";
  6. import VectorType from "../enum/VectorType";
  7. import Constant from "../Constant";
  8. import RoadService from "./RoadService";
  9. export default class CurveRoadService extends RoadService {
  10. constructor() {
  11. super();
  12. }
  13. create(startId, endId, vectorId) {
  14. let curveRoad = new CurveRoad(startId, endId, vectorId);
  15. dataService.addCurveRoad(curveRoad);
  16. let startPoint = dataService.getCurveRoadPoint(startId);
  17. startPoint.setPointParent(curveRoad.vectorId);
  18. startPoint.setIndex(0);
  19. let endPoint = dataService.getCurveRoadPoint(endId);
  20. endPoint.setPointParent(curveRoad.vectorId);
  21. endPoint.setIndex(2);
  22. let edgePoints;
  23. if (curveRoad.way == Constant.oneWay) {
  24. edgePoints = mathUtil.RectangleVertex(
  25. startPoint,
  26. endPoint,
  27. curveRoad.singleRoadWidth
  28. );
  29. } else {
  30. edgePoints = mathUtil.RectangleVertex(
  31. startPoint,
  32. endPoint,
  33. curveRoad.leftWidth +
  34. curveRoad.rightWidth +
  35. curveRoad.midDivide.midDivideWidth
  36. );
  37. }
  38. let leftEdge = curveEdgeService.create(
  39. edgePoints.leftEdgeStart,
  40. edgePoints.leftEdgeEnd,
  41. null,
  42. vectorId
  43. );
  44. let rightEdge = curveEdgeService.create(
  45. edgePoints.rightEdgeStart,
  46. edgePoints.rightEdgeEnd,
  47. null,
  48. vectorId
  49. );
  50. curveRoad.setLeftEdge(leftEdge.vectorId);
  51. curveRoad.setRightEdge(rightEdge.vectorId);
  52. if (!vectorId) {
  53. leftEdge.setEdgeParent(curveRoad.vectorId);
  54. rightEdge.setEdgeParent(curveRoad.vectorId);
  55. }
  56. curveRoad.points.push(startPoint);
  57. curveRoad.points.push(endPoint);
  58. leftEdge.points.push(edgePoints.leftEdgeStart);
  59. leftEdge.points.push(edgePoints.leftEdgeEnd);
  60. rightEdge.points.push(edgePoints.rightEdgeStart);
  61. rightEdge.points.push(edgePoints.rightEdgeEnd);
  62. this.addCPoint(
  63. curveRoad,
  64. {
  65. x: (startPoint.x + endPoint.x) / 2,
  66. y: (startPoint.y + endPoint.y) / 2,
  67. },
  68. 0
  69. );
  70. this.setLanes(curveRoad.vectorId);
  71. return curveRoad;
  72. }
  73. //不能加首尾,只能加中间
  74. //完全不处理车道,都放在setLanes上处理
  75. addCPoint(curveRoad, position, startIndex) {
  76. let point = curveRoadPointService.create(position);
  77. curveRoad.points.splice(startIndex + 1, 0, point);
  78. point.setPointParent(curveRoad.vectorId, startIndex);
  79. point.setIndex(startIndex + 1);
  80. for (let i = startIndex + 2; i < curveRoad.points.length; ++i) {
  81. curveRoad.points[i].setIndex(i);
  82. }
  83. let leftCount = curveRoad.leftDrivewayCount;
  84. let rightCount = curveRoad.rightDrivewayCount;
  85. let leftJoin = null;
  86. let rightJoin = null;
  87. const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  88. const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  89. let line1 = mathUtil.createLine1(
  90. curveRoad.points[startIndex],
  91. curveRoad.points[startIndex + 1]
  92. );
  93. let line2 = mathUtil.createLine1(
  94. curveRoad.points[startIndex + 1],
  95. curveRoad.points[startIndex + 2]
  96. );
  97. const leftLine = mathUtil.createLine1(
  98. leftCurveEdge.points[startIndex],
  99. leftCurveEdge.points[startIndex + 1]
  100. );
  101. let leftLine1 = mathUtil.createLine3(
  102. line1,
  103. leftCurveEdge.points[startIndex]
  104. );
  105. let leftLine2 = mathUtil.createLine3(
  106. line2,
  107. leftCurveEdge.points[startIndex + 1]
  108. );
  109. const rightLine = mathUtil.createLine1(
  110. rightCurveEdge.points[startIndex],
  111. rightCurveEdge.points[startIndex + 1]
  112. );
  113. let rightLine1 = mathUtil.createLine3(
  114. line1,
  115. rightCurveEdge.points[startIndex]
  116. );
  117. let rightLine2 = mathUtil.createLine3(
  118. line2,
  119. rightCurveEdge.points[startIndex + 1]
  120. );
  121. const line = mathUtil.createLine1(
  122. curveRoad.points[startIndex],
  123. curveRoad.points[startIndex + 2]
  124. );
  125. if (
  126. mathUtil.Angle(
  127. curveRoad.points[startIndex + 1],
  128. curveRoad.points[startIndex],
  129. curveRoad.points[startIndex + 2]
  130. ) > Constant.maxAngle
  131. ) {
  132. const join = mathUtil.getJoinLinePoint(position, line);
  133. let dx = position.x - join.x;
  134. let dy = position.y - join.y;
  135. leftJoin = mathUtil.getJoinLinePoint(position, leftLine);
  136. leftJoin.x += dx;
  137. leftJoin.y += dy;
  138. leftCurveEdge.points.splice(startIndex + 1, 0, leftJoin);
  139. curveEdgeService.setCurves(leftCurveEdge);
  140. rightJoin = mathUtil.getJoinLinePoint(position, rightLine);
  141. rightJoin.x += dx;
  142. rightJoin.y += dy;
  143. rightCurveEdge.points.splice(startIndex + 1, 0, rightJoin);
  144. curveEdgeService.setCurves(rightCurveEdge);
  145. } else {
  146. leftJoin = mathUtil.getIntersectionPoint(leftLine1, leftLine2);
  147. leftCurveEdge.points.splice(startIndex + 1, 0, leftJoin);
  148. curveEdgeService.setCurves(leftCurveEdge);
  149. rightJoin = mathUtil.getIntersectionPoint(rightLine1, rightLine2);
  150. rightCurveEdge.points.splice(startIndex + 1, 0, rightJoin);
  151. curveEdgeService.setCurves(rightCurveEdge);
  152. }
  153. this.setCurves(curveRoad);
  154. }
  155. subCPoint(curveRoad, index) {
  156. dataService.deleteCurveRoadPoint(curveRoad.points[index].vectorId);
  157. curveRoad.points.splice(index, 1);
  158. for (let i = index; i < curveRoad.points.length; ++i) {
  159. curveRoad.points[i].setIndex(i);
  160. }
  161. this.setCurves(curveRoad);
  162. const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  163. leftCurveEdge.points.splice(index, 1);
  164. curveEdgeService.setCurves(leftCurveEdge);
  165. const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  166. rightCurveEdge.points.splice(index, 1);
  167. curveEdgeService.setCurves(rightCurveEdge);
  168. }
  169. //单向车道
  170. setOneWayLanes(curveRoad) {
  171. let points = curveRoad.points;
  172. const leftEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  173. const rightEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  174. const leftEdgePoints = leftEdge.points;
  175. const rightEdgePoints = rightEdge.points;
  176. const singleRoadDrivewayCount = curveRoad.singleRoadDrivewayCount;
  177. let singleLanes = [];
  178. let singleLanesCurves = [];
  179. for (let i = 0; i < singleRoadDrivewayCount - 1; ++i) {
  180. for (let j = 0; j < points.length; ++j) {
  181. if (!singleLanes[i]) {
  182. singleLanes[i] = [];
  183. }
  184. const dx =
  185. (leftEdgePoints[j].x - rightEdgePoints[j].x) /
  186. singleRoadDrivewayCount;
  187. const dy =
  188. (leftEdgePoints[j].y - rightEdgePoints[j].y) /
  189. singleRoadDrivewayCount;
  190. singleLanes[i][j] = {};
  191. singleLanes[i][j].x = points[j].x + dx;
  192. singleLanes[i][j].y = points[j].y + dy;
  193. }
  194. singleLanesCurves[i] = mathUtil.getCurvesByPoints(singleLanes[i]);
  195. }
  196. curveRoad.singleLanes = singleLanes;
  197. curveRoad.singleLanesCurves = singleLanesCurves;
  198. }
  199. //双向车道
  200. setTwoWayLanes(curveRoad, dir) {
  201. let points = curveRoad.points;
  202. const leftEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  203. const rightEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  204. const leftEdgePoints = leftEdge.points;
  205. const rightEdgePoints = rightEdge.points;
  206. const leftCount = curveRoad.leftDrivewayCount;
  207. const rightCount = curveRoad.rightDrivewayCount;
  208. if (!curveRoad.midDivide) {
  209. curveRoad.midDivide = {
  210. leftMidDivide: [],
  211. leftMidDivideCurves: [],
  212. rightMidDivide: [],
  213. rightMidDivideCurves: [],
  214. };
  215. }
  216. let leftMidDivide = [];
  217. let rightMidDivide = [];
  218. let leftLanes = [];
  219. let leftLanesCurves = [];
  220. let rightLanes = [];
  221. let rightLanesCurves = [];
  222. if (dir == "left" || !dir) {
  223. for (let i = 0; i < leftCount - 1; ++i) {
  224. for (let j = 0; j < points.length; ++j) {
  225. if (!leftLanes[i]) {
  226. leftLanes[i] = [];
  227. }
  228. const leftRatio =
  229. curveRoad.leftWidth /
  230. (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
  231. const leftdx =
  232. ((leftEdgePoints[j].x - points[j].x) * leftRatio) / leftCount;
  233. const leftdy =
  234. ((leftEdgePoints[j].y - points[j].y) * leftRatio) / leftCount;
  235. const middx = (leftEdgePoints[j].x - points[j].x) * (1 - leftRatio);
  236. const middy = (leftEdgePoints[j].y - points[j].y) * (1 - leftRatio);
  237. leftLanes[i][j] = {};
  238. leftLanes[i][j].x = points[j].x + middx + leftdx * (i + 1);
  239. leftLanes[i][j].y = points[j].y + middy + leftdy * (i + 1);
  240. if (!leftMidDivide[j]) {
  241. leftMidDivide[j] = {};
  242. leftMidDivide[j].x = points[j].x + middx;
  243. leftMidDivide[j].y = points[j].y + middy;
  244. }
  245. }
  246. leftLanesCurves[i] = mathUtil.getCurvesByPoints(leftLanes[i]);
  247. }
  248. if (leftMidDivide.length == 0) {
  249. for (let j = 0; j < points.length; ++j) {
  250. const leftRatio =
  251. curveRoad.leftWidth /
  252. (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
  253. const middx = (leftEdgePoints[j].x - points[j].x) * (1 - leftRatio);
  254. const middy = (leftEdgePoints[j].y - points[j].y) * (1 - leftRatio);
  255. leftMidDivide[j] = {};
  256. leftMidDivide[j].x = points[j].x + middx;
  257. leftMidDivide[j].y = points[j].y + middy;
  258. }
  259. }
  260. curveRoad.midDivide.leftMidDivide = leftMidDivide;
  261. curveRoad.midDivide.leftMidDivideCurves =
  262. mathUtil.getCurvesByPoints(leftMidDivide);
  263. curveRoad.leftLanes = leftLanes;
  264. curveRoad.leftLanesCurves = leftLanesCurves;
  265. }
  266. if (dir == "right" || !dir) {
  267. for (let i = 0; i < rightCount - 1; ++i) {
  268. for (let j = 0; j < points.length; ++j) {
  269. if (!rightLanes[i]) {
  270. rightLanes[i] = [];
  271. }
  272. const rightRatio =
  273. curveRoad.rightWidth /
  274. (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
  275. const rightdx =
  276. ((rightEdgePoints[j].x - points[j].x) * rightRatio) / rightCount;
  277. const rightdy =
  278. ((rightEdgePoints[j].y - points[j].y) * rightRatio) / rightCount;
  279. const middx = (rightEdgePoints[j].x - points[j].x) * (1 - rightRatio);
  280. const middy = (rightEdgePoints[j].y - points[j].y) * (1 - rightRatio);
  281. rightLanes[i][j] = {};
  282. rightLanes[i][j].x = points[j].x + middx + rightdx * (i + 1);
  283. rightLanes[i][j].y = points[j].y + middy + rightdy * (i + 1);
  284. if (!rightMidDivide[j]) {
  285. rightMidDivide[j] = {};
  286. rightMidDivide[j].x = points[j].x + middx;
  287. rightMidDivide[j].y = points[j].y + middy;
  288. }
  289. }
  290. rightLanesCurves[i] = mathUtil.getCurvesByPoints(rightLanes[i]);
  291. }
  292. if (rightMidDivide.length == 0) {
  293. for (let j = 0; j < points.length; ++j) {
  294. const rightRatio =
  295. curveRoad.rightWidth /
  296. (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
  297. const middx = (rightEdgePoints[j].x - points[j].x) * (1 - rightRatio);
  298. const middy = (rightEdgePoints[j].y - points[j].y) * (1 - rightRatio);
  299. rightMidDivide[j] = {};
  300. rightMidDivide[j].x = points[j].x + middx;
  301. rightMidDivide[j].y = points[j].y + middy;
  302. }
  303. }
  304. curveRoad.midDivide.rightMidDivide = rightMidDivide;
  305. curveRoad.midDivide.rightMidDivideCurves =
  306. mathUtil.getCurvesByPoints(rightMidDivide);
  307. curveRoad.rightLanes = rightLanes;
  308. curveRoad.rightLanesCurves = rightLanesCurves;
  309. }
  310. }
  311. //车道
  312. //points的第一个元素是start,最后一个是end
  313. setLanes(curveRoadId, dir) {
  314. let curveRoad = dataService.getCurveRoad(curveRoadId);
  315. if (curveRoad.way == Constant.oneWay) {
  316. this.setOneWayLanes(curveRoad);
  317. } else if (curveRoad.way == Constant.twoWay) {
  318. this.setTwoWayLanes(curveRoad, dir);
  319. }
  320. }
  321. //删除或者减少车道
  322. updateForAddSubtractLanesCount(curveRoad, newCount, dir) {
  323. let curveEdge, oldCount, lanes;
  324. const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  325. const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  326. if (newCount < 0) {
  327. newCount = 0;
  328. }
  329. let ratio = null;
  330. if (curveRoad.way == Constant.twoWay) {
  331. if (dir == "left") {
  332. curveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  333. oldCount = curveRoad.leftDrivewayCount;
  334. curveRoad.leftDrivewayCount = newCount;
  335. lanes = curveRoad.leftLanes;
  336. ratio =
  337. curveRoad.leftWidth /
  338. (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
  339. } else if (dir == "right") {
  340. curveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  341. oldCount = curveRoad.rightDrivewayCount;
  342. curveRoad.rightDrivewayCount = newCount;
  343. lanes = curveRoad.rightLanes;
  344. ratio =
  345. curveRoad.rightWidth /
  346. (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
  347. }
  348. }
  349. if (newCount == oldCount) {
  350. return;
  351. } else if (newCount == 0) {
  352. this.mulToSinglelane(curveRoad);
  353. return;
  354. } else if (oldCount == 0) {
  355. this.singleToMullane(curveRoad);
  356. return;
  357. }
  358. if (curveRoad.way == Constant.twoWay) {
  359. for (let i = 0; i < curveRoad.points.length; ++i) {
  360. const middx =
  361. (curveEdge.points[i].x - curveRoad.points[i].x) * (1 - ratio);
  362. const middy =
  363. (curveEdge.points[i].y - curveRoad.points[i].y) * (1 - ratio);
  364. const dx =
  365. ((curveEdge.points[i].x - curveRoad.points[i].x) * ratio) / oldCount;
  366. curveEdge.points[i].x = curveRoad.points[i].x + middx + dx * newCount;
  367. const dy =
  368. ((curveEdge.points[i].y - curveRoad.points[i].y) * ratio) / oldCount;
  369. curveEdge.points[i].y = curveRoad.points[i].y + middy + dy * newCount;
  370. }
  371. mathUtil.clonePoint(curveEdge.start, curveEdge.points[0]);
  372. mathUtil.clonePoint(
  373. curveEdge.end,
  374. curveEdge.points[curveEdge.points.length - 1]
  375. );
  376. curveEdgeService.setCurves(curveEdge);
  377. const line = mathUtil.createLine1(
  378. curveRoad.points[0],
  379. curveRoad.points[1]
  380. );
  381. if (dir == "left") {
  382. const leftWidth =
  383. mathUtil.getDisForPoinLine(leftCurveEdge.start, line) -
  384. curveRoad.midDivide.midDivideWidth / 2;
  385. curveRoad.setWidth(leftWidth, "left");
  386. } else if (dir == "right") {
  387. const rightWidth =
  388. mathUtil.getDisForPoinLine(rightCurveEdge.start, line) -
  389. curveRoad.midDivide.midDivideWidth / 2;
  390. curveRoad.setWidth(rightWidth, "right");
  391. }
  392. } else if (curveRoad.way == Constant.oneWay) {
  393. oldCount = curveRoad.singleRoadDrivewayCount;
  394. for (let i = 0; i < curveRoad.points.length; ++i) {
  395. let dx =
  396. (leftCurveEdge.points[i].x - rightCurveEdge.points[i].x) / oldCount;
  397. let dy =
  398. (leftCurveEdge.points[i].y - rightCurveEdge.points[i].y) / oldCount;
  399. leftCurveEdge.points[i].x = curveRoad.points[i].x + (dx * newCount) / 2;
  400. leftCurveEdge.points[i].y = curveRoad.points[i].y + (dy * newCount) / 2;
  401. mathUtil.clonePoint(leftCurveEdge.start, leftCurveEdge.points[0]);
  402. mathUtil.clonePoint(
  403. leftCurveEdge.end,
  404. leftCurveEdge.points[leftCurveEdge.points.length - 1]
  405. );
  406. curveEdgeService.setCurves(leftCurveEdge);
  407. dx = -1 * dx;
  408. dy = -1 * dy;
  409. rightCurveEdge.points[i].x =
  410. curveRoad.points[i].x + (dx * newCount) / 2;
  411. rightCurveEdge.points[i].y =
  412. curveRoad.points[i].y + (dy * newCount) / 2;
  413. mathUtil.clonePoint(rightCurveEdge.start, rightCurveEdge.points[0]);
  414. mathUtil.clonePoint(
  415. rightCurveEdge.end,
  416. rightCurveEdge.points[rightCurveEdge.points.length - 1]
  417. );
  418. curveEdgeService.setCurves(rightCurveEdge);
  419. }
  420. const line = mathUtil.createLine1(
  421. curveRoad.leftCurveEdge.points[0],
  422. curveRoad.leftCurveEdge.points[1]
  423. );
  424. const singleRoadWidth = mathUtil.getDisForPoinLine(
  425. rightCurveEdge.start,
  426. line
  427. );
  428. curveRoad.setWidth(singleRoadWidth);
  429. }
  430. this.setLanes(curveRoad.vectorId, dir);
  431. }
  432. //单车道转多车道,默认是转换成左右两边各一个
  433. //不改变路的宽度
  434. singleToMullane(curveRoad) {}
  435. //多车道转单车道
  436. mulToSinglelane(curveRoad) {
  437. if (curveRoad.leftDrivewayCount > 0) {
  438. this.updateForAddSubtractLanesCount(curveRoad, 1, "left");
  439. }
  440. if (curveRoad.rightDrivewayCount > 0) {
  441. this.updateForAddSubtractLanesCount(curveRoad, 1, "right");
  442. }
  443. curveRoad.leftDrivewayCount = 0;
  444. curveRoad.rightDrivewayCount = 0;
  445. curveRoad.leftLanesCurves = [];
  446. curveRoad.rightLanesCurves = [];
  447. curveRoad.leftLanes = [];
  448. curveRoad.rightLanes = [];
  449. }
  450. updateForMovePoint(pointId, position) {
  451. let curvePoint = dataService.getCurveRoadPoint(pointId);
  452. let curveRoadId = curvePoint.getParent();
  453. let curveRoad = dataService.getCurveRoad(curveRoadId);
  454. const leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  455. const rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  456. let startPoint = dataService.getCurveRoadPoint(curveRoad.startId);
  457. let endPoint = dataService.getCurveRoadPoint(curveRoad.endId);
  458. let index = curvePoint.getIndex();
  459. mathUtil.clonePoint(curveRoad.points[index], position);
  460. if (index == 0) {
  461. mathUtil.clonePoint(startPoint, position);
  462. } else if (index == curveRoad.points.length - 1) {
  463. mathUtil.clonePoint(endPoint, position);
  464. }
  465. let edgePoints = null;
  466. if (curveRoad.way == Constant.oneWay) {
  467. edgePoints = mathUtil.getOffset(
  468. curveRoad.points,
  469. curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2,
  470. curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2
  471. );
  472. } else if (curveRoad.way == Constant.twoWay) {
  473. const line = mathUtil.createLine1(
  474. curveRoad.points[0],
  475. curveRoad.points[1]
  476. );
  477. const leftWidth = mathUtil.getDisForPoinLine(leftCurveEdge.start, line);
  478. const rightWidth = mathUtil.getDisForPoinLine(rightCurveEdge.start, line);
  479. edgePoints = mathUtil.getOffset(curveRoad.points, leftWidth, rightWidth);
  480. }
  481. leftCurveEdge.points = edgePoints.leftEdgePoints;
  482. leftCurveEdge.start = leftCurveEdge.points[0];
  483. leftCurveEdge.end = leftCurveEdge.points[leftCurveEdge.points.length - 1];
  484. rightCurveEdge.points = edgePoints.rightEdgePoints;
  485. rightCurveEdge.start = rightCurveEdge.points[0];
  486. rightCurveEdge.end =
  487. rightCurveEdge.points[rightCurveEdge.points.length - 1];
  488. curveEdgeService.setCurves(leftCurveEdge);
  489. curveEdgeService.setCurves(rightCurveEdge);
  490. this.setCurves(curveRoad);
  491. this.setLanes(curveRoadId);
  492. }
  493. //变宽或者变窄(车道数据不变)
  494. //单向的情况下,左右两边同时变宽或者变窄,即:dir无效
  495. updateForWidth(curveRoadId, newWidth, dir) {
  496. let curveRoad = dataService.getCurveRoad(curveRoadId);
  497. let leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  498. let rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  499. let ratio = null;
  500. let dx = null;
  501. let dy = null;
  502. //需要考虑中间带
  503. if (dir == "left") {
  504. ratio =
  505. (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
  506. (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
  507. } else if (dir == "right") {
  508. ratio =
  509. (newWidth + curveRoad.midDivide.midDivideWidth / 2) /
  510. (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
  511. } else {
  512. if (curveRoad.way == Constant.oneWay) {
  513. ratio = newWidth / curveRoad.singleRoadWidth;
  514. }
  515. }
  516. for (let i = 0; i < curveRoad.points.length; ++i) {
  517. if (dir == "left") {
  518. dx = (leftCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  519. leftCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  520. dy = (leftCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  521. leftCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  522. } else if (dir == "right") {
  523. dx = (rightCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  524. rightCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  525. dy = (rightCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  526. rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  527. } else {
  528. if (curveRoad.way == Constant.oneWay) {
  529. dx = (leftCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  530. leftCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  531. dy = (leftCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  532. leftCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  533. dx = (rightCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  534. rightCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  535. dy = (rightCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  536. rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  537. } else if (curveRoad.way == Constant.twoWay) {
  538. ratio = newWidth / (curveRoad.leftWidth + curveRoad.rightWidth);
  539. ratio =
  540. (curveRoad.leftWidth * ratio +
  541. curveRoad.midDivide.midDivideWidth / 2) /
  542. (curveRoad.leftWidth + curveRoad.midDivide.midDivideWidth / 2);
  543. dx = (leftCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  544. leftCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  545. dy = (leftCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  546. leftCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  547. ratio = newWidth / (curveRoad.leftWidth + curveRoad.rightWidth);
  548. ratio =
  549. (curveRoad.rightWidth * ratio +
  550. curveRoad.midDivide.midDivideWidth / 2) /
  551. (curveRoad.rightWidth + curveRoad.midDivide.midDivideWidth / 2);
  552. dx = (rightCurveEdge.points[i].x - curveRoad.points[i].x) * ratio;
  553. rightCurveEdge.points[i].x = curveRoad.points[i].x + dx;
  554. dy = (rightCurveEdge.points[i].y - curveRoad.points[i].y) * ratio;
  555. rightCurveEdge.points[i].y = curveRoad.points[i].y + dy;
  556. }
  557. }
  558. }
  559. if (dir == "left") {
  560. curveEdgeService.setCurves(leftCurveEdge);
  561. curveRoad.setWidth(newWidth, dir);
  562. } else if (dir == "right") {
  563. curveEdgeService.setCurves(rightCurveEdge);
  564. curveRoad.setWidth(newWidth, dir);
  565. } else {
  566. curveEdgeService.setCurves(leftCurveEdge);
  567. curveEdgeService.setCurves(rightCurveEdge);
  568. if (curveRoad.way == Constant.oneWay) {
  569. curveRoad.setWidth(newWidth);
  570. } else if (curveRoad.way == Constant.twoWay) {
  571. curveRoad.setWidth(
  572. (newWidth * curveRoad.leftWidth) /
  573. (curveRoad.leftWidth + curveRoad.rightWidth),
  574. "left"
  575. );
  576. curveRoad.setWidth(
  577. (newWidth * curveRoad.rightWidth) /
  578. (curveRoad.leftWidth + curveRoad.rightWidth),
  579. "right"
  580. );
  581. }
  582. }
  583. this.setLanes(curveRoadId, dir);
  584. }
  585. setCurves(curveRoad) {
  586. curveRoad.curves = mathUtil.getCurvesByPoints(curveRoad.points);
  587. }
  588. unlock(curveRoadId) {
  589. let curveRoad = dataService.getCurveRoad(curveRoadId);
  590. let leftCurveEdge = dataService.getCurveRoadEdge(curveRoad.leftEdgeId);
  591. let rightCurveEdge = dataService.getCurveRoadEdge(curveRoad.rightEdgeId);
  592. let lanes = curveRoad.lanes;
  593. for (let i = 0; i < curveRoad.curves.length; ++i) {
  594. dataService.createCurveLine(curveRoad.curves[i]);
  595. }
  596. for (let i = 0; i < leftCurveEdge.curves.length; ++i) {
  597. dataService.createCurveLine(leftCurveEdge.curves[i]);
  598. }
  599. for (let i = 0; i < rightCurveEdge.curves.length; ++i) {
  600. dataService.createCurveLine(rightCurveEdge.curves[i]);
  601. }
  602. for (let i = 0; i < lanes.length; ++i) {
  603. for (let j = 0; j < lanes[i].curves.length; ++j) {
  604. dataService.createCurveLine(lanes[i].curves[j]);
  605. }
  606. }
  607. dataService.deleteCurveRoad(curveRoadId);
  608. }
  609. }
  610. const curveRoadService = new CurveRoadService();
  611. export { curveRoadService };