|
@@ -0,0 +1,626 @@
|
|
|
+import Point from "../Geometry/Point.js";
|
|
|
+import Road from "../Geometry/Road.js";
|
|
|
+import { dataService } from "./DataService.js";
|
|
|
+import { roadService } from "./RoadService.js";
|
|
|
+import { mathUtil } from "../Util/MathUtil.js";
|
|
|
+
|
|
|
+export default class EdgeService {
|
|
|
+ constructor() {}
|
|
|
+
|
|
|
+ getMidLine(edge) {
|
|
|
+ let line = mathUtil.createLine(edge.start, edge.end);
|
|
|
+ return line;
|
|
|
+ }
|
|
|
+
|
|
|
+ computerDefaultEdge(roadId) {
|
|
|
+ console.log("开始执行EdgeUtil.computerDefaultEdge");
|
|
|
+ let road = dataService.getRoad(roadId);
|
|
|
+ let line = roadService.getMidLine(road);
|
|
|
+
|
|
|
+ let lines = mathUtil.getParallelLineForDistance(line, road.width / 2);
|
|
|
+ let startPoint = dataService.getPoint(road.startId);
|
|
|
+ let endPoint = dataService.getPoint(road.endId);
|
|
|
+
|
|
|
+ let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+
|
|
|
+ let point = null;
|
|
|
+ let points = [];
|
|
|
+
|
|
|
+ //先计算start部分
|
|
|
+ point = startPoint;
|
|
|
+ points.push(endPoint);
|
|
|
+ points.push(startPoint);
|
|
|
+ let point1 = mathUtil.getJoinLinePoint(point, lines.line1);
|
|
|
+ let point2 = mathUtil.getJoinLinePoint(point, lines.line2);
|
|
|
+ points[2] = point1;
|
|
|
+
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(rightEdge.start, point1);
|
|
|
+ mathUtil.clonePoint(leftEdge.start, point2);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(leftEdge.start, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.start, point2);
|
|
|
+ }
|
|
|
+
|
|
|
+ //再计算end部分
|
|
|
+ points = [];
|
|
|
+ point = endPoint;
|
|
|
+ points.push(startPoint);
|
|
|
+ points.push(endPoint);
|
|
|
+ point1 = mathUtil.getJoinLinePoint(point, lines.line1);
|
|
|
+ point2 = mathUtil.getJoinLinePoint(point, lines.line2);
|
|
|
+ points[2] = point1;
|
|
|
+
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(leftEdge.end, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.end, point2);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(rightEdge.end, point1);
|
|
|
+ mathUtil.clonePoint(leftEdge.end, point2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ computerDefaultEdgeForOneDir(roadId, dir) {
|
|
|
+ //console.log('计算'+roadId+' '+dir+'方向的默认Edge端点');
|
|
|
+ console.log("开始执行EdgeUtil.computerDefaultEdgeForOneDir");
|
|
|
+ let road = dataService.getRoad(roadId);
|
|
|
+ let line = roadService.getMidLine(road);
|
|
|
+ let lines = mathUtil.getParallelLineForDistance(line, road.width / 2);
|
|
|
+ let startPoint = dataService.getPoint(road.startId);
|
|
|
+ let endPoint = dataService.getPoint(road.endId);
|
|
|
+
|
|
|
+ let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+
|
|
|
+ let point = null;
|
|
|
+ let points = [];
|
|
|
+ if (dir == "start") {
|
|
|
+ points.push(endPoint);
|
|
|
+ points.push(startPoint);
|
|
|
+
|
|
|
+ point = startPoint;
|
|
|
+ } else if (dir == "end") {
|
|
|
+ points.push(startPoint);
|
|
|
+ points.push(endPoint);
|
|
|
+
|
|
|
+ point = endPoint;
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "EdgeUtil.computerDefaultEdgeForOneDir***************************************************************"
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ let point1 = mathUtil.getJoinLinePoint(point, lines.line1);
|
|
|
+ let point2 = mathUtil.getJoinLinePoint(point, lines.line2);
|
|
|
+
|
|
|
+ points.push(point1);
|
|
|
+
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ if (dir == "start") {
|
|
|
+ mathUtil.clonePoint(rightEdge.start, point1);
|
|
|
+ mathUtil.clonePoint(leftEdge.start, point2);
|
|
|
+ } else if (dir == "end") {
|
|
|
+ mathUtil.clonePoint(leftEdge.end, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.end, point2);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (dir == "start") {
|
|
|
+ mathUtil.clonePoint(leftEdge.start, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.start, point2);
|
|
|
+ } else if (dir == "end") {
|
|
|
+ mathUtil.clonePoint(rightEdge.end, point1);
|
|
|
+ mathUtil.clonePoint(leftEdge.end, point2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ updateDefaultEdge(roadId, dir) {
|
|
|
+ //console.log('计算'+roadId+' '+dir+'方向的默认Edge端点');
|
|
|
+ console.log("开始执行EdgeUtil.updateDefaultEdge");
|
|
|
+
|
|
|
+ let road = dataService.getRoad(roadId);
|
|
|
+ let startPoint = dataService.getPoint(road.startId);
|
|
|
+ let endPoint = dataService.getPoint(road.endId);
|
|
|
+
|
|
|
+ let leftEdge = dataService.getEdge(road.leftEdgeId);
|
|
|
+ let rightEdge = dataService.getEdge(road.rightEdgeId);
|
|
|
+
|
|
|
+ let point = null;
|
|
|
+ if (dir == "start") {
|
|
|
+ point = startPoint;
|
|
|
+ } else if (dir == "end") {
|
|
|
+ point = endPoint;
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "EdgeUtil.updateDefaultSide***************************************************************"
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ let line1 = mathUtil.createLine(leftEdge.start, leftEdge.end);
|
|
|
+ let line2 = mathUtil.createLine(rightEdge.start, rightEdge.end);
|
|
|
+ let point1 = mathUtil.getJoinLinePoint(point, line1);
|
|
|
+ let point2 = mathUtil.getJoinLinePoint(point, line2);
|
|
|
+
|
|
|
+ if (dir == "start") {
|
|
|
+ mathUtil.clonePoint(leftEdge.start, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.start, point2);
|
|
|
+ } else if (dir == "end") {
|
|
|
+ mathUtil.clonePoint(leftEdge.end, point1);
|
|
|
+ mathUtil.clonePoint(rightEdge.end, point2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ computerEdgeForTwoWall(roadId1, roadId2) {
|
|
|
+ //console.log('计算'+roadId1+'和'+roadId2+'相交的edge交点');
|
|
|
+ console.log("开始执行EdgeUtil.computerEdgeForTwoWall");
|
|
|
+ let road1 = dataService.getRoad(roadId1);
|
|
|
+ let startPoint1 = dataService.getPoint(road1.startId);
|
|
|
+ let endPoint1 = dataService.getPoint(road1.endId);
|
|
|
+ this.computerDefaultEdge(roadId1);
|
|
|
+ let leftEdge1 = dataService.getEdge(road1.leftEdgeId);
|
|
|
+ let rightEdge1 = dataService.getEdge(road1.rightEdgeId);
|
|
|
+ let lineLeft1 = this.getMidLine(leftEdge1);
|
|
|
+ let lineRight1 = this.getMidLine(rightEdge1);
|
|
|
+
|
|
|
+ let road2 = dataService.getRoad(roadId2);
|
|
|
+ this.computerDefaultEdge(roadId2);
|
|
|
+ // let startPoint2 = dataService.getPoint(road2.startId);
|
|
|
+ // let endPoint2 = dataService.getPoint(road2.endId);
|
|
|
+ let leftEdge2 = dataService.getEdge(road2.leftEdgeId);
|
|
|
+ let rightEdge2 = dataService.getEdge(road2.rightEdgeId);
|
|
|
+ let lineLeft2 = this.getMidLine(leftEdge2);
|
|
|
+ let lineRight2 = this.getMidLine(rightEdge2);
|
|
|
+
|
|
|
+ let angleInfo = GeoUtil.AngleForWall2(roadId1, roadId2);
|
|
|
+ let angle = null;
|
|
|
+ if (angleInfo == null) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ angle = angleInfo.angle;
|
|
|
+ }
|
|
|
+ let newEdgePoint1, newEdgePoint2;
|
|
|
+
|
|
|
+ //start-start
|
|
|
+ //left-right,right-left
|
|
|
+ if (road1.startId == road2.startId) {
|
|
|
+ //如果墙的角度过大,不能计算edge对应的line的交点
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //start-end
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.startId == road2.endId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-start
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.endId == road2.startId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-end
|
|
|
+ //left-right,right-left
|
|
|
+ else if (road1.endId == road2.endId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "GeoUtil.computerEdgeForTwoWall**********************************************************"
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //wallId1,wallId2已经相交,这里只是为了算出两堵墙edge的start和end
|
|
|
+ //不纠正edge与墙的中心线平行
|
|
|
+ updateEdgeForTwoWall(roadId1, roadId2) {
|
|
|
+ //console.log('计算'+wallId1+'和'+wallId2+'相交的edge交点');
|
|
|
+ console.log("开始执行EdgeUtil.updateEdgeForTwoWall");
|
|
|
+
|
|
|
+ let road1 = dataService.getRoad(roadId1);
|
|
|
+ let startPoint1 = dataService.getPoint(road1.startId);
|
|
|
+ let endPoint1 = dataService.getPoint(road1.endId);
|
|
|
+ this.computerDefaultEdge(roadId1);
|
|
|
+ let leftEdge1 = dataService.getEdge(road1.leftEdgeId);
|
|
|
+ let rightEdge1 = dataService.getEdge(road1.rightEdgeId);
|
|
|
+ let lineLeft1 = this.getMidLine(leftEdge1);
|
|
|
+ let lineRight1 = this.getMidLine(rightEdge1);
|
|
|
+
|
|
|
+ let road2 = dataService.getRoad(roadId2);
|
|
|
+ this.computerDefaultEdge(roadId2);
|
|
|
+ // let startPoint2 = dataService.getPoint(road2.startId);
|
|
|
+ // let endPoint2 = dataService.getPoint(road2.endId);
|
|
|
+ let leftEdge2 = dataService.getEdge(road2.leftEdgeId);
|
|
|
+ let rightEdge2 = dataService.getEdge(road2.rightEdgeId);
|
|
|
+ let lineLeft2 = this.getMidLine(leftEdge2);
|
|
|
+ let lineRight2 = this.getMidLine(rightEdge2);
|
|
|
+
|
|
|
+ let angleInfo = GeoUtil.AngleForWall2(roadId1, roadId2);
|
|
|
+ let angle = null;
|
|
|
+ if (angleInfo == null) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ angle = angleInfo.angle;
|
|
|
+ }
|
|
|
+ let newEdgePoint1, newEdgePoint2;
|
|
|
+
|
|
|
+ //start-start
|
|
|
+ //left-right,right-left
|
|
|
+ if (road1.startId == road2.startId) {
|
|
|
+ //如果墙的角度过大,不能计算edge对应的line的交点
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //start-end
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.startId == road2.endId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-start
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.endId == road2.startId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-end
|
|
|
+ //left-right,right-left
|
|
|
+ else if (road1.endId == road2.endId) {
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint2);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "GeoUtil.updateEdgeForTwoWall**********************************************************"
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //wallId1,wallId2已经相交于一点
|
|
|
+ //只是计算wallId1,wallId2之间的一个edge
|
|
|
+ //wallId1和wallId2相交的交点是join。以join为中心,wallId1逆时针旋转到wallId2,他们之间的那个edge
|
|
|
+ //方法是:join,wallId1另一头的点p1,计算后的edge交点p2。这三个点是逆时针即可
|
|
|
+ updateSingleEdgeForTwoWall(roadId1, roadId2) {
|
|
|
+ //console.log('更新'+wallId1+'和'+wallId2+'一侧相交的edge交点');
|
|
|
+ console.log("开始执行EdgeUtil.updateSingleEdgeForTwoWall");
|
|
|
+ let road1 = dataService.getRoad(roadId1);
|
|
|
+ let startPoint1 = dataService.getPoint(road1.startId);
|
|
|
+ let endPoint1 = dataService.getPoint(road1.endId);
|
|
|
+ this.computerDefaultEdge(roadId1);
|
|
|
+ let leftEdge1 = dataService.getEdge(road1.leftEdgeId);
|
|
|
+ let rightEdge1 = dataService.getEdge(road1.rightEdgeId);
|
|
|
+ let lineLeft1 = this.getMidLine(leftEdge1);
|
|
|
+ let lineRight1 = this.getMidLine(rightEdge1);
|
|
|
+
|
|
|
+ let road2 = dataService.getRoad(roadId2);
|
|
|
+ this.computerDefaultEdge(roadId2);
|
|
|
+ // let startPoint2 = dataService.getPoint(road2.startId);
|
|
|
+ // let endPoint2 = dataService.getPoint(road2.endId);
|
|
|
+ let leftEdge2 = dataService.getEdge(road2.leftEdgeId);
|
|
|
+ let rightEdge2 = dataService.getEdge(road2.rightEdgeId);
|
|
|
+ let lineLeft2 = this.getMidLine(leftEdge2);
|
|
|
+ let lineRight2 = this.getMidLine(rightEdge2);
|
|
|
+
|
|
|
+ let angleInfo = GeoUtil.AngleForWall2(roadId1, roadId2);
|
|
|
+ let angle = null;
|
|
|
+ if (angleInfo == null) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ angle = angleInfo.angle;
|
|
|
+ }
|
|
|
+ let newEdgePoint1, newEdgePoint2;
|
|
|
+
|
|
|
+ let points = [];
|
|
|
+
|
|
|
+ //start-start
|
|
|
+ //left-right,right-left
|
|
|
+ if (road1.startId == road2.startId) {
|
|
|
+ points.push(startPoint1);
|
|
|
+ points.push(endPoint1);
|
|
|
+ //如果墙的角度过大,不能计算edge对应的line的交点
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+
|
|
|
+ points[2] = newEdgePoint1;
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint1);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint2);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //start-end
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.startId == road2.endId) {
|
|
|
+ points.push(startPoint1);
|
|
|
+ points.push(endPoint1);
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(startPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(startPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+ points[2] = newEdgePoint1;
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(leftEdge1.start, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint1);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(rightEdge1.start, newEdgePoint2);
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint2);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-start
|
|
|
+ //left-left,right-right
|
|
|
+ else if (road1.endId == road2.startId) {
|
|
|
+ points.push(endPoint1);
|
|
|
+ points.push(startPoint1);
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineLeft2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineRight1, lineRight2);
|
|
|
+ }
|
|
|
+ points[2] = newEdgePoint1;
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(leftEdge2.start, newEdgePoint1);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+ mathUtil.clonePoint(rightEdge2.start, newEdgePoint2);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ //end-end
|
|
|
+ //left-right,right-left
|
|
|
+ else if (road1.endID == road2.endId) {
|
|
|
+ points.push(endPoint1);
|
|
|
+ points.push(startPoint1);
|
|
|
+ if (angle > Setting.Size.MaxAngle) {
|
|
|
+ newEdgePoint1 = mathUtil.getJoinLinePoint(endPoint1, lineLeft1);
|
|
|
+ newEdgePoint2 = mathUtil.getJoinLinePoint(endPoint1, lineRight1);
|
|
|
+ } else {
|
|
|
+ newEdgePoint1 = mathUtil.getIntersectionPoint(lineLeft1, lineRight2);
|
|
|
+ newEdgePoint2 = mathUtil.getIntersectionPoint(lineLeft2, lineRight1);
|
|
|
+ }
|
|
|
+ points[2] = newEdgePoint1;
|
|
|
+ if (mathUtil.isClockwise(points)) {
|
|
|
+ mathUtil.clonePoint(leftEdge1.end, newEdgePoint1);
|
|
|
+ mathUtil.clonePoint(rightEdge2.end, newEdgePoint1);
|
|
|
+ } else {
|
|
|
+ mathUtil.clonePoint(rightEdge1.end, newEdgePoint2);
|
|
|
+ mathUtil.clonePoint(leftEdge2.end, newEdgePoint2);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "GeoUtil.wallintersect**********************************************************"
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //和updateSingleEdgeForTwoWall的功能相似,只是更新wallId对应pointId这一头的。pointId的parent无论有几个都支持
|
|
|
+ updateEdgeForSingleWall(roadId, pointId) {
|
|
|
+ //console.log('更新'+pointId+'对应'+wallId+'两侧相交的edge交点');
|
|
|
+ //console.log('开始执行EdgeUtil.updateEdgeForSingleWall');
|
|
|
+ let road = dataService.getRoad(roadId);
|
|
|
+ let point = dataService.getPoint(pointId);
|
|
|
+ let parent = point.getParent();
|
|
|
+ let dir = null;
|
|
|
+ if (road.startId == pointId) {
|
|
|
+ dir = "start";
|
|
|
+ } else if (road.endId == pointId) {
|
|
|
+ dir = "end";
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "EdgeUtil.updateEdgeForWall*****************************************************"
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Object.keys(parent).length == 1) {
|
|
|
+ this.updateDefaultEdge(roadId, dir);
|
|
|
+ } else if (Object.keys(parent).length == 2) {
|
|
|
+ this.updateEdgeForTwoWall(Object.keys(parent)[0], Object.keys(parent)[1]);
|
|
|
+ } else if (Object.keys(parent).length > 2) {
|
|
|
+ let info = GeoUtil.wallIdForMinAngle(pointId, roadId);
|
|
|
+ let roadId1 = info.min0.roadId;
|
|
|
+ let roadId2 = info.min1.roadId;
|
|
|
+
|
|
|
+ this.updateSingleEdgeForTwoWall(roadId, roadId2);
|
|
|
+ this.updateSingleEdgeForTwoWall(roadId1, roadId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //pointId的parent可以是1,2,>2
|
|
|
+ //更新pointId对应的全部edge端点
|
|
|
+ updateEdgeForMulWall(pointId) {
|
|
|
+ //console.log('更新 '+pointId+' 那一圈的edge端点');
|
|
|
+ console.log("开始执行EdgeUtil.updateEdgeForMulWall");
|
|
|
+ let point = dataService.getPoint(pointId);
|
|
|
+ let parent = point.getParent();
|
|
|
+
|
|
|
+ if (Object.keys(parent).length == 1) {
|
|
|
+ let dir = GeoUtil.getDirction(pointId, Object.keys(parent)[0]);
|
|
|
+ this.updateDefaultEdge(Object.keys(parent)[0], dir);
|
|
|
+ } else if (Object.keys(parent).length == 2) {
|
|
|
+ this.updateEdgeForTwoWall(Object.keys(parent)[0], Object.keys(parent)[1]);
|
|
|
+ } else if (Object.keys(parent).length > 2) {
|
|
|
+ //起始墙:Object.keys(parent)[0]
|
|
|
+ //开始
|
|
|
+ let _startRoadId = Object.keys(parent)[0];
|
|
|
+ let startRoadId = Object.keys(parent)[0];
|
|
|
+ //pointId是圆心
|
|
|
+ let info = GeoUtil.wallIdForMinAngle(pointId, startRoadId);
|
|
|
+ //有错
|
|
|
+ if (
|
|
|
+ info.min0.angle == 0 ||
|
|
|
+ info.min1.angle == 0 ||
|
|
|
+ info.min0.angle == 360 ||
|
|
|
+ info.min1.angle == 360
|
|
|
+ ) {
|
|
|
+ console.error(
|
|
|
+ "EdgeUtil.updateEdgeForMulWall*******************************************************************1"
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //终止
|
|
|
+ let endRoadId = info.min0.roadId;
|
|
|
+ //按照逆时针遍历
|
|
|
+ let count = 0; //防止死循环(最多11个交点)
|
|
|
+ while (info.min1.roadId != endRoadId) {
|
|
|
+ if (count > 10) {
|
|
|
+ console.error("updateEdgeForMulWall出错了!!!");
|
|
|
+ }
|
|
|
+
|
|
|
+ this.updateSingleEdgeForTwoWall(startRoadId, info.min1.roadId);
|
|
|
+ startRoadId = info.min1.roadId;
|
|
|
+ info = GeoUtil.wallIdForMinAngle(pointId, startRoadId);
|
|
|
+ ++count;
|
|
|
+ }
|
|
|
+ this.updateSingleEdgeForTwoWall(startRoadId, endRoadId);
|
|
|
+ this.updateSingleEdgeForTwoWall(endRoadId, _startRoadId);
|
|
|
+ } else {
|
|
|
+ console.error(
|
|
|
+ "EdgeUtil.updateEdgeForMulWall***********************************************************************2"
|
|
|
+ );
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // //pointId1和pointId2是wallId的两个端点,pointId1移动到和pointId2重合的位置
|
|
|
+ // //这个函数解决:pointId1和pointId2的坐标重合了edge坐标
|
|
|
+ // updateEdgeForSamePosition(pointId1, pointId2, roadId) {
|
|
|
+ // let road = dataService.getRoad(roadId);
|
|
|
+ // let point1 = dataService.getPoint(pointId1);
|
|
|
+ // let point2 = dataService.getPoint(pointId2);
|
|
|
+ // if (!mathUtil.equalForPoint(point1, point2)) {
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+
|
|
|
+ // dataService.getEdge
|
|
|
+
|
|
|
+ // let vLeft = globalObjects.managerVectors.getVector(this.leftEdgeId);
|
|
|
+ // let vRight = globalObjects.managerVectors.getVector(this.rightEdgeId);
|
|
|
+
|
|
|
+ // if (pointId1 == wall.geometry.start && pointId2 == wall.geometry.end) {
|
|
|
+ // mathUtil.clonePoint(vLeft.geometry.start, vLeft.geometry.end);
|
|
|
+ // mathUtil.clonePoint(vRight.geometry.start, vRight.geometry.end);
|
|
|
+ // } else if (
|
|
|
+ // pointId1 == wall.geometry.end &&
|
|
|
+ // pointId2 == wall.geometry.start
|
|
|
+ // ) {
|
|
|
+ // mathUtil.clonePoint(vLeft.geometry.end, vLeft.geometry.start);
|
|
|
+ // mathUtil.clonePoint(vRight.geometry.end, vRight.geometry.start);
|
|
|
+ // }
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+}
|
|
|
+
|
|
|
+const edgeService = new EdgeService();
|
|
|
+export { edgeService };
|