RoadService.js 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413
  1. import RoadPoint from "../Geometry/RoadPoint.js";
  2. import Road from "../Geometry/Road.js";
  3. import { dataService } from "./DataService.js";
  4. import { roadPointService } from "./RoadPointService.js";
  5. import { edgeService } from "./EdgeService.js";
  6. import { mathUtil } from "../Util/MathUtil.js";
  7. import Constant from "../Constant";
  8. import { crossPointService } from "./CrossPointService.js";
  9. import { lineService } from "./LineService.js";
  10. export default class RoadService {
  11. constructor() {}
  12. create(startId, endId, vectorId) {
  13. let road = new Road(startId, endId, vectorId);
  14. dataService.addRoad(road);
  15. let startPoint = dataService.getRoadPoint(startId);
  16. startPoint.setPointParent(road.vectorId, "start");
  17. let endPoint = dataService.getRoadPoint(endId);
  18. endPoint.setPointParent(road.vectorId, "end");
  19. let edgePoints;
  20. if (road.way == Constant.oneWay) {
  21. edgePoints = mathUtil.RectangleVertex(
  22. startPoint,
  23. endPoint,
  24. road.singleRoadWidth
  25. );
  26. } else {
  27. edgePoints = mathUtil.RectangleVertex(
  28. startPoint,
  29. endPoint,
  30. road.leftWidth + road.rightWidth + road.midDivide.midDivideWidth
  31. );
  32. }
  33. let leftEdge = edgeService.create(
  34. edgePoints.leftEdgeStart,
  35. edgePoints.leftEdgeEnd,
  36. null,
  37. vectorId
  38. );
  39. let rightEdge = edgeService.create(
  40. edgePoints.rightEdgeStart,
  41. edgePoints.rightEdgeEnd,
  42. null,
  43. vectorId
  44. );
  45. road.setLeftEdge(leftEdge.vectorId);
  46. road.setRightEdge(rightEdge.vectorId);
  47. if (!vectorId) {
  48. leftEdge.setEdgeParent(road.vectorId);
  49. rightEdge.setEdgeParent(road.vectorId);
  50. }
  51. this.setLanes(road.vectorId);
  52. return road;
  53. }
  54. //撤销恢复用的,edge这些会专门调用
  55. createOnlyRoad(startId, endId, vectorId) {
  56. let road = new Road(startId, endId, vectorId);
  57. dataService.addRoad(road);
  58. let startPoint = dataService.getRoadPoint(startId);
  59. startPoint.setPointParent(road.vectorId, "start");
  60. let endPoint = dataService.getRoadPoint(endId);
  61. endPoint.setPointParent(road.vectorId, "end");
  62. return road;
  63. }
  64. getMidLine(road) {
  65. let startPoint = dataService.getRoadPoint(road.startId);
  66. let endPoint = dataService.getRoadPoint(road.endId);
  67. let line = mathUtil.createLine1(startPoint, endPoint);
  68. return line;
  69. }
  70. // roadId对应墙的两个端点。尽量不要改
  71. // dir表示:保留start还是保留end(对应端点的parent不用变)
  72. splitRoad(roadId, pointId, dir) {
  73. const road = dataService.getRoad(roadId);
  74. const startPoint = dataService.getRoadPoint(road.startId);
  75. const endPoint = dataService.getRoadPoint(road.endId);
  76. const point = dataService.getRoadPoint(pointId);
  77. if (
  78. mathUtil.getDistance(startPoint, point) < Constant.minAdsorbPix ||
  79. mathUtil.getDistance(endPoint, point) < Constant.minAdsorbPix
  80. ) {
  81. //console.error('splitRoad********************************************1')
  82. //return null
  83. }
  84. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  85. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  86. let oldLeftEdgeStartPoint = {
  87. x: leftEdge.start.x,
  88. y: leftEdge.start.y,
  89. };
  90. let oldLeftEdgeEndPoint = {
  91. x: leftEdge.end.x,
  92. y: leftEdge.end.y,
  93. };
  94. let oldRightEdgeStartPoint = {
  95. x: rightEdge.start.x,
  96. y: rightEdge.start.y,
  97. };
  98. let oldRightEdgeEndPoint = {
  99. x: rightEdge.end.x,
  100. y: rightEdge.end.y,
  101. };
  102. let newRoad = null;
  103. if (dir == "start") {
  104. // 第一步把旧的road的另一端点对应的parent(旧的roadId)断开
  105. delete endPoint.parent[roadId];
  106. newRoad = this.create(pointId, road.endId);
  107. // 更新旧公路的end
  108. point.setPointParent(roadId, "end");
  109. road.endId = pointId;
  110. } else if (dir == "end") {
  111. delete startPoint.parent[roadId];
  112. newRoad = this.create(road.startId, pointId);
  113. //修改旧公路的start
  114. point.setPointParent(roadId, "start");
  115. road.startId = pointId;
  116. }
  117. // 更新断开后两个road之间的edge
  118. edgeService.updateEdgeForTwoRoad(roadId, newRoad.vectorId);
  119. // 需要更新crossPoints
  120. if (dir == "start") {
  121. let cpt = dataService.getCrossPointForEdgeId(road.leftEdgeId, "end");
  122. crossPointService.replaceEdgeId(cpt, road.leftEdgeId, newRoad.leftEdgeId);
  123. cpt = dataService.getCrossPointForEdgeId(road.rightEdgeId, "end");
  124. crossPointService.replaceEdgeId(
  125. cpt,
  126. road.rightEdgeId,
  127. newRoad.rightEdgeId
  128. );
  129. let newRoadLeftEdge = dataService.getRoadEdge(newRoad.leftEdgeId);
  130. mathUtil.clonePoint(newRoadLeftEdge.end, oldLeftEdgeEndPoint);
  131. let newRoadRightEdge = dataService.getRoadEdge(newRoad.rightEdgeId);
  132. mathUtil.clonePoint(newRoadRightEdge.end, oldRightEdgeEndPoint);
  133. if (Object.keys(startPoint).length > 1) {
  134. mathUtil.clonePoint(leftEdge.start, oldLeftEdgeStartPoint);
  135. mathUtil.clonePoint(rightEdge.start, oldRightEdgeStartPoint);
  136. }
  137. } else if (dir == "end") {
  138. let cpt = dataService.getCrossPointForEdgeId(road.leftEdgeId, "start");
  139. crossPointService.replaceEdgeId(cpt, road.leftEdgeId, newRoad.leftEdgeId);
  140. cpt = dataService.getCrossPointForEdgeId(road.rightEdgeId, "start");
  141. crossPointService.replaceEdgeId(
  142. cpt,
  143. road.rightEdgeId,
  144. newRoad.rightEdgeId
  145. );
  146. let newRoadLeftEdge = dataService.getRoadEdge(newRoad.leftEdgeId);
  147. mathUtil.clonePoint(newRoadLeftEdge.start, oldLeftEdgeStartPoint);
  148. let newRoadRightEdge = dataService.getRoadEdge(newRoad.rightEdgeId);
  149. mathUtil.clonePoint(newRoadRightEdge.start, oldRightEdgeStartPoint);
  150. if (Object.keys(endPoint).length > 1) {
  151. mathUtil.clonePoint(leftEdge.end, oldLeftEdgeEndPoint);
  152. mathUtil.clonePoint(rightEdge.end, oldRightEdgeEndPoint);
  153. }
  154. }
  155. return newRoad.vectorId;
  156. }
  157. // roadId的两个端点分别是pointId1,pointId2,获取这个roadId
  158. getRoadId(pointId1, pointId2) {
  159. const point1 = dataService.getRoadPoint(pointId1);
  160. const point2 = dataService.getRoadPoint(pointId2);
  161. // 公路可能删除了。
  162. if (!point1 || !point2) {
  163. console.warn("pointId1或者pointId2不存在");
  164. return null;
  165. }
  166. if (pointId1 == pointId2) {
  167. console.warn("给的是同一个point");
  168. return null;
  169. }
  170. const parent1 = point1.parent;
  171. const parent2 = point2.parent;
  172. for (const key in parent1) {
  173. if (parent2.hasOwnProperty(key)) {
  174. return key;
  175. }
  176. }
  177. return null;
  178. }
  179. getNeighPoints(pointId, exceptPointId) {
  180. let points = [];
  181. let point = dataService.getRoadPoint(pointId);
  182. for (let key in point.parent) {
  183. let road = dataService.getRoad(key);
  184. const otherPointId = road.getOtherPointId(pointId);
  185. if (exceptPointId && exceptPointId == otherPointId) {
  186. continue;
  187. }
  188. const otherPoint = dataService.getRoadPoint(otherPointId);
  189. points.push(otherPoint);
  190. }
  191. return points;
  192. }
  193. // id1和id2不相交
  194. AngleForRoad(id1, id2) {
  195. const road1 = dataService.getRoad(id1);
  196. const road2 = dataService.getRoad(id2);
  197. if (
  198. road1 == null ||
  199. road2 == null ||
  200. typeof road1 === "undefined" ||
  201. typeof road2 === "undefined"
  202. ) {
  203. return null;
  204. }
  205. const start1 = dataService.getRoadPoint(road1.startId);
  206. const end1 = dataService.getRoadPoint(road1.endId);
  207. const start2 = dataService.getRoadPoint(road2.startId);
  208. const end2 = dataService.getRoadPoint(road2.endId);
  209. const distance1 = mathUtil.getDistance(start1, start2);
  210. const distance2 = mathUtil.getDistance(start1, end2);
  211. const distance3 = mathUtil.getDistance(end1, start2);
  212. const distance4 = mathUtil.getDistance(end1, end2);
  213. const minDistance = Math.min(distance1, distance2, distance3, distance4);
  214. const join = mathUtil.getIntersectionPoint2(start1, end1, start2, end2);
  215. if (join == null) {
  216. return 180;
  217. }
  218. // start和start相交
  219. if (distance1 == minDistance) {
  220. end1.x += start2.x - start1.x;
  221. end1.y += start2.y - start1.y;
  222. return mathUtil.Angle(start2, end1, end2);
  223. } else if (distance2 == minDistance) {
  224. end1.x += end2.x - start1.x;
  225. end1.y += end2.y - start1.y;
  226. return mathUtil.Angle(end2, end1, start2);
  227. } else if (distance3 == minDistance) {
  228. start1.x += start2.x - end1.x;
  229. start1.y += start2.y - end1.y;
  230. return mathUtil.Angle(start2, start1, end2);
  231. } else if (distance4 == minDistance) {
  232. start1.x += end2.x - end1.x;
  233. start1.y += end2.y - end1.y;
  234. return mathUtil.Angle(end2, start1, start2);
  235. } else {
  236. console.error("AngleForRoad**************************1");
  237. return null;
  238. }
  239. }
  240. // 除了返回角度,还返回:id1对应的start,end和id2对应的另外一点组成的三角形,是顺时针还是逆时针
  241. AngleForRoad2(id1, id2) {
  242. const road1 = dataService.getRoad(id1);
  243. const road2 = dataService.getRoad(id2);
  244. if (
  245. road1 == null ||
  246. road2 == null ||
  247. typeof road1 === "undefined" ||
  248. typeof road2 === "undefined"
  249. ) {
  250. return null;
  251. }
  252. const start1 = dataService.getRoadPoint(road1.startId);
  253. const end1 = dataService.getRoadPoint(road1.endId);
  254. const start2 = dataService.getRoadPoint(road2.startId);
  255. const end2 = dataService.getRoadPoint(road2.endId);
  256. let angle = null;
  257. const points = [];
  258. points.push(start1);
  259. points.push(end1);
  260. if (road1.startId == road2.startId) {
  261. angle = mathUtil.Angle(start1, end1, end2);
  262. points.push(end2);
  263. } else if (road1.startId == road2.endId) {
  264. angle = mathUtil.Angle(start1, end1, start2);
  265. points.push(start2);
  266. } else if (road1.endId == road2.startId) {
  267. angle = mathUtil.Angle(end1, start1, end2);
  268. points[0] = end1;
  269. points[1] = start1;
  270. points.push(end2);
  271. } else if (road1.endId == road2.endId) {
  272. angle = mathUtil.Angle(end1, start1, start2);
  273. points[0] = end1;
  274. points[1] = start1;
  275. points.push(start2);
  276. }
  277. if (angle == null) {
  278. return null;
  279. } else {
  280. const flag = mathUtil.isClockwise(points);
  281. if (flag) {
  282. return {
  283. angle: angle,
  284. clockwise: 1,
  285. };
  286. } else {
  287. return {
  288. angle: angle,
  289. clockwise: 0,
  290. };
  291. }
  292. }
  293. }
  294. // id1的端点坐标不变
  295. AngleForRoad3(id1, id2) {
  296. const road1 = dataService.getRoad(id1);
  297. const road2 = dataService.getRoad(id2);
  298. if (
  299. road1 == null ||
  300. road2 == null ||
  301. typeof road1 === "undefined" ||
  302. typeof road2 === "undefined"
  303. ) {
  304. return null;
  305. }
  306. const start1 = dataService.getRoadPoint(road1.startId);
  307. const end1 = dataService.getRoadPoint(road1.endId);
  308. const start2 = dataService.getRoadPoint(road2.startId);
  309. const end2 = dataService.getRoadPoint(road2.endId);
  310. const distance1 = mathUtil.getDistance(start1, start2);
  311. const distance2 = mathUtil.getDistance(start1, end2);
  312. const distance3 = mathUtil.getDistance(end1, start2);
  313. const distance4 = mathUtil.getDistance(end1, end2);
  314. const minDistance = Math.min(distance1, distance2, distance3, distance4);
  315. const _start1 = {};
  316. const _end1 = {};
  317. // start和start相交
  318. if (distance1 == minDistance) {
  319. _end1.x = end1.x + start2.x - start1.x;
  320. _end1.y = end1.y + start2.y - start1.y;
  321. return mathUtil.Angle(start2, _end1, end2);
  322. } else if (distance2 == minDistance) {
  323. _end1.x = end1.x + end2.x - start1.x;
  324. _end1.y = end1.y + end2.y - start1.y;
  325. return mathUtil.Angle(end2, _end1, start2);
  326. } else if (distance3 == minDistance) {
  327. _start1.x = start1.x + start2.x - end1.x;
  328. _start1.y = start1.y + start2.y - end1.y;
  329. return mathUtil.Angle(start2, _start1, end2);
  330. } else if (distance4 == minDistance) {
  331. _start1.x = start1.x + end2.x - end1.x;
  332. _start1.y = start1.y + end2.y - end1.y;
  333. return mathUtil.Angle(end2, _start1, start2);
  334. } else {
  335. console.error(
  336. "RoadService.AngleForRoad3************************************1"
  337. );
  338. return null;
  339. }
  340. }
  341. // pointId的parent超过两个
  342. // 获取最小角度(顺时针和逆时针)
  343. // 可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  344. roadIdForMinAngle(pointId, roadId) {
  345. const point = dataService.getRoadPoint(pointId);
  346. const parent = point.parent;
  347. let minAngle0 = null;
  348. let maxAngle0 = null; // 可能minAngle1不存在,这时候要找逆时针最大的
  349. let minAngle1 = null;
  350. let maxAngle1 = null;
  351. let minInfo0, minInfo1;
  352. let maxInfo0, maxInfo1;
  353. if (Object.keys(parent).length > 2) {
  354. for (const key in parent) {
  355. if (key == roadId) {
  356. continue;
  357. }
  358. const angleInfo = this.AngleForRoad2(roadId, key);
  359. if (minAngle1 == null && angleInfo.clockwise == 1) {
  360. minInfo1 = angleInfo;
  361. minInfo1.roadId = key;
  362. minAngle1 = angleInfo.angle;
  363. maxInfo1 = angleInfo;
  364. maxInfo1.roadId = key;
  365. maxAngle1 = angleInfo.angle;
  366. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  367. minInfo1 = angleInfo;
  368. minInfo1.roadId = key;
  369. minAngle1 = angleInfo.angle;
  370. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  371. maxInfo1 = angleInfo;
  372. maxInfo1.roadId = key;
  373. maxAngle1 = angleInfo.angle;
  374. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  375. minInfo0 = angleInfo;
  376. minInfo0.roadId = key;
  377. minAngle0 = angleInfo.angle;
  378. maxInfo0 = angleInfo;
  379. maxInfo0.roadId = key;
  380. maxAngle0 = angleInfo.angle;
  381. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  382. minInfo0 = angleInfo;
  383. minInfo0.roadId = key;
  384. minAngle0 = angleInfo.angle;
  385. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  386. maxInfo0 = angleInfo;
  387. maxInfo0.roadId = key;
  388. maxAngle0 = angleInfo.angle;
  389. }
  390. }
  391. const result = {
  392. min0: minInfo0,
  393. min1: minInfo1,
  394. };
  395. if (!result.min0) {
  396. result.min0 = maxInfo1;
  397. result.min0.angle = 360 - maxInfo1.angle;
  398. }
  399. if (!result.min1) {
  400. result.min1 = maxInfo0;
  401. result.min1.angle = 360 - maxInfo0.angle;
  402. }
  403. return result;
  404. } else {
  405. console.error(
  406. "roadIdForMinAngle*********************************************************"
  407. );
  408. return null;
  409. }
  410. }
  411. isRoadLink(roadId1, roadId2) {
  412. let road1 = dataService.getRoad(roadId1);
  413. let road2 = dataService.getRoad(roadId2);
  414. if (
  415. road1.startId == road2.startId ||
  416. road1.startId == road2.endId ||
  417. road1.endId == road2.startId ||
  418. road1.endId == road2.endId
  419. ) {
  420. return true;
  421. } else {
  422. return false;
  423. }
  424. }
  425. //point在road所在的线上,只是不确定是否在线段上
  426. isContain(road, point) {
  427. const startPoint = dataService.getRoadPoint(road.startId);
  428. const endPoint = dataService.getRoadPoint(road.endId);
  429. const minDis = Constant.minAdsorbPix / 2;
  430. return mathUtil.isContainForSegment(point, startPoint, endPoint, minDis);
  431. }
  432. getDirction(pointId, roadId) {
  433. const road = dataService.getRoad(roadId);
  434. if (road.startId == pointId) {
  435. return "start";
  436. } else if (road.endId == pointId) {
  437. return "end";
  438. } else {
  439. console.error(
  440. "RoadService.getDirction*******************************************************************************************"
  441. );
  442. return null;
  443. }
  444. }
  445. subtraRoadFromIntersect(pointId, roadId) {
  446. const point = dataService.getRoadPoint(pointId);
  447. const parent = point.getParent();
  448. const dir = this.getDirction(pointId, roadId);
  449. if (Object.keys(parent).length == 1) {
  450. return;
  451. } else if (Object.keys(parent).length > 2) {
  452. const info = this.roadIdForMinAngle(pointId, roadId);
  453. edgeService.updateSingleEdgeForTwoRoad(
  454. info.min0.roadId,
  455. info.min1.roadId
  456. );
  457. }
  458. // 第一步先断开链接
  459. delete parent[roadId];
  460. // 第二步先新建端点
  461. const newPoint = roadPointService.create(point);
  462. // 第三步建立链接
  463. newPoint.setPointParent(roadId, dir);
  464. this.setRoadPointId(roadId, pointId, dir);
  465. // 第四步更新Edge
  466. edgeService.updateDefaultEdge(roadId, dir);
  467. this.setLanes(roadId, null, dir);
  468. }
  469. setRoadPointId = function (roadId, pointId, dir) {
  470. const vectorInfo = {};
  471. vectorInfo.roadId = roadId;
  472. vectorInfo.dir = dir;
  473. vectorInfo.pointId = pointId;
  474. this.setRoadInfo(vectorInfo);
  475. };
  476. setRoadInfo(vectorInfo) {
  477. const road = dataService.getRoad(vectorInfo.roadId);
  478. if (
  479. vectorInfo.hasOwnProperty("edgeId") &&
  480. vectorInfo.hasOwnProperty("dir")
  481. ) {
  482. if (vectorInfo.dir == "left") {
  483. road.leftEdgeId = vectorInfo.edgeId;
  484. } else if (vectorInfo.dir == "right") {
  485. road.rightEdgeId = vectorInfo.edgeId;
  486. }
  487. }
  488. if (
  489. vectorInfo.hasOwnProperty("pointId") &&
  490. vectorInfo.hasOwnProperty("dir")
  491. ) {
  492. if (vectorInfo.dir == "start") {
  493. road.startId = vectorInfo.pointId;
  494. } else if (vectorInfo.dir == "end") {
  495. road.endId = vectorInfo.pointId;
  496. }
  497. }
  498. }
  499. AngleForRoad2(id1, id2) {
  500. let road1 = dataService.getRoad(id1);
  501. let road2 = dataService.getRoad(id2);
  502. if (
  503. road1 == null ||
  504. road2 == null ||
  505. typeof road1 == "undefined" ||
  506. typeof road2 == "undefined"
  507. ) {
  508. return null;
  509. }
  510. let start1 = dataService.getRoadPoint(road1.startId);
  511. let end1 = dataService.getRoadPoint(road1.endId);
  512. let start2 = dataService.getRoadPoint(road2.startId);
  513. let end2 = dataService.getRoadPoint(road2.endId);
  514. let angle = null;
  515. let points = [];
  516. points.push(start1);
  517. points.push(end1);
  518. if (road1.startId == road2.startId) {
  519. angle = mathUtil.Angle(start1, end1, end2);
  520. points.push(end2);
  521. } else if (road1.startId == road2.endId) {
  522. angle = mathUtil.Angle(start1, end1, start2);
  523. points.push(start2);
  524. } else if (road1.endId == road2.startId) {
  525. angle = mathUtil.Angle(end1, start1, end2);
  526. points[0] = end1;
  527. points[1] = start1;
  528. points.push(end2);
  529. } else if (road1.endId == road2.endId) {
  530. angle = mathUtil.Angle(end1, start1, start2);
  531. points[0] = end1;
  532. points[1] = start1;
  533. points.push(start2);
  534. }
  535. if (angle == null) {
  536. return null;
  537. } else {
  538. let flag = mathUtil.isClockwise(points);
  539. if (flag) {
  540. return {
  541. angle: angle,
  542. clockwise: 1,
  543. };
  544. } else {
  545. return {
  546. angle: angle,
  547. clockwise: 0,
  548. };
  549. }
  550. }
  551. }
  552. //pointId的parent超过两个
  553. //获取最小角度(顺时针和逆时针)
  554. //可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  555. roadIdForMinAngle(pointId, roadId) {
  556. let point = dataService.getRoadPoint(pointId);
  557. let parent = point.getParent();
  558. let minAngle0 = null;
  559. let maxAngle0 = null; //可能minAngle1不存在,这时候要找逆时针最大的
  560. let minAngle1 = null;
  561. let maxAngle1 = null;
  562. let minInfo0, minInfo1;
  563. let maxInfo0, maxInfo1;
  564. if (Object.keys(parent).length > 2) {
  565. for (let key in parent) {
  566. if (key == roadId) {
  567. continue;
  568. }
  569. let angleInfo = this.AngleForRoad2(roadId, key);
  570. if (minAngle1 == null && angleInfo.clockwise == 1) {
  571. minInfo1 = angleInfo;
  572. minInfo1.roadId = key;
  573. minAngle1 = angleInfo.angle;
  574. maxInfo1 = angleInfo;
  575. maxInfo1.roadId = key;
  576. maxAngle1 = angleInfo.angle;
  577. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  578. minInfo1 = angleInfo;
  579. minInfo1.roadId = key;
  580. minAngle1 = angleInfo.angle;
  581. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  582. maxInfo1 = angleInfo;
  583. maxInfo1.roadId = key;
  584. maxAngle1 = angleInfo.angle;
  585. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  586. minInfo0 = angleInfo;
  587. minInfo0.roadId = key;
  588. minAngle0 = angleInfo.angle;
  589. maxInfo0 = angleInfo;
  590. maxInfo0.roadId = key;
  591. maxAngle0 = angleInfo.angle;
  592. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  593. minInfo0 = angleInfo;
  594. minInfo0.roadId = key;
  595. minAngle0 = angleInfo.angle;
  596. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  597. maxInfo0 = angleInfo;
  598. maxInfo0.roadId = key;
  599. maxAngle0 = angleInfo.angle;
  600. }
  601. }
  602. let result = {
  603. min0: minInfo0,
  604. min1: minInfo1,
  605. };
  606. if (!result.min0) {
  607. result.min0 = maxInfo1;
  608. result.min0.angle = 360 - maxInfo1.angle;
  609. }
  610. if (!result.min1) {
  611. result.min1 = maxInfo0;
  612. result.min1.angle = 360 - maxInfo0.angle;
  613. }
  614. return result;
  615. } else {
  616. console.error(
  617. "roadIdForMinAngle*********************************************************"
  618. );
  619. return null;
  620. }
  621. }
  622. getDirction(pointId, roadId) {
  623. let road = dataService.getRoad(roadId);
  624. if (road.startId == pointId) {
  625. return "start";
  626. } else if (road.endId == pointId) {
  627. return "end";
  628. } else {
  629. console.error(
  630. "getDirction*******************************************************************************************"
  631. );
  632. return null;
  633. }
  634. }
  635. //pointId的parent超过两个
  636. //获取最小角度(顺时针和逆时针)
  637. //可能缺顺时针或者逆时针,这时候对应的取最大角度的逆时针或者顺时针
  638. roadIdForMinAngle(pointId, roadId) {
  639. let point = dataService.getRoadPoint(pointId);
  640. let parent = point.parent;
  641. let minAngle0 = null;
  642. let maxAngle0 = null; //可能minAngle1不存在,这时候要找逆时针最大的
  643. let minAngle1 = null;
  644. let maxAngle1 = null;
  645. let minInfo0, minInfo1;
  646. let maxInfo0, maxInfo1;
  647. if (Object.keys(parent).length > 2) {
  648. for (let key in parent) {
  649. if (key == roadId) {
  650. continue;
  651. }
  652. let angleInfo = this.AngleForRoad2(roadId, key);
  653. if (minAngle1 == null && angleInfo.clockwise == 1) {
  654. minInfo1 = angleInfo;
  655. minInfo1.roadId = key;
  656. minAngle1 = angleInfo.angle;
  657. maxInfo1 = angleInfo;
  658. maxInfo1.roadId = key;
  659. maxAngle1 = angleInfo.angle;
  660. } else if (minAngle1 > angleInfo.angle && angleInfo.clockwise == 1) {
  661. minInfo1 = angleInfo;
  662. minInfo1.roadId = key;
  663. minAngle1 = angleInfo.angle;
  664. } else if (maxAngle1 < angleInfo.angle && angleInfo.clockwise == 1) {
  665. maxInfo1 = angleInfo;
  666. maxInfo1.roadId = key;
  667. maxAngle1 = angleInfo.angle;
  668. } else if (minAngle0 == null && angleInfo.clockwise == 0) {
  669. minInfo0 = angleInfo;
  670. minInfo0.roadId = key;
  671. minAngle0 = angleInfo.angle;
  672. maxInfo0 = angleInfo;
  673. maxInfo0.roadId = key;
  674. maxAngle0 = angleInfo.angle;
  675. } else if (minAngle0 > angleInfo.angle && angleInfo.clockwise == 0) {
  676. minInfo0 = angleInfo;
  677. minInfo0.roadId = key;
  678. minAngle0 = angleInfo.angle;
  679. } else if (maxAngle0 < angleInfo.angle && angleInfo.clockwise == 0) {
  680. maxInfo0 = angleInfo;
  681. maxInfo0.roadId = key;
  682. maxAngle0 = angleInfo.angle;
  683. }
  684. }
  685. let result = {
  686. min0: minInfo0,
  687. min1: minInfo1,
  688. };
  689. if (!result.min0) {
  690. result.min0 = maxInfo1;
  691. result.min0.angle = 360 - maxInfo1.angle;
  692. }
  693. if (!result.min1) {
  694. result.min1 = maxInfo0;
  695. result.min1.angle = 360 - maxInfo0.angle;
  696. }
  697. return result;
  698. } else {
  699. console.error(
  700. "roadIdForMinAngle*********************************************************"
  701. );
  702. return null;
  703. }
  704. }
  705. deleteRoad(roadId) {
  706. const road = dataService.getRoad(roadId);
  707. let startPoint = dataService.getRoadPoint(road.startId);
  708. let endPoint = dataService.getRoadPoint(road.endId);
  709. if (Object.keys(startPoint.getParent()).length > 2) {
  710. this.subtraRoadFromIntersect(road.startId, roadId);
  711. }
  712. if (Object.keys(endPoint.getParent()).length > 2) {
  713. this.subtraRoadFromIntersect(road.endId, roadId);
  714. }
  715. }
  716. /****************************************************************************************************************************************************************/
  717. // updateDrivewayCount(roadId, dir, type) {
  718. // let road = dataService.getRoad(roadId);
  719. // if (dir == "left") {
  720. // if (type == "add") {
  721. // ++road.leftDrivewayCount;
  722. // } else if (type == "sub") {
  723. // --road.leftDrivewayCount;
  724. // if (road.leftDrivewayCount < 0) {
  725. // road.leftDrivewayCount = 0;
  726. // }
  727. // }
  728. // } else if (dir == "right") {
  729. // if (type == "add") {
  730. // ++road.rightDrivewayCount;
  731. // } else if (type == "sub") {
  732. // --road.rightDrivewayCount;
  733. // if (road.rightDrivewayCount < 0) {
  734. // road.rightDrivewayCount = 0;
  735. // }
  736. // }
  737. // }
  738. // }
  739. //设置中间带
  740. setMidDivide(roadId, dir) {
  741. const road = dataService.getRoad(roadId);
  742. const startPoint = dataService.getRoadPoint(road.startId);
  743. const endPoint = dataService.getRoadPoint(road.endId);
  744. const leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  745. const rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  746. //离中心最近的点才是中间带的起点和终点
  747. const mid = {
  748. x: (startPoint.x + endPoint.x) / 2,
  749. y: (startPoint.y + endPoint.y) / 2,
  750. };
  751. let line = this.getMidLine(road);
  752. const startJoin1 = mathUtil.getJoinLinePoint(leftEdge.start, line);
  753. const startJoin2 = mathUtil.getJoinLinePoint(rightEdge.start, line);
  754. const distance1 = mathUtil.getDistance(startJoin1, mid);
  755. const distance2 = mathUtil.getDistance(startJoin2, mid);
  756. let laneStart, laneEnd, join;
  757. if (!dir || dir == "start") {
  758. if (distance1 > distance2) {
  759. laneStart = {
  760. x: startJoin2.x,
  761. y: startJoin2.y,
  762. };
  763. } else {
  764. laneStart = {
  765. x: startJoin1.x,
  766. y: startJoin1.y,
  767. };
  768. }
  769. if (road.way == Constant.twoWay) {
  770. //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
  771. for (let i = 0; i < road.leftLanes.length; ++i) {
  772. line = mathUtil.createLine1(
  773. road.leftLanes[i].start,
  774. road.leftLanes[i].end
  775. );
  776. join = mathUtil.getJoinLinePoint(laneStart, line);
  777. mathUtil.clonePoint(road.leftLanes[i].start, join);
  778. }
  779. for (let i = 0; i < road.rightLanes.length; ++i) {
  780. line = mathUtil.createLine1(
  781. road.rightLanes[i].start,
  782. road.rightLanes[i].end
  783. );
  784. join = mathUtil.getJoinLinePoint(laneStart, line);
  785. mathUtil.clonePoint(road.rightLanes[i].start, join);
  786. }
  787. line = mathUtil.createLine1(
  788. road.midDivide.leftMidDivide.start,
  789. road.midDivide.leftMidDivide.end
  790. );
  791. join = mathUtil.getJoinLinePoint(laneStart, line);
  792. mathUtil.clonePoint(road.midDivide.leftMidDivide.start, join);
  793. line = mathUtil.createLine1(
  794. road.midDivide.rightMidDivide.start,
  795. road.midDivide.rightMidDivide.end
  796. );
  797. join = mathUtil.getJoinLinePoint(laneStart, line);
  798. mathUtil.clonePoint(road.midDivide.rightMidDivide.start, join);
  799. } else if (road.way == Constant.oneWay) {
  800. for (let i = 0; i < road.singleLanes.length; ++i) {
  801. const line = mathUtil.createLine1(
  802. road.singleLanes[i].start,
  803. road.singleLanes[i].end
  804. );
  805. const join = mathUtil.getJoinLinePoint(laneStart, line);
  806. mathUtil.clonePoint(road.singleLanes[i].start, join);
  807. }
  808. }
  809. }
  810. const endJoin1 = mathUtil.getJoinLinePoint(leftEdge.end, line);
  811. const endJoin2 = mathUtil.getJoinLinePoint(rightEdge.end, line);
  812. const distance3 = mathUtil.getDistance(endJoin1, mid);
  813. const distance4 = mathUtil.getDistance(endJoin2, mid);
  814. if (!dir || dir == "end") {
  815. if (distance3 > distance4) {
  816. laneEnd = {
  817. x: endJoin2.x,
  818. y: endJoin2.y,
  819. };
  820. } else {
  821. laneEnd = {
  822. x: endJoin1.x,
  823. y: endJoin1.y,
  824. };
  825. }
  826. if (road.way == Constant.twoWay) {
  827. //更新车道的起点和终点,因为车道的起点和终点的位置与中间隔离栏一致
  828. for (let i = 0; i < road.leftLanes.length; ++i) {
  829. line = mathUtil.createLine1(
  830. road.leftLanes[i].start,
  831. road.leftLanes[i].end
  832. );
  833. join = mathUtil.getJoinLinePoint(laneEnd, line);
  834. mathUtil.clonePoint(road.leftLanes[i].end, join);
  835. }
  836. for (let i = 0; i < road.rightLanes.length; ++i) {
  837. line = mathUtil.createLine1(
  838. road.rightLanes[i].start,
  839. road.rightLanes[i].end
  840. );
  841. join = mathUtil.getJoinLinePoint(laneEnd, line);
  842. mathUtil.clonePoint(road.rightLanes[i].end, join);
  843. }
  844. line = mathUtil.createLine1(
  845. road.midDivide.leftMidDivide.start,
  846. road.midDivide.leftMidDivide.end
  847. );
  848. join = mathUtil.getJoinLinePoint(laneEnd, line);
  849. mathUtil.clonePoint(road.midDivide.leftMidDivide.end, join);
  850. line = mathUtil.createLine1(
  851. road.midDivide.rightMidDivide.start,
  852. road.midDivide.rightMidDivide.end
  853. );
  854. join = mathUtil.getJoinLinePoint(laneEnd, line);
  855. mathUtil.clonePoint(road.midDivide.rightMidDivide.end, join);
  856. } else if (road.way == Constant.oneWay) {
  857. for (let i = 0; i < road.singleLanes.length; ++i) {
  858. const line = mathUtil.createLine1(
  859. road.singleLanes[i].start,
  860. road.singleLanes[i].end
  861. );
  862. const join = mathUtil.getJoinLinePoint(laneEnd, line);
  863. mathUtil.clonePoint(road.singleLanes[i].end, join);
  864. }
  865. }
  866. }
  867. }
  868. //设置车道
  869. //dir1表示left或者right,dir2表示start或者end
  870. //单车道不考虑dir1
  871. setLanes(roadId, dir1, dir2) {
  872. let road = dataService.getRoad(roadId);
  873. if (road.way == Constant.oneWay) {
  874. this.setOneWayLanes(road, dir1, dir2);
  875. } else if (road.way == Constant.twoWay) {
  876. this.setTwoWayLanes(road, dir1, dir2);
  877. }
  878. }
  879. //单向车道
  880. setOneWayLanes(road, dir1, dir2) {
  881. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  882. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  883. const drivewayCount = road.singleRoadDrivewayCount;
  884. let dx1 = (leftEdge.start.x - rightEdge.start.x) / drivewayCount;
  885. let dy1 = (leftEdge.start.y - rightEdge.start.y) / drivewayCount;
  886. let dx2 = (leftEdge.end.x - rightEdge.end.x) / drivewayCount;
  887. let dy2 = (leftEdge.end.y - rightEdge.end.y) / drivewayCount;
  888. for (let i = 0; i < drivewayCount - 1; ++i) {
  889. if (!road.singleLanes[i]) {
  890. road.singleLanes[i] = {};
  891. }
  892. if (dir2 == "start" || !dir2) {
  893. road.singleLanes[i].start = {};
  894. road.singleLanes[i].start.x = rightEdge.start.x + dx1 * (i + 1);
  895. road.singleLanes[i].start.y = rightEdge.start.y + dy1 * (i + 1);
  896. }
  897. if (dir2 == "end" || !dir2) {
  898. road.singleLanes[i].end = {};
  899. road.singleLanes[i].end.x = rightEdge.end.x + dx2 * (i + 1);
  900. road.singleLanes[i].end.y = rightEdge.end.y + dy2 * (i + 1);
  901. }
  902. }
  903. }
  904. //双向车道
  905. setTwoWayLanes(road, dir1, dir2) {
  906. let startPoint = dataService.getRoadPoint(road.startId);
  907. let endPoint = dataService.getRoadPoint(road.endId);
  908. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  909. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  910. if (!road.midDivide) {
  911. road.midDivide = {
  912. leftMidDivide: {},
  913. rightMidDivide: {},
  914. };
  915. }
  916. const leftCount = road.leftDrivewayCount;
  917. const rightCount = road.rightDrivewayCount;
  918. const leftRatio =
  919. road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
  920. const rightRatio =
  921. road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
  922. let leftdx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / leftCount;
  923. let leftdy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / leftCount;
  924. let leftdx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / leftCount;
  925. let leftdy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / leftCount;
  926. let rightdx1 =
  927. ((rightEdge.start.x - startPoint.x) * rightRatio) / rightCount;
  928. let rightdy1 =
  929. ((rightEdge.start.y - startPoint.y) * rightRatio) / rightCount;
  930. let rightdx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / rightCount;
  931. let rightdy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / rightCount;
  932. if (dir1 == "left" || !dir1) {
  933. let middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
  934. let middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
  935. let middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
  936. let middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
  937. for (let i = 0; i < leftCount - 1; ++i) {
  938. if (!road.leftLanes[i]) {
  939. road.leftLanes[i] = {};
  940. }
  941. if (dir2 == "start" || !dir2) {
  942. road.leftLanes[i].start = {};
  943. road.leftLanes[i].start.x = startPoint.x + middx1 + leftdx1 * (i + 1);
  944. road.leftLanes[i].start.y = startPoint.y + middy1 + leftdy1 * (i + 1);
  945. }
  946. if (dir2 == "end" || !dir2) {
  947. road.leftLanes[i].end = {};
  948. road.leftLanes[i].end.x = endPoint.x + middx2 + leftdx2 * (i + 1);
  949. road.leftLanes[i].end.y = endPoint.y + middy2 + leftdy2 * (i + 1);
  950. }
  951. }
  952. if (dir2 == "start" || !dir2) {
  953. road.midDivide.leftMidDivide.start = {};
  954. road.midDivide.leftMidDivide.start.x = startPoint.x + middx1;
  955. road.midDivide.leftMidDivide.start.y = startPoint.y + middy1;
  956. }
  957. if (dir2 == "end" || !dir2) {
  958. road.midDivide.leftMidDivide.end = {};
  959. road.midDivide.leftMidDivide.end.x = endPoint.x + middx2;
  960. road.midDivide.leftMidDivide.end.y = endPoint.y + middy2;
  961. }
  962. road.leftLanes.splice(leftCount - 1);
  963. }
  964. if (dir1 == "right" || !dir1) {
  965. let middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
  966. let middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
  967. let middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
  968. let middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
  969. for (let i = 0; i < rightCount - 1; ++i) {
  970. if (!road.rightLanes[i]) {
  971. road.rightLanes[i] = {};
  972. }
  973. if (dir2 == "start" || !dir2) {
  974. road.rightLanes[i].start = {};
  975. road.rightLanes[i].start.x =
  976. startPoint.x + middx1 + rightdx1 * (i + 1);
  977. road.rightLanes[i].start.y =
  978. startPoint.y + middy1 + rightdy1 * (i + 1);
  979. road.midDivide.rightMidDivide.start = {};
  980. road.midDivide.rightMidDivide.start.x = startPoint.x + middx1;
  981. road.midDivide.rightMidDivide.start.y = startPoint.y + middy1;
  982. }
  983. if (dir2 == "end" || !dir2) {
  984. road.rightLanes[i].end = {};
  985. road.rightLanes[i].end.x = endPoint.x + middx2 + rightdx2 * (i + 1);
  986. road.rightLanes[i].end.y = endPoint.y + middy2 + rightdy2 * (i + 1);
  987. road.midDivide.rightMidDivide.end = {};
  988. road.midDivide.rightMidDivide.end.x = endPoint.x + middx2;
  989. road.midDivide.rightMidDivide.end.y = endPoint.y + middy2;
  990. }
  991. }
  992. if (dir2 == "start" || !dir2) {
  993. road.midDivide.rightMidDivide.start = {};
  994. road.midDivide.rightMidDivide.start.x = startPoint.x + middx1;
  995. road.midDivide.rightMidDivide.start.y = startPoint.y + middy1;
  996. }
  997. if (dir2 == "end" || !dir2) {
  998. road.midDivide.rightMidDivide.end = {};
  999. road.midDivide.rightMidDivide.end.x = endPoint.x + middx2;
  1000. road.midDivide.rightMidDivide.end.y = endPoint.y + middy2;
  1001. }
  1002. road.rightLanes.splice(rightCount - 1);
  1003. }
  1004. this.setMidDivide(road.vectorId);
  1005. }
  1006. // singleToMullane(road) {
  1007. // road.leftDrivewayCount = 1;
  1008. // road.rightDrivewayCount = 1;
  1009. // this.setMidDivide(road.vectorId);
  1010. // this.setLanes(road.vectorId);
  1011. // }
  1012. //多车道转单车道
  1013. mulToSinglelane(road) {
  1014. if (road.leftDrivewayCount > 0) {
  1015. this.updateForAddSubtractLanesCount(road.vectorId, 1, "left");
  1016. }
  1017. if (road.rightDrivewayCount > 0) {
  1018. this.updateForAddSubtractLanesCount(road.vectorId, 1, "right");
  1019. }
  1020. road.leftDrivewayCount = 0;
  1021. road.rightDrivewayCount = 0;
  1022. road.leftLanes = [];
  1023. road.rightLanes = [];
  1024. this.setMidDivide(road.vectorId);
  1025. }
  1026. //删除或者减少车道
  1027. //需要考虑车道个数是0(左或者右)的情况
  1028. //单向车道不考虑dir,即:均匀的增加或者删除车道
  1029. updateForAddSubtractLanesCount(roadId, newCount, dir) {
  1030. let dx1,
  1031. dy1,
  1032. dx2,
  1033. dy2,
  1034. oldCount,
  1035. edgeStartPosition,
  1036. edgeEndPosition,
  1037. leftRatio,
  1038. rightRatio,
  1039. middx1,
  1040. middy1,
  1041. middx2,
  1042. middy2;
  1043. let road = dataService.getRoad(roadId);
  1044. if (newCount < 0) {
  1045. newCount = 0;
  1046. }
  1047. let startPoint = dataService.getRoadPoint(road.startId);
  1048. let endPoint = dataService.getRoadPoint(road.endId);
  1049. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1050. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1051. if (road.way == Constant.twoWay) {
  1052. leftRatio =
  1053. road.leftWidth / (road.leftWidth + road.midDivide.midDivideWidth / 2);
  1054. rightRatio =
  1055. road.rightWidth / (road.rightWidth + road.midDivide.midDivideWidth / 2);
  1056. if (dir == "left") {
  1057. oldCount = road.leftDrivewayCount;
  1058. if (oldCount != 0) {
  1059. dx1 = ((leftEdge.start.x - startPoint.x) * leftRatio) / oldCount;
  1060. dy1 = ((leftEdge.start.y - startPoint.y) * leftRatio) / oldCount;
  1061. dx2 = ((leftEdge.end.x - endPoint.x) * leftRatio) / oldCount;
  1062. dy2 = ((leftEdge.end.y - endPoint.y) * leftRatio) / oldCount;
  1063. }
  1064. middx1 = (leftEdge.start.x - startPoint.x) * (1 - leftRatio);
  1065. middy1 = (leftEdge.start.y - startPoint.y) * (1 - leftRatio);
  1066. middx2 = (leftEdge.end.x - endPoint.x) * (1 - leftRatio);
  1067. middy2 = (leftEdge.end.y - endPoint.y) * (1 - leftRatio);
  1068. road.leftDrivewayCount = newCount;
  1069. } else if (dir == "right") {
  1070. oldCount = road.rightDrivewayCount;
  1071. if (oldCount != 0) {
  1072. dx1 = ((rightEdge.start.x - startPoint.x) * rightRatio) / oldCount;
  1073. dy1 = ((rightEdge.start.y - startPoint.y) * rightRatio) / oldCount;
  1074. dx2 = ((rightEdge.end.x - endPoint.x) * rightRatio) / oldCount;
  1075. dy2 = ((rightEdge.end.y - endPoint.y) * rightRatio) / oldCount;
  1076. }
  1077. middx1 = (rightEdge.start.x - startPoint.x) * (1 - rightRatio);
  1078. middy1 = (rightEdge.start.y - startPoint.y) * (1 - rightRatio);
  1079. middx2 = (rightEdge.end.x - endPoint.x) * (1 - rightRatio);
  1080. middy2 = (rightEdge.end.y - endPoint.y) * (1 - rightRatio);
  1081. road.rightDrivewayCount = newCount;
  1082. }
  1083. }
  1084. if (newCount == oldCount) {
  1085. return;
  1086. } else if (newCount == 0) {
  1087. this.mulToSinglelane(road);
  1088. return;
  1089. } else if (oldCount == 0) {
  1090. this.singleToMullane(road);
  1091. return;
  1092. }
  1093. if (road.way == Constant.twoWay) {
  1094. edgeStartPosition = {
  1095. x: startPoint.x + middx1 + dx1 * newCount,
  1096. y: startPoint.y + middy1 + dy1 * newCount,
  1097. };
  1098. edgeEndPosition = {
  1099. x: endPoint.x + middx2 + dx2 * newCount,
  1100. y: endPoint.y + middy2 + dy2 * newCount,
  1101. };
  1102. if (dir == "left") {
  1103. mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
  1104. mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
  1105. } else if (dir == "right") {
  1106. mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
  1107. mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
  1108. }
  1109. let line = this.getMidLine(road);
  1110. if (dir == "left") {
  1111. let join = mathUtil.getJoinLinePoint(leftEdge.start, line);
  1112. road.setWidth(
  1113. mathUtil.getDistance(leftEdge.start, join) -
  1114. road.midDivide.midDivideWidth / 2,
  1115. dir
  1116. );
  1117. } else if (dir == "right") {
  1118. let join = mathUtil.getJoinLinePoint(rightEdge.start, line);
  1119. road.setWidth(
  1120. mathUtil.getDistance(rightEdge.start, join) -
  1121. road.midDivide.midDivideWidth / 2,
  1122. dir
  1123. );
  1124. }
  1125. } else if (road.way == Constant.oneWay) {
  1126. oldCount = road.singleRoadDrivewayCount;
  1127. //不能从leftEdge直接到rightEdge,因为不一定是线性的
  1128. dx1 = ((leftEdge.start.x - startPoint.x) / oldCount) * newCount;
  1129. dy1 = ((leftEdge.start.y - startPoint.y) / oldCount) * newCount;
  1130. dx2 = ((leftEdge.end.x - endPoint.x) / oldCount) * newCount;
  1131. dy2 = ((leftEdge.end.y - endPoint.y) / oldCount) * newCount;
  1132. edgeStartPosition = {
  1133. x: startPoint.x + dx1,
  1134. y: startPoint.y + dy1,
  1135. };
  1136. edgeEndPosition = {
  1137. x: endPoint.x + dx2,
  1138. y: endPoint.y + dy2,
  1139. };
  1140. mathUtil.clonePoint(leftEdge.start, edgeStartPosition);
  1141. mathUtil.clonePoint(leftEdge.end, edgeEndPosition);
  1142. dx1 = ((rightEdge.start.x - startPoint.x) / oldCount) * newCount;
  1143. dy1 = ((rightEdge.start.y - startPoint.y) / oldCount) * newCount;
  1144. dx2 = ((rightEdge.end.x - endPoint.x) / oldCount) * newCount;
  1145. dy2 = ((rightEdge.end.y - endPoint.y) / oldCount) * newCount;
  1146. edgeStartPosition = {
  1147. x: startPoint.x + dx1,
  1148. y: startPoint.y + dy1,
  1149. };
  1150. edgeEndPosition = {
  1151. x: endPoint.x + dx2,
  1152. y: endPoint.y + dy2,
  1153. };
  1154. mathUtil.clonePoint(rightEdge.start, edgeStartPosition);
  1155. mathUtil.clonePoint(rightEdge.end, edgeEndPosition);
  1156. const line = mathUtil.createLine1(leftEdge.start, leftEdge.end);
  1157. const singleRoadWidth = mathUtil.getDisForPoinLine(rightEdge.start, line);
  1158. road.setWidth(singleRoadWidth);
  1159. }
  1160. edgeService.updateEdgeForMulRoad(road.startId);
  1161. edgeService.updateEdgeForMulRoad(road.endId);
  1162. this.setLanes(roadId, dir);
  1163. }
  1164. //变宽或者变窄(车道个数不变)
  1165. //单向的情况下,左右两边同时变宽或者变窄,即:dir无效
  1166. updateForWidth(roadId, newWidth, dir) {
  1167. let road = dataService.getRoad(roadId);
  1168. let startPoint = dataService.getRoadPoint(road.startId);
  1169. let endPoint = dataService.getRoadPoint(road.endId);
  1170. let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1171. let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1172. let edgePoints;
  1173. if (road.way == Constant.oneWay) {
  1174. edgePoints = mathUtil.RectangleVertex(startPoint, endPoint, newWidth);
  1175. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1176. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1177. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1178. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1179. road.setWidth(newWidth);
  1180. } else if (road.way == Constant.twoWay) {
  1181. if (dir == "left") {
  1182. edgePoints = mathUtil.RectangleVertex(
  1183. startPoint,
  1184. endPoint,
  1185. newWidth + road.midDivide.midDivideWidth / 2
  1186. );
  1187. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1188. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1189. road.setWidth(newWidth, dir);
  1190. } else if (dir == "right") {
  1191. edgePoints = mathUtil.RectangleVertex(
  1192. startPoint,
  1193. endPoint,
  1194. newWidth + road.midDivide.midDivideWidth / 2
  1195. );
  1196. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1197. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1198. road.setWidth(newWidth, dir);
  1199. }
  1200. //左右两边的edge同时变宽或者变窄
  1201. else {
  1202. edgePoints = mathUtil.RectangleVertex(
  1203. startPoint,
  1204. endPoint,
  1205. (newWidth * road.leftWidth) / (road.leftWidth + road.rightWidth) +
  1206. road.midDivide.midDivideWidth / 2
  1207. );
  1208. mathUtil.clonePoint(leftEdge.start, edgePoints.leftEdgeStart);
  1209. mathUtil.clonePoint(leftEdge.end, edgePoints.leftEdgeEnd);
  1210. road.setWidth(
  1211. (newWidth * road.leftWidth) / (road.leftWidth + road.rightWidth),
  1212. "left"
  1213. );
  1214. edgePoints = mathUtil.RectangleVertex(
  1215. startPoint,
  1216. endPoint,
  1217. (newWidth * road.rightWidth) / (road.leftWidth + road.rightWidth) +
  1218. road.midDivide.midDivideWidth / 2
  1219. );
  1220. mathUtil.clonePoint(rightEdge.start, edgePoints.rightEdgeStart);
  1221. mathUtil.clonePoint(rightEdge.end, edgePoints.rightEdgeEnd);
  1222. road.setWidth(
  1223. (newWidth * road.rightWidth) / (road.leftWidth + road.rightWidth),
  1224. "right"
  1225. );
  1226. }
  1227. }
  1228. edgeService.updateEdgeForMovePoint(road.startId);
  1229. edgeService.updateEdgeForMovePoint(road.endId);
  1230. this.setLanes(roadId, dir);
  1231. }
  1232. // unlock(roadId) {
  1233. // let road = dataService.getRoad(roadId);
  1234. // let startPoint = dataService.getRoadPoint(road.startId);
  1235. // let endPoint = dataService.getRoadPoint(road.endId);
  1236. // let leftEdge = dataService.getRoadEdge(road.leftEdgeId);
  1237. // let rightEdge = dataService.getRoadEdge(road.rightEdgeId);
  1238. // let lanes = road.lanes;
  1239. // lineService.createLine(startPoint, endPoint);
  1240. // lineService.createLine(leftEdge.start, leftEdge.end);
  1241. // lineService.createLine(rightEdge.start, rightEdge.end);
  1242. // for (let i = 0; i < lanes.length; ++i) {
  1243. // lineService.createLine(lanes[i].start, lanes[i].end);
  1244. // }
  1245. // dataService.deleteRoad(roadId);
  1246. // }
  1247. /****************************************************************************************************************************************************************/
  1248. }
  1249. const roadService = new RoadService();
  1250. export { roadService };