Changeset 11601 in josm for trunk/src/org/openstreetmap/josm/actions
- Timestamp:
- 2017-02-23T01:03:15+01:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
r11495 r11601 1005 1005 1006 1006 /** 1007 * Adjusts the position of a node to lie on a segment (or a segment 1008 * intersection). 1007 * Adjusts the position of a node to lie on a segment (or a segment intersection). 1009 1008 * 1010 1009 * If one or more than two segments are passed, the node is adjusted 1011 1010 * to lie on the first segment that is passed. 1012 1011 * 1013 * If two segments are passed, the node is adjusted to be at their 1014 * intersection. 1012 * If two segments are passed, the node is adjusted to be at their intersection. 1015 1013 * 1016 1014 * No action is taken if no segments are passed. … … 1020 1018 */ 1021 1019 private static void adjustNode(Collection<Pair<Node, Node>> segs, Node n) { 1022 1023 1020 switch (segs.size()) { 1024 1021 case 0: 1025 1022 return; 1026 1023 case 2: 1027 // This computes the intersection between the two segments and adjusts the node position. 1028 Iterator<Pair<Node, Node>> i = segs.iterator(); 1029 Pair<Node, Node> seg = i.next(); 1030 EastNorth pA = seg.a.getEastNorth(); 1031 EastNorth pB = seg.b.getEastNorth(); 1032 seg = i.next(); 1033 EastNorth pC = seg.a.getEastNorth(); 1034 EastNorth pD = seg.b.getEastNorth(); 1035 1036 double u = det(pB.east() - pA.east(), pB.north() - pA.north(), pC.east() - pD.east(), pC.north() - pD.north()); 1037 1038 // Check for parallel segments and do nothing if they are 1039 // In practice this will probably only happen when a way has been duplicated 1040 1041 if (u == 0) 1042 return; 1043 1044 // q is a number between 0 and 1 1045 // It is the point in the segment where the intersection occurs 1046 // if the segment is scaled to lenght 1 1047 1048 double q = det(pB.north() - pC.north(), pB.east() - pC.east(), pD.north() - pC.north(), pD.east() - pC.east()) / u; 1049 EastNorth intersection = new EastNorth( 1050 pB.east() + q * (pA.east() - pB.east()), 1051 pB.north() + q * (pA.north() - pB.north())); 1052 1053 1054 // only adjust to intersection if within snapToIntersectionThreshold pixel of mouse click; otherwise 1055 // fall through to default action. 1056 // (for semi-parallel lines, intersection might be miles away!) 1057 if (Main.map.mapView.getPoint2D(n).distance(Main.map.mapView.getPoint2D(intersection)) < SNAP_TO_INTERSECTION_THRESHOLD.get()) { 1058 n.setEastNorth(intersection); 1059 return; 1060 } 1024 adjustNodeTwoSegments(segs, n); 1025 break; 1061 1026 default: 1062 EastNorth p = n.getEastNorth(); 1063 seg = segs.iterator().next(); 1064 pA = seg.a.getEastNorth(); 1065 pB = seg.b.getEastNorth(); 1066 double a = p.distanceSq(pB); 1067 double b = p.distanceSq(pA); 1068 double c = pA.distanceSq(pB); 1069 q = (a - b + c) / (2*c); 1070 n.setEastNorth(new EastNorth(pB.east() + q * (pA.east() - pB.east()), pB.north() + q * (pA.north() - pB.north()))); 1071 } 1027 adjustNodeDefault(segs, n); 1028 } 1029 } 1030 1031 private static void adjustNodeTwoSegments(Collection<Pair<Node, Node>> segs, Node n) { 1032 // This computes the intersection between the two segments and adjusts the node position. 1033 Iterator<Pair<Node, Node>> i = segs.iterator(); 1034 Pair<Node, Node> seg = i.next(); 1035 EastNorth pA = seg.a.getEastNorth(); 1036 EastNorth pB = seg.b.getEastNorth(); 1037 seg = i.next(); 1038 EastNorth pC = seg.a.getEastNorth(); 1039 EastNorth pD = seg.b.getEastNorth(); 1040 1041 double u = det(pB.east() - pA.east(), pB.north() - pA.north(), pC.east() - pD.east(), pC.north() - pD.north()); 1042 1043 // Check for parallel segments and do nothing if they are 1044 // In practice this will probably only happen when a way has been duplicated 1045 1046 if (u == 0) 1047 return; 1048 1049 // q is a number between 0 and 1 1050 // It is the point in the segment where the intersection occurs 1051 // if the segment is scaled to length 1 1052 1053 double q = det(pB.north() - pC.north(), pB.east() - pC.east(), pD.north() - pC.north(), pD.east() - pC.east()) / u; 1054 EastNorth intersection = new EastNorth( 1055 pB.east() + q * (pA.east() - pB.east()), 1056 pB.north() + q * (pA.north() - pB.north())); 1057 1058 1059 // only adjust to intersection if within snapToIntersectionThreshold pixel of mouse click; otherwise 1060 // fall through to default action. 1061 // (for semi-parallel lines, intersection might be miles away!) 1062 if (Main.map.mapView.getPoint2D(n).distance(Main.map.mapView.getPoint2D(intersection)) < SNAP_TO_INTERSECTION_THRESHOLD.get()) { 1063 n.setEastNorth(intersection); 1064 return; 1065 } 1066 1067 adjustNodeDefault(segs, n); 1068 } 1069 1070 private static void adjustNodeDefault(Collection<Pair<Node, Node>> segs, Node n) { 1071 EastNorth p = n.getEastNorth(); 1072 Pair<Node, Node> seg = segs.iterator().next(); 1073 EastNorth pA = seg.a.getEastNorth(); 1074 EastNorth pB = seg.b.getEastNorth(); 1075 double a = p.distanceSq(pB); 1076 double b = p.distanceSq(pA); 1077 double c = pA.distanceSq(pB); 1078 double q = (a - b + c) / (2*c); 1079 n.setEastNorth(new EastNorth(pB.east() + q * (pA.east() - pB.east()), pB.north() + q * (pA.north() - pB.north()))); 1072 1080 } 1073 1081
Note:
See TracChangeset
for help on using the changeset viewer.