|
@@ -84,6 +84,69 @@ export default class ListenLayer {
|
|
|
// 同时获得吸附的相关信息
|
|
|
// 找到选中的symbol(只有选中了,才算是最近的)
|
|
|
getNearForVectors(position, exceptPointId, exceptRoadIds) {
|
|
|
+ let info1 = this.getNearForRoad(position, exceptPointId, exceptRoadIds);
|
|
|
+ let info2 = this.getNearForCurveRoad(
|
|
|
+ position,
|
|
|
+ exceptPointId,
|
|
|
+ exceptRoadIds
|
|
|
+ );
|
|
|
+
|
|
|
+ let min1 = info1.min1;
|
|
|
+ let modifyPoint = info1.modifyPoint;
|
|
|
+ let _modifyPoint = info1._modifyPoint;
|
|
|
+
|
|
|
+ if (min1 == null) {
|
|
|
+ min1 = info2.min1;
|
|
|
+ modifyPoint = info2.modifyPoint;
|
|
|
+ _modifyPoint = info2._modifyPoint;
|
|
|
+ } else if (info2.min1 != null) {
|
|
|
+ if (info1.min1.distance > info2.min1.distance) {
|
|
|
+ min1 = info2.min1;
|
|
|
+ modifyPoint = info2.modifyPoint;
|
|
|
+ _modifyPoint = info2._modifyPoint;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let min2 = info1.min2;
|
|
|
+ if (min2 == null) {
|
|
|
+ min2 = info2.min2;
|
|
|
+ modifyPoint = info2.modifyPoint;
|
|
|
+ _modifyPoint = info2._modifyPoint;
|
|
|
+ } else if (info2.min2 != null) {
|
|
|
+ if (info1.min2.distance > info2.min2.distance) {
|
|
|
+ min2 = info2.min2;
|
|
|
+ modifyPoint = info2.modifyPoint;
|
|
|
+ _modifyPoint = info2._modifyPoint;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const result = {
|
|
|
+ minPoint: min1,
|
|
|
+ minRoad: min2,
|
|
|
+ tagInfo: {},
|
|
|
+ };
|
|
|
+
|
|
|
+ if (_modifyPoint != null) {
|
|
|
+ result.modifyPoint = JSON.parse(JSON.stringify(_modifyPoint));
|
|
|
+ } else if (
|
|
|
+ modifyPoint.hasOwnProperty("x") &&
|
|
|
+ modifyPoint.hasOwnProperty("y")
|
|
|
+ ) {
|
|
|
+ result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
+ } else if (modifyPoint.hasOwnProperty("x")) {
|
|
|
+ result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
+ result.modifyPoint.x = modifyPoint.x;
|
|
|
+ result.modifyPoint.y = position.y;
|
|
|
+ } else if (modifyPoint.hasOwnProperty("y")) {
|
|
|
+ result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
+ result.modifyPoint.x = position.x;
|
|
|
+ result.modifyPoint.y = modifyPoint.y;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ getNearForRoad(position, exceptPointId, exceptRoadIds) {
|
|
|
let min1 = null; // 与墙角的距离
|
|
|
let min2 = null; // 与墙面的距离
|
|
|
// 纠正
|
|
@@ -95,7 +158,6 @@ export default class ListenLayer {
|
|
|
if (exceptPointId) {
|
|
|
hasPointIds.push(exceptPointId);
|
|
|
}
|
|
|
-
|
|
|
const roads = dataService.getRoads();
|
|
|
for (const roadId in roads) {
|
|
|
if (exceptRoadIds && exceptRoadIds.hasOwnProperty(roadId)) {
|
|
@@ -113,7 +175,7 @@ export default class ListenLayer {
|
|
|
//删除墙
|
|
|
dataService.deleteRoad(roadId);
|
|
|
continue;
|
|
|
- console.error("getNearForVectors************************************");
|
|
|
+ console.error("getNearForRoad************************************");
|
|
|
}
|
|
|
const join = mathUtil.getJoinLinePoint(position, line);
|
|
|
|
|
@@ -262,6 +324,26 @@ export default class ListenLayer {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ return {
|
|
|
+ min1: min1,
|
|
|
+ min2: min2,
|
|
|
+ modifyPoint: modifyPoint,
|
|
|
+ _modifyPoint: _modifyPoint,
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ getNearForCurveRoad(position, exceptPointId, exceptRoadIds) {
|
|
|
+ let min1 = null; // 与墙角的距离
|
|
|
+ let min2 = null; // 与墙面的距离
|
|
|
+ // 纠正
|
|
|
+ // 垂直,水平
|
|
|
+ const modifyPoint = {};
|
|
|
+ // 吸附在墙面上
|
|
|
+ let _modifyPoint = null;
|
|
|
+ const hasPointIds = [];
|
|
|
+ if (exceptPointId) {
|
|
|
+ hasPointIds.push(exceptPointId);
|
|
|
+ }
|
|
|
const curveRoads = dataService.getCurveRoads();
|
|
|
for (const curveRoadId in curveRoads) {
|
|
|
if (exceptRoadIds && exceptRoadIds.hasOwnProperty(curveRoadId)) {
|
|
@@ -269,165 +351,79 @@ export default class ListenLayer {
|
|
|
}
|
|
|
|
|
|
const curveRoad = dataService.getCurveRoad(curveRoadId);
|
|
|
- const startPoint = dataService.getCurvePoint(curveRoad.startId);
|
|
|
- const endPoint = dataService.getCurvePoint(curveRoad.endId);
|
|
|
- let distance = null;
|
|
|
-
|
|
|
- //先找端点
|
|
|
- if (hasPointIds.indexOf(curveRoad.startId) == -1) {
|
|
|
- hasPointIds.push(curveRoad.startId);
|
|
|
- distance = mathUtil.getDistance(position, startPoint);
|
|
|
-
|
|
|
- if (min1 == null || min1.distance > distance) {
|
|
|
- min1 = {
|
|
|
- distance: distance,
|
|
|
- pointId: curveRoad.startId,
|
|
|
- type: VectorType.CurveRoadCorner,
|
|
|
- };
|
|
|
-
|
|
|
- if (min1.distance < Constant.minAdsorbPix) {
|
|
|
- modifyPoint.linkedPointId = curveRoad.startId;
|
|
|
- modifyPoint.x = startPoint.x;
|
|
|
- modifyPoint.y = startPoint.y;
|
|
|
- delete modifyPoint.linkedPointIdX;
|
|
|
- delete modifyPoint.linkedPointIdY;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //start部分找到了与x接近的其他点
|
|
|
- if (Math.abs(position.x - startPoint.x) < Constant.minAdsorbPix) {
|
|
|
- if (!modifyPoint.linkedPointIdX) {
|
|
|
- modifyPoint.x = startPoint.x;
|
|
|
- modifyPoint.linkedPointIdX = curveRoad.startId;
|
|
|
- } else {
|
|
|
- const linkedPointX = dataService.getCurvePoint(
|
|
|
- modifyPoint.linkedPointIdX
|
|
|
- );
|
|
|
- if (
|
|
|
- mathUtil.getDistance(position, linkedPointX) >
|
|
|
- mathUtil.getDistance(position, startPoint)
|
|
|
- ) {
|
|
|
- modifyPoint.x = startPoint.x;
|
|
|
- modifyPoint.linkedPointIdX = curveRoad.startId;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- //start部分找到了与y接近的其他点
|
|
|
- if (Math.abs(position.y - startPoint.y) < Constant.minAdsorbPix) {
|
|
|
- if (!modifyPoint.linkedPointIdY) {
|
|
|
- modifyPoint.y = startPoint.y;
|
|
|
- modifyPoint.linkedPointIdY = curveRoad.startId;
|
|
|
- } else {
|
|
|
- const linkedPointY = dataService.getCurvePoint(
|
|
|
- modifyPoint.linkedPointIdY
|
|
|
- );
|
|
|
- if (
|
|
|
- mathUtil.getDistance(position, linkedPointY) >
|
|
|
- mathUtil.getDistance(position, startPoint)
|
|
|
- ) {
|
|
|
- modifyPoint.y = startPoint.y;
|
|
|
- modifyPoint.linkedPointIdY = curveRoad.startId;
|
|
|
+ for (let i = 0; i < curveRoad.points.length; ++i) {
|
|
|
+ let distance = null;
|
|
|
+ //先找端点
|
|
|
+ if (hasPointIds.indexOf(curveRoad.points[i].vectorId) == -1) {
|
|
|
+ hasPointIds.push(curveRoad.points[i].vectorId);
|
|
|
+ distance = mathUtil.getDistance(position, curveRoad.points[i]);
|
|
|
+
|
|
|
+ if (min1 == null || min1.distance > distance) {
|
|
|
+ min1 = {
|
|
|
+ distance: distance,
|
|
|
+ pointId: curveRoad.points[i].vectorId,
|
|
|
+ type: VectorType.CurveRoadCorner,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (min1.distance < Constant.minAdsorbPix) {
|
|
|
+ modifyPoint.linkedPointId = curveRoad.points[i].vectorId;
|
|
|
+ modifyPoint.x = curveRoad.points[i].x;
|
|
|
+ modifyPoint.y = curveRoad.points[i].y;
|
|
|
+ delete modifyPoint.linkedPointIdX;
|
|
|
+ delete modifyPoint.linkedPointIdY;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- if (hasPointIds.indexOf(curveRoad.endId) == -1) {
|
|
|
- hasPointIds.push(curveRoad.endId);
|
|
|
- distance = mathUtil.getDistance(position, endPoint);
|
|
|
-
|
|
|
- if (min1 == null || min1.distance > distance) {
|
|
|
- min1 = {
|
|
|
- distance: distance,
|
|
|
- pointId: curveRoad.endId,
|
|
|
- type: VectorType.CurveRoadCorner,
|
|
|
- };
|
|
|
- //end部分找到了墙的端点
|
|
|
- if (min1.distance < Constant.minAdsorbPix) {
|
|
|
- modifyPoint.linkedPointId = curveRoad.endId;
|
|
|
- modifyPoint.x = endPoint.x;
|
|
|
- modifyPoint.y = endPoint.y;
|
|
|
- delete modifyPoint.linkedPointIdX;
|
|
|
- delete modifyPoint.linkedPointIdY;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- //end部分找到了与x接近的其他点
|
|
|
- if (Math.abs(position.x - endPoint.x) < Constant.minAdsorbPix) {
|
|
|
- if (!modifyPoint.linkedPointIdX) {
|
|
|
- modifyPoint.x = endPoint.x;
|
|
|
- modifyPoint.linkedPointIdX = curveRoad.endId;
|
|
|
- } else {
|
|
|
- const linkedPointX = dataService.getCurvePoint(
|
|
|
- modifyPoint.linkedPointIdX
|
|
|
- );
|
|
|
- if (
|
|
|
- mathUtil.getDistance(position, linkedPointX) >
|
|
|
- mathUtil.getDistance(position, endPoint)
|
|
|
- ) {
|
|
|
- modifyPoint.x = endPoint.x;
|
|
|
- modifyPoint.linkedPointIdX = curveRoad.endId;
|
|
|
+ //start部分找到了与x接近的其他点
|
|
|
+ if (
|
|
|
+ Math.abs(position.x - curveRoad.points[i].x) < Constant.minAdsorbPix
|
|
|
+ ) {
|
|
|
+ if (!modifyPoint.linkedPointIdX) {
|
|
|
+ modifyPoint.x = curveRoad.points[i].x;
|
|
|
+ modifyPoint.linkedPointIdX = curveRoad.points[i].vectorId;
|
|
|
+ } else {
|
|
|
+ const linkedPointX = dataService.getCurvePoint(
|
|
|
+ modifyPoint.linkedPointIdX
|
|
|
+ );
|
|
|
+ if (
|
|
|
+ mathUtil.getDistance(position, linkedPointX) >
|
|
|
+ mathUtil.getDistance(position, curveRoad.points[i])
|
|
|
+ ) {
|
|
|
+ modifyPoint.x = curveRoad.points[i].x;
|
|
|
+ modifyPoint.linkedPointIdX = curveRoad.points[i].vectorId;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- //end部分找到了与y接近的其他点
|
|
|
- if (Math.abs(position.y - endPoint.y) < Constant.minAdsorbPix) {
|
|
|
- if (!modifyPoint.linkedPointIdY) {
|
|
|
- modifyPoint.y = endPoint.y;
|
|
|
- modifyPoint.linkedPointIdY = curveRoad.endId;
|
|
|
- } else {
|
|
|
- const linkedPointY = dataService.getCurvePoint(
|
|
|
- modifyPoint.linkedPointIdY
|
|
|
- );
|
|
|
- if (
|
|
|
- mathUtil.getDistance(position, linkedPointY) >
|
|
|
- mathUtil.getDistance(position, endPoint)
|
|
|
- ) {
|
|
|
- modifyPoint.y = endPoint.y;
|
|
|
- modifyPoint.linkedPointIdY = curveRoad.endId;
|
|
|
+ //start部分找到了与y接近的其他点
|
|
|
+ if (
|
|
|
+ Math.abs(position.y - curveRoad.points[i].y) < Constant.minAdsorbPix
|
|
|
+ ) {
|
|
|
+ if (!modifyPoint.linkedPointIdY) {
|
|
|
+ modifyPoint.y = curveRoad.points[i].y;
|
|
|
+ modifyPoint.linkedPointIdY = curveRoad.points[i].vectorId;
|
|
|
+ } else {
|
|
|
+ const linkedPointY = dataService.getCurvePoint(
|
|
|
+ modifyPoint.linkedPointIdY
|
|
|
+ );
|
|
|
+ if (
|
|
|
+ mathUtil.getDistance(position, linkedPointY) >
|
|
|
+ mathUtil.getDistance(position, curveRoad.points[i])
|
|
|
+ ) {
|
|
|
+ modifyPoint.y = curveRoad.points[i].y;
|
|
|
+ modifyPoint.linkedPointIdY = curveRoad.points[i].vectorId;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- const result = {
|
|
|
- minPoint: min1,
|
|
|
- minRoad: min2,
|
|
|
- tagInfo: {},
|
|
|
+ return {
|
|
|
+ min1: min1,
|
|
|
+ min2: min2,
|
|
|
+ modifyPoint: modifyPoint,
|
|
|
+ _modifyPoint: _modifyPoint,
|
|
|
};
|
|
|
-
|
|
|
- if (_modifyPoint != null) {
|
|
|
- result.modifyPoint = JSON.parse(JSON.stringify(_modifyPoint));
|
|
|
- } else if (
|
|
|
- modifyPoint.hasOwnProperty("x") &&
|
|
|
- modifyPoint.hasOwnProperty("y")
|
|
|
- ) {
|
|
|
- result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
- } else if (modifyPoint.hasOwnProperty("x")) {
|
|
|
- result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
- result.modifyPoint.x = modifyPoint.x;
|
|
|
- result.modifyPoint.y = position.y;
|
|
|
- } else if (modifyPoint.hasOwnProperty("y")) {
|
|
|
- result.modifyPoint = JSON.parse(JSON.stringify(modifyPoint));
|
|
|
- result.modifyPoint.x = position.x;
|
|
|
- result.modifyPoint.y = modifyPoint.y;
|
|
|
- }
|
|
|
-
|
|
|
- // const tags = dataService.getTags();
|
|
|
- // for (const tagId in tags) {
|
|
|
- // const tag = dataService.getTag(tagId);
|
|
|
- // const location = tag.isContain(position);
|
|
|
- // if (location) {
|
|
|
- // result.tagInfo = {
|
|
|
- // tagId: tagId,
|
|
|
- // state: "all",
|
|
|
- // };
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
- return result;
|
|
|
}
|
|
|
|
|
|
// position用来判断是否在墙的symbol上
|