From 4fa08fd6f6c98e3c48dd92f7cdc305e251acba75 Mon Sep 17 00:00:00 2001 From: Alessio Parmeggiani Date: Mon, 28 Mar 2022 17:30:58 +0200 Subject: [PATCH] add files --- data/README.txt | 18 + data/slam2d_range_only_ground_truth.g2o | 2442 +++++++++++++++++ data/slam2d_range_only_initial_guess.g2o | 2381 ++++++++++++++++ landmark_plot.png | Bin 0 -> 29519 bytes main.m | 76 + tools/algorithms/LeastSquaresUtils.m | 100 + tools/algorithms/estimateLandmarkPosition.m | 38 + tools/algorithms/evaluate.m | 24 + tools/algorithms/initGuess.m | 86 + tools/algorithms/leastSquares.m | 117 + tools/algorithms/poseFromId.m | 16 + tools/algorithms/tuning.m | 25 + tools/g2o_wrapper/@Quaternion/Quaternion.m | 144 + tools/g2o_wrapper/@Quaternion/char.m | 27 + tools/g2o_wrapper/@Quaternion/display.m | 31 + tools/g2o_wrapper/@Quaternion/dot.m | 25 + tools/g2o_wrapper/@Quaternion/double.m | 29 + tools/g2o_wrapper/@Quaternion/interp.m | 63 + tools/g2o_wrapper/@Quaternion/inv.m | 27 + tools/g2o_wrapper/@Quaternion/minus.m | 30 + tools/g2o_wrapper/@Quaternion/mpower.m | 42 + tools/g2o_wrapper/@Quaternion/mrdivide.m | 35 + tools/g2o_wrapper/@Quaternion/mtimes.m | 74 + tools/g2o_wrapper/@Quaternion/norm.m | 27 + tools/g2o_wrapper/@Quaternion/plotQuat.m | 43 + tools/g2o_wrapper/@Quaternion/plus.m | 30 + tools/g2o_wrapper/@Quaternion/q2tr.m | 35 + tools/g2o_wrapper/@Quaternion/qinterp.m | 60 + tools/g2o_wrapper/@Quaternion/scale.m | 61 + tools/g2o_wrapper/@Quaternion/subsref.m | 81 + tools/g2o_wrapper/@Quaternion/unit.m | 28 + tools/g2o_wrapper/README | 30 + tools/g2o_wrapper/addLandmark.m | 48 + tools/g2o_wrapper/graphics/draw_EDGE_SE2.m | 17 + tools/g2o_wrapper/graphics/draw_EDGE_SE2_XY.m | 17 + .../g2o_wrapper/graphics/draw_EDGE_SE3_QUAT.m | 18 + tools/g2o_wrapper/graphics/draw_SE3_frame.m | 13 + .../graphics/draw_VERTEX_SE3_QUAT.m | 31 + .../graphics/draw_VERTEX_TRACKXYZ.m | 5 + tools/g2o_wrapper/graphics/linear_solver.cc | 32 + tools/g2o_wrapper/landmark.m | 54 + tools/g2o_wrapper/loadG2o.m | 183 ++ tools/g2o_wrapper/observation.m | 39 + tools/g2o_wrapper/pose.m | 41 + tools/g2o_wrapper/searchById.m | 48 + tools/g2o_wrapper/transition.m | 40 + tools/my_visualization/myPlot.m | 99 + tools/utilities/geometry_helpers_2d.m | 32 + tools/visualization/circleAsPolygon.m | 66 + tools/visualization/clearObservations.m | 37 + tools/visualization/drawArrow.m | 177 ++ tools/visualization/drawBelief.m | 12 + tools/visualization/drawCircle.m | 124 + tools/visualization/drawLabels.m | 100 + tools/visualization/drawLandmarks.m | 20 + tools/visualization/drawLandmarks_slam.m | 22 + tools/visualization/drawLine.m | 210 ++ tools/visualization/drawMap.m | 19 + tools/visualization/drawObservations.m | 43 + tools/visualization/drawObservationsBayes.m | 21 + tools/visualization/drawParticles.m | 20 + tools/visualization/drawPolygon.m | 145 + tools/visualization/drawRect.m | 96 + tools/visualization/drawRectangle.m | 6 + tools/visualization/drawRobot.m | 9 + tools/visualization/drawShape.m | 111 + tools/visualization/drawTrajectoryXY.m | 15 + tools/visualization/fillPolygon.m | 106 + tools/visualization/plotState.m | 50 + tools/visualization/plotStateEKFSLAM.m | 36 + tools/visualization/plotStatePF.m | 11 + tools/visualization/plotcov2d.m | 50 + tools/visualization/polygons2d.m | 172 ++ tools/visualization/rectAsPolygon.m | 74 + trajectory_plot.png | Bin 0 -> 59366 bytes 75 files changed, 8714 insertions(+) create mode 100644 data/README.txt create mode 100644 data/slam2d_range_only_ground_truth.g2o create mode 100644 data/slam2d_range_only_initial_guess.g2o create mode 100644 landmark_plot.png create mode 100644 main.m create mode 100644 tools/algorithms/LeastSquaresUtils.m create mode 100644 tools/algorithms/estimateLandmarkPosition.m create mode 100644 tools/algorithms/evaluate.m create mode 100644 tools/algorithms/initGuess.m create mode 100644 tools/algorithms/leastSquares.m create mode 100644 tools/algorithms/poseFromId.m create mode 100644 tools/algorithms/tuning.m create mode 100644 tools/g2o_wrapper/@Quaternion/Quaternion.m create mode 100644 tools/g2o_wrapper/@Quaternion/char.m create mode 100644 tools/g2o_wrapper/@Quaternion/display.m create mode 100644 tools/g2o_wrapper/@Quaternion/dot.m create mode 100644 tools/g2o_wrapper/@Quaternion/double.m create mode 100644 tools/g2o_wrapper/@Quaternion/interp.m create mode 100644 tools/g2o_wrapper/@Quaternion/inv.m create mode 100644 tools/g2o_wrapper/@Quaternion/minus.m create mode 100644 tools/g2o_wrapper/@Quaternion/mpower.m create mode 100644 tools/g2o_wrapper/@Quaternion/mrdivide.m create mode 100644 tools/g2o_wrapper/@Quaternion/mtimes.m create mode 100644 tools/g2o_wrapper/@Quaternion/norm.m create mode 100644 tools/g2o_wrapper/@Quaternion/plotQuat.m create mode 100644 tools/g2o_wrapper/@Quaternion/plus.m create mode 100644 tools/g2o_wrapper/@Quaternion/q2tr.m create mode 100644 tools/g2o_wrapper/@Quaternion/qinterp.m create mode 100644 tools/g2o_wrapper/@Quaternion/scale.m create mode 100644 tools/g2o_wrapper/@Quaternion/subsref.m create mode 100644 tools/g2o_wrapper/@Quaternion/unit.m create mode 100644 tools/g2o_wrapper/README create mode 100644 tools/g2o_wrapper/addLandmark.m create mode 100644 tools/g2o_wrapper/graphics/draw_EDGE_SE2.m create mode 100644 tools/g2o_wrapper/graphics/draw_EDGE_SE2_XY.m create mode 100644 tools/g2o_wrapper/graphics/draw_EDGE_SE3_QUAT.m create mode 100644 tools/g2o_wrapper/graphics/draw_SE3_frame.m create mode 100644 tools/g2o_wrapper/graphics/draw_VERTEX_SE3_QUAT.m create mode 100644 tools/g2o_wrapper/graphics/draw_VERTEX_TRACKXYZ.m create mode 100644 tools/g2o_wrapper/graphics/linear_solver.cc create mode 100644 tools/g2o_wrapper/landmark.m create mode 100644 tools/g2o_wrapper/loadG2o.m create mode 100644 tools/g2o_wrapper/observation.m create mode 100644 tools/g2o_wrapper/pose.m create mode 100644 tools/g2o_wrapper/searchById.m create mode 100644 tools/g2o_wrapper/transition.m create mode 100644 tools/my_visualization/myPlot.m create mode 100644 tools/utilities/geometry_helpers_2d.m create mode 100644 tools/visualization/circleAsPolygon.m create mode 100644 tools/visualization/clearObservations.m create mode 100644 tools/visualization/drawArrow.m create mode 100644 tools/visualization/drawBelief.m create mode 100644 tools/visualization/drawCircle.m create mode 100644 tools/visualization/drawLabels.m create mode 100644 tools/visualization/drawLandmarks.m create mode 100644 tools/visualization/drawLandmarks_slam.m create mode 100644 tools/visualization/drawLine.m create mode 100644 tools/visualization/drawMap.m create mode 100644 tools/visualization/drawObservations.m create mode 100644 tools/visualization/drawObservationsBayes.m create mode 100644 tools/visualization/drawParticles.m create mode 100644 tools/visualization/drawPolygon.m create mode 100644 tools/visualization/drawRect.m create mode 100644 tools/visualization/drawRectangle.m create mode 100644 tools/visualization/drawRobot.m create mode 100644 tools/visualization/drawShape.m create mode 100644 tools/visualization/drawTrajectoryXY.m create mode 100644 tools/visualization/fillPolygon.m create mode 100644 tools/visualization/plotState.m create mode 100644 tools/visualization/plotStateEKFSLAM.m create mode 100644 tools/visualization/plotStatePF.m create mode 100644 tools/visualization/plotcov2d.m create mode 100644 tools/visualization/polygons2d.m create mode 100644 tools/visualization/rectAsPolygon.m create mode 100644 trajectory_plot.png diff --git a/data/README.txt b/data/README.txt new file mode 100644 index 0000000..066d318 --- /dev/null +++ b/data/README.txt @@ -0,0 +1,18 @@ +Project 03 - Range only SLAM + +The dataset is composed by a g2o file which contain poses and range observations. The file contain also odometry edges that are used to construct the initial guess +for the problem. The use of those edges is your own choice if you think it's necessary. + +Hint : + + - Parse the whole dataset and initialize the landmarks by using at least 3 range observations with the proper parallax + - Setup a LS optimization that involves all the poses and landmarks that you have initialized + - In the range edges the ID of the landmarkd is reported, use it to identify them for both the initialization and the global optimization + + -EDGE_RANGE_SE2_XY id_pose id_landmark range + +Expected output : + - Robot trajectory and Map + + +For any question concerning the initialization part feel free to contact me diff --git a/data/slam2d_range_only_ground_truth.g2o b/data/slam2d_range_only_ground_truth.g2o new file mode 100644 index 0000000..f7cbe32 --- /dev/null +++ b/data/slam2d_range_only_ground_truth.g2o @@ -0,0 +1,2442 @@ +VERTEX_XY 1 14.0658 -8.37047 +VERTEX_XY 2 -5.77211 1.44611 +VERTEX_XY 7 -6.08279 -14.8601 +VERTEX_XY 9 11.3436 0.137351 +VERTEX_XY 10 8.92508 -4.14389 +VERTEX_XY 13 -0.746764 -2.32079 +VERTEX_XY 14 -9.77714 -5.95711 +VERTEX_XY 15 8.91726 -5.49336 +VERTEX_XY 16 11.1647 -10.5165 +VERTEX_XY 19 -0.297143 4.91945 +VERTEX_XY 20 -11.1944 -8.68599 +VERTEX_XY 22 -2.73315 -1.23563 +VERTEX_XY 25 6.15219 -14.9139 +VERTEX_XY 26 6.2977 4.33841 +VERTEX_XY 29 9.23495 -14.4556 +VERTEX_XY 31 13.1959 -2.60848 +VERTEX_XY 32 -2.30025 2.43828 +VERTEX_XY 35 14.6548 -5.01351 +VERTEX_XY 36 -5.99044 -14.6131 +VERTEX_XY 41 2.823 7.00045 +VERTEX_XY 42 5.84457 5.41798 +VERTEX_XY 43 -3.23636 1.86123 +VERTEX_XY 44 -8.77672 0.822944 +VERTEX_XY 45 -2.86347 -4.39619 +VERTEX_XY 46 2.78466 -4.30502 +VERTEX_XY 47 13.9383 -10.3552 +VERTEX_XY 48 -3.15238 -3.36689 +VERTEX_XY 49 6.80396 -3.33828 +VERTEX_XY 50 12.8122 -1.88791 +VERTEX_XY 51 10.8706 3.63192 +VERTEX_XY 52 -11.4223 -0.856782 +VERTEX_XY 53 -4.80349 0.904901 +VERTEX_XY 56 0.165324 1.76121 +VERTEX_XY 57 0.0979628 -1.10438 +VERTEX_XY 58 1.39956 -1.55643 +VERTEX_XY 59 10.621 3.16894 +VERTEX_XY 62 -4.11559 5.37451 +VERTEX_XY 65 7.49912 -11.012 +VERTEX_XY 66 14.4613 -12.1338 +VERTEX_XY 70 1.02888 -1.82746 +VERTEX_XY 71 -9.00124 -10.8902 +VERTEX_XY 73 -13.7754 -7.45916 +VERTEX_XY 76 -5.93894 -13.5848 +VERTEX_XY 77 -7.59996 1.30688 +VERTEX_XY 78 11.6178 -4.67891 +VERTEX_XY 79 -13.9682 -10.1648 +VERTEX_XY 80 11.3091 -8.68341 +VERTEX_XY 81 -6.82486 -0.222868 +VERTEX_XY 82 -8.33308 -0.291274 +VERTEX_XY 83 13.64 4.57186 +VERTEX_XY 84 7.72301 -1.92527 +VERTEX_XY 85 1.56498 -13.3945 +VERTEX_XY 86 -5.31918 -2.82293 +VERTEX_XY 88 -7.23039 -11.1235 +VERTEX_XY 89 -0.188908 -3.62815 +VERTEX_XY 90 6.53631 -6.35844 +VERTEX_XY 92 -5.6105 -3.39949 +VERTEX_XY 94 5.07358 -3.61194 +VERTEX_XY 95 -1.23217 -5.88187 +VERTEX_XY 96 12.314 -0.330222 +VERTEX_XY 97 7.66433 -11.7496 +VERTEX_SE2 1100 -0.009456 0.021667 -0.007264 +VERTEX_SE2 1101 -0.002866 0.027636 1.570050 +VERTEX_SE2 1102 -0.019467 1.020770 1.570170 +VERTEX_SE2 1103 0.002422 1.996110 1.558400 +VERTEX_SE2 1104 0.006536 2.988300 1.569660 +VERTEX_SE2 1105 0.010981 2.992110 0.000731 +VERTEX_SE2 1106 1.017160 3.019540 0.006987 +VERTEX_SE2 1107 1.003920 3.003990 -1.579440 +VERTEX_SE2 1108 1.023320 3.012980 -0.010171 +VERTEX_SE2 1109 1.005460 3.012700 -1.565630 +VERTEX_SE2 1110 1.021280 2.025390 -1.572010 +VERTEX_SE2 1111 1.030240 1.013800 -1.573510 +VERTEX_SE2 1112 1.007360 1.011700 -0.002532 +VERTEX_SE2 1113 1.998130 1.017500 -0.001438 +VERTEX_SE2 1114 2.992200 0.991649 0.002973 +VERTEX_SE2 1115 3.001890 1.019550 1.575560 +VERTEX_SE2 1116 2.995060 1.015190 0.001691 +VERTEX_SE2 1117 3.966860 1.026800 0.000030 +VERTEX_SE2 1118 5.007050 1.028870 0.002843 +VERTEX_SE2 1119 6.011610 1.016370 0.002875 +VERTEX_SE2 1120 6.994670 1.020580 0.003857 +VERTEX_SE2 1121 8.012980 1.003870 0.001922 +VERTEX_SE2 1122 7.995250 1.030520 1.572320 +VERTEX_SE2 1123 7.990800 1.017800 0.004838 +VERTEX_SE2 1124 8.989350 1.024620 -0.000970 +VERTEX_SE2 1125 9.976100 1.004040 0.000549 +VERTEX_SE2 1126 10.989200 1.036540 -0.005061 +VERTEX_SE2 1127 11.965200 1.037690 -0.007795 +VERTEX_SE2 1128 12.978900 1.014710 -0.001970 +VERTEX_SE2 1129 13.981700 1.021420 -3.141300 +VERTEX_SE2 1130 12.985600 1.003430 -3.137620 +VERTEX_SE2 1131 11.981700 1.004970 -3.138970 +VERTEX_SE2 1132 11.992400 1.008990 1.572890 +VERTEX_SE2 1133 11.993400 1.019670 -0.005476 +VERTEX_SE2 1134 12.006500 1.020890 -1.580360 +VERTEX_SE2 1135 12.004400 0.022883 -1.565030 +VERTEX_SE2 1136 11.993000 -0.978789 -1.569380 +VERTEX_SE2 1137 11.977400 -1.965520 -1.567750 +VERTEX_SE2 1138 11.983100 -1.964510 0.008217 +VERTEX_SE2 1139 13.020800 -1.977840 -0.008315 +VERTEX_SE2 1140 13.980600 -1.986070 3.140340 +VERTEX_SE2 1141 13.002800 -1.979280 3.136610 +VERTEX_SE2 1142 11.981000 -1.984730 -3.135630 +VERTEX_SE2 1143 10.985700 -1.984080 3.140830 +VERTEX_SE2 1144 9.993950 -1.971570 -3.141370 +VERTEX_SE2 1145 9.991360 -1.993030 -1.570790 +VERTEX_SE2 1146 9.993980 -3.011150 -1.568380 +VERTEX_SE2 1147 9.995960 -3.985330 -1.572370 +VERTEX_SE2 1148 9.969860 -4.998060 -1.569550 +VERTEX_SE2 1149 9.996100 -5.992240 -1.570060 +VERTEX_SE2 1150 9.990610 -6.993720 -1.578180 +VERTEX_SE2 1151 9.985390 -8.006440 -1.570460 +VERTEX_SE2 1152 10.009600 -9.002080 -1.572260 +VERTEX_SE2 1153 9.988860 -9.978610 -1.571780 +VERTEX_SE2 1154 9.980320 -11.022600 -1.567460 +VERTEX_SE2 1155 9.971600 -11.983800 -1.572120 +VERTEX_SE2 1156 9.986680 -12.979600 -1.572640 +VERTEX_SE2 1157 9.990060 -13.013700 1.574890 +VERTEX_SE2 1158 9.998030 -11.975000 1.572960 +VERTEX_SE2 1159 9.978380 -10.990900 1.569600 +VERTEX_SE2 1160 9.983010 -10.979200 -3.140340 +VERTEX_SE2 1161 9.023330 -11.002000 3.132480 +VERTEX_SE2 1162 9.015350 -10.989400 1.570500 +VERTEX_SE2 1163 9.003350 -10.973400 -0.010933 +VERTEX_SE2 1164 9.995590 -10.987900 -0.001020 +VERTEX_SE2 1165 10.995000 -11.016000 -0.001505 +VERTEX_SE2 1166 12.010700 -10.990400 -0.006814 +VERTEX_SE2 1167 12.006000 -11.014500 -1.569010 +VERTEX_SE2 1168 11.967400 -11.991900 -1.568590 +VERTEX_SE2 1169 11.998900 -12.982100 -1.567970 +VERTEX_SE2 1170 12.003700 -13.005300 1.570480 +VERTEX_SE2 1171 12.017000 -12.001900 1.578670 +VERTEX_SE2 1172 11.984100 -11.004700 1.570660 +VERTEX_SE2 1173 11.997300 -9.978520 1.571970 +VERTEX_SE2 1174 11.987100 -8.983250 1.571830 +VERTEX_SE2 1175 11.979000 -8.977020 -3.135660 +VERTEX_SE2 1176 12.004100 -8.986260 1.570700 +VERTEX_SE2 1177 12.024300 -7.979500 1.577410 +VERTEX_SE2 1178 12.004400 -7.001760 1.573290 +VERTEX_SE2 1179 11.992000 -6.976120 -0.006725 +VERTEX_SE2 1180 12.973600 -6.991340 -0.004797 +VERTEX_SE2 1181 13.979500 -7.002480 -3.141370 +VERTEX_SE2 1182 12.991600 -6.996890 3.139230 +VERTEX_SE2 1183 12.010400 -6.995190 3.138870 +VERTEX_SE2 1184 12.017100 -7.005380 -1.576130 +VERTEX_SE2 1185 11.982300 -7.981590 -1.569940 +VERTEX_SE2 1186 11.989200 -7.992290 0.002509 +VERTEX_SE2 1187 12.968000 -8.004380 -0.001566 +VERTEX_SE2 1188 13.991900 -8.010000 -3.141440 +VERTEX_SE2 1189 12.985800 -7.995910 3.139370 +VERTEX_SE2 1190 11.986900 -7.987900 -3.141050 +VERTEX_SE2 1191 11.965800 -7.995440 -1.570050 +VERTEX_SE2 1192 12.002700 -7.967200 -3.140640 +VERTEX_SE2 1193 10.990800 -7.963760 -3.140530 +VERTEX_SE2 1194 9.990800 -7.995740 -3.137740 +VERTEX_SE2 1195 9.987810 -7.987070 -1.569050 +VERTEX_SE2 1196 9.992130 -8.986660 -1.576030 +VERTEX_SE2 1197 10.007800 -9.972730 -1.576400 +VERTEX_SE2 1198 9.977700 -10.983200 -1.584150 +VERTEX_SE2 1199 9.982330 -11.992400 -1.569910 +VERTEX_SE2 1200 9.997170 -11.995200 -3.140830 +VERTEX_SE2 1201 8.981570 -11.992500 3.140310 +VERTEX_SE2 1202 7.956530 -12.011300 3.139920 +VERTEX_SE2 1203 6.992070 -11.993600 3.136880 +VERTEX_SE2 1204 5.986400 -11.984500 -3.140950 +VERTEX_SE2 1205 4.958770 -11.972000 3.134460 +VERTEX_SE2 1206 3.968430 -12.046500 -3.139340 +VERTEX_SE2 1207 3.978560 -12.004600 -1.563760 +VERTEX_SE2 1208 3.987240 -12.023900 0.011661 +VERTEX_SE2 1209 5.018210 -11.989000 -0.000709 +VERTEX_SE2 1210 6.001130 -11.997300 -0.005680 +VERTEX_SE2 1211 5.989490 -12.004800 -1.574420 +VERTEX_SE2 1212 6.002560 -12.013100 3.134000 +VERTEX_SE2 1213 4.983420 -11.992100 3.141250 +VERTEX_SE2 1214 4.000690 -12.016700 -3.134590 +VERTEX_SE2 1215 2.942800 -12.000400 3.140390 +VERTEX_SE2 1216 1.982650 -11.978400 -3.140050 +VERTEX_SE2 1217 0.948580 -12.016200 -3.125160 +VERTEX_SE2 1218 -0.070490 -12.016700 -3.138800 +VERTEX_SE2 1219 -0.965992 -12.017700 3.134350 +VERTEX_SE2 1220 -1.970650 -12.000200 -3.140460 +VERTEX_SE2 1221 -2.974440 -12.028100 3.140550 +VERTEX_SE2 1222 -3.951460 -12.009200 3.135140 +VERTEX_SE2 1223 -3.983190 -12.034700 1.562670 +VERTEX_SE2 1224 -3.978150 -11.065900 1.571470 +VERTEX_SE2 1225 -3.959280 -9.998520 1.574800 +VERTEX_SE2 1226 -3.984500 -9.022730 1.578150 +VERTEX_SE2 1227 -3.962420 -7.977930 1.571470 +VERTEX_SE2 1228 -3.983830 -6.987890 1.574190 +VERTEX_SE2 1229 -3.995120 -5.982810 1.572960 +VERTEX_SE2 1230 -3.994880 -5.980310 -0.004290 +VERTEX_SE2 1231 -3.013480 -5.971830 -0.002017 +VERTEX_SE2 1232 -1.985590 -5.968110 -0.004351 +VERTEX_SE2 1233 -0.999605 -5.978620 -0.000878 +VERTEX_SE2 1234 0.031618 -5.980980 0.005367 +VERTEX_SE2 1235 1.020820 -5.975830 0.002913 +VERTEX_SE2 1236 1.991890 -6.018570 -0.005536 +VERTEX_SE2 1237 2.998980 -6.001540 0.003726 +VERTEX_SE2 1238 4.001380 -5.968320 0.001851 +VERTEX_SE2 1239 4.006350 -5.988740 1.570030 +VERTEX_SE2 1240 4.021710 -5.992230 -3.134030 +VERTEX_SE2 1241 3.008840 -5.982490 -3.140080 +VERTEX_SE2 1242 2.022870 -5.960170 -3.138190 +VERTEX_SE2 1243 1.011360 -5.992320 -3.137320 +VERTEX_SE2 1244 1.000890 -5.997830 -1.574720 +VERTEX_SE2 1245 1.000170 -6.977540 -1.567320 +VERTEX_SE2 1246 1.014240 -7.948940 -1.565790 +VERTEX_SE2 1247 1.021650 -8.975440 -1.579660 +VERTEX_SE2 1248 1.065760 -9.992640 -1.592440 +VERTEX_SE2 1249 0.957938 -10.968800 -1.567760 +VERTEX_SE2 1250 0.916452 -10.983700 3.140730 +VERTEX_SE2 1251 -0.062305 -10.992400 -3.140360 +VERTEX_SE2 1252 -1.046060 -11.003600 -3.124800 +VERTEX_SE2 1253 -2.040500 -10.962800 3.137840 +VERTEX_SE2 1254 -1.991040 -10.974000 1.581300 +VERTEX_SE2 1255 -1.988710 -9.994770 1.575070 +VERTEX_SE2 1256 -1.984910 -9.015860 1.569660 +VERTEX_SE2 1257 -2.005460 -9.003800 3.136300 +VERTEX_SE2 1258 -3.012080 -8.978870 3.135590 +VERTEX_SE2 1259 -3.986980 -8.991800 3.137570 +VERTEX_SE2 1260 -4.996150 -9.019320 3.138840 +VERTEX_SE2 1261 -5.982620 -9.026810 3.141530 +VERTEX_SE2 1262 -6.984280 -9.012020 -3.138900 +VERTEX_SE2 1263 -7.974700 -9.037160 3.136920 +VERTEX_SE2 1264 -8.987640 -9.020950 -3.133920 +VERTEX_SE2 1265 -9.949840 -8.984150 -3.128360 +VERTEX_SE2 1266 -9.981830 -9.000070 1.579930 +VERTEX_SE2 1267 -9.963670 -8.004710 1.582020 +VERTEX_SE2 1268 -9.980900 -7.018680 1.574830 +VERTEX_SE2 1269 -10.003300 -5.988550 1.588880 +VERTEX_SE2 1270 -9.977660 -5.034220 1.579740 +VERTEX_SE2 1271 -9.988000 -3.994390 1.578970 +VERTEX_SE2 1272 -9.976520 -3.979140 0.005997 +VERTEX_SE2 1273 -8.992050 -3.998160 0.006855 +VERTEX_SE2 1274 -7.987270 -3.999570 0.005581 +VERTEX_SE2 1275 -7.009820 -3.982530 0.002549 +VERTEX_SE2 1276 -6.981480 -4.006410 1.578450 +VERTEX_SE2 1277 -7.015510 -2.993040 1.571980 +VERTEX_SE2 1278 -6.992060 -2.018650 1.581560 +VERTEX_SE2 1279 -7.014650 -0.999349 1.580560 +VERTEX_SE2 1280 -7.016450 0.005711 1.574360 +VERTEX_SE2 1281 -7.019170 0.018821 -3.133510 +VERTEX_SE2 1282 -8.024320 0.017115 -3.128450 +VERTEX_SE2 1283 -8.019340 -0.000268 -1.558660 +VERTEX_SE2 1284 -8.005250 -0.005880 0.000875 +VERTEX_SE2 1285 -7.027210 0.012983 0.005294 +VERTEX_SE2 1286 -6.000610 0.021221 -0.000812 +VERTEX_SE2 1287 -4.994890 0.019340 0.000315 +VERTEX_SE2 1288 -4.006410 0.007023 0.001171 +VERTEX_SE2 1289 -2.979410 0.015035 -0.003714 +VERTEX_SE2 1290 -2.003090 0.011329 0.001975 +VERTEX_SE2 1291 -0.986657 0.021236 -0.004032 +VERTEX_SE2 1292 0.027106 0.030119 -0.004531 +VERTEX_SE2 1293 1.018500 0.015459 -0.001683 +VERTEX_SE2 1294 0.997997 0.020459 1.575890 +VERTEX_SE2 1295 1.014260 0.016011 0.008203 +VERTEX_SE2 1296 2.031290 0.016559 0.000677 +VERTEX_SE2 1297 2.993160 -0.004059 -0.008802 +VERTEX_SE2 1298 3.984150 -0.037046 0.005848 +VERTEX_SE2 1299 4.985970 0.001939 0.002166 +VERTEX_SE2 1300 5.971290 -0.000143 -0.002832 +VERTEX_SE2 1301 7.005090 0.021552 0.002652 +VERTEX_SE2 1302 7.006010 0.013510 -1.567220 +VERTEX_SE2 1303 6.979940 -0.995787 -1.561750 +VERTEX_SE2 1304 6.988870 -1.005900 0.005249 +VERTEX_SE2 1305 7.014680 -0.978315 -1.579540 +VERTEX_SE2 1306 7.001850 -0.989711 3.136550 +VERTEX_SE2 1307 7.017260 -0.963577 -1.573880 +VERTEX_SE2 1308 6.988330 -1.985930 -1.570530 +VERTEX_SE2 1309 7.004440 -1.977940 -0.001804 +VERTEX_SE2 1310 6.986130 -1.983220 1.569700 +VERTEX_SE2 1311 7.006020 -0.959960 1.572750 +VERTEX_SE2 1312 7.008870 0.018463 1.574370 +VERTEX_SE2 1313 6.987840 -0.000585 -3.135250 +VERTEX_SE2 1314 6.990170 0.023195 -1.564910 +VERTEX_SE2 1315 7.007970 0.015383 -0.000635 +VERTEX_SE2 1316 7.995200 0.015204 -0.001564 +VERTEX_SE2 1317 8.970140 0.033217 -0.004452 +VERTEX_SE2 1318 9.994130 0.017748 0.004775 +VERTEX_SE2 1319 10.983400 0.036716 0.002688 +VERTEX_SE2 1320 11.990100 0.009790 -0.004849 +VERTEX_SE2 1321 12.995400 0.027337 0.003627 +VERTEX_SE2 1322 13.996000 0.021970 -3.140640 +VERTEX_SE2 1323 13.000700 0.031400 3.137940 +VERTEX_SE2 1324 12.009300 0.016012 -3.141330 +VERTEX_SE2 1325 11.990800 0.032354 -1.570270 +VERTEX_SE2 1326 11.991600 -0.977849 -1.569210 +VERTEX_SE2 1327 11.991300 -1.977530 -1.568230 +VERTEX_SE2 1328 11.986000 -2.963400 -1.569740 +VERTEX_SE2 1329 11.985200 -3.989330 -1.571380 +VERTEX_SE2 1330 11.999700 -4.979540 -1.567550 +VERTEX_SE2 1331 11.998600 -6.000670 -1.568030 +VERTEX_SE2 1332 11.994500 -7.001080 -1.570890 +VERTEX_SE2 1333 12.002100 -7.985280 -1.570030 +VERTEX_SE2 1334 11.987800 -8.986250 -1.571910 +VERTEX_SE2 1335 12.002200 -10.004100 -1.570290 +VERTEX_SE2 1336 11.987800 -10.979100 -1.567640 +VERTEX_SE2 1337 12.001900 -11.980300 -1.569910 +VERTEX_SE2 1338 11.947100 -12.002800 3.141510 +VERTEX_SE2 1339 10.990300 -11.984300 -3.138100 +VERTEX_SE2 1340 10.000500 -11.997000 3.138630 +VERTEX_SE2 1341 8.994020 -11.995600 3.130370 +VERTEX_SE2 1342 8.980600 -11.984300 -1.570300 +VERTEX_SE2 1343 8.995820 -11.992300 3.134690 +VERTEX_SE2 1344 7.959380 -11.979600 -3.137240 +VERTEX_SE2 1345 7.022070 -12.009700 3.130610 +VERTEX_SE2 1346 5.975720 -11.958600 -3.139060 +VERTEX_SE2 1347 6.000740 -11.960000 1.567100 +VERTEX_SE2 1348 5.993950 -10.984000 1.571050 +VERTEX_SE2 1349 5.987610 -9.988810 1.578750 +VERTEX_SE2 1350 6.011170 -9.042930 1.580790 +VERTEX_SE2 1351 6.012200 -8.986610 -0.001031 +VERTEX_SE2 1352 6.993590 -9.000120 -0.001026 +VERTEX_SE2 1353 7.982470 -8.982110 0.003001 +VERTEX_SE2 1354 7.985260 -8.988530 1.575430 +VERTEX_SE2 1355 7.991920 -8.001160 1.566150 +VERTEX_SE2 1356 8.001700 -7.985470 0.001263 +VERTEX_SE2 1357 7.997080 -7.980350 1.569080 +VERTEX_SE2 1358 8.006930 -6.980040 1.569770 +VERTEX_SE2 1359 7.972180 -5.994060 1.569890 +VERTEX_SE2 1360 7.990380 -5.001750 1.576620 +VERTEX_SE2 1361 7.987130 -3.973590 1.575690 +VERTEX_SE2 1362 7.997750 -3.980830 -3.139730 +VERTEX_SE2 1363 6.973880 -3.975470 -3.139800 +VERTEX_SE2 1364 6.974770 -3.983730 -1.575290 +VERTEX_SE2 1365 6.966090 -4.992250 -1.576120 +VERTEX_SE2 1366 6.998920 -5.985400 -1.568390 +VERTEX_SE2 1367 6.985310 -5.990210 3.139170 +VERTEX_SE2 1368 6.010480 -5.999770 3.137420 +VERTEX_SE2 1369 4.994600 -5.959520 3.141430 +VERTEX_SE2 1370 3.980460 -5.994720 3.137090 +VERTEX_SE2 1371 3.019720 -5.969230 3.140390 +VERTEX_SE2 1372 1.998740 -5.998720 3.141070 +VERTEX_SE2 1373 1.003810 -5.988150 -3.140530 +VERTEX_SE2 1374 0.011415 -5.970180 -3.140640 +VERTEX_SE2 1375 -0.002006 -5.977760 1.564130 +VERTEX_SE2 1376 0.011879 -4.996710 1.568140 +VERTEX_SE2 1377 -0.000119 -4.989980 3.136600 +VERTEX_SE2 1378 0.005237 -4.988770 1.569130 +VERTEX_SE2 1379 0.000134 -3.998330 1.569280 +VERTEX_SE2 1380 0.006454 -2.982700 1.572910 +VERTEX_SE2 1381 -0.006381 -1.984350 1.572330 +VERTEX_SE2 1382 0.008212 -0.972459 1.574150 +VERTEX_SE2 1383 0.017405 0.026804 1.577440 +VERTEX_SE2 1384 -0.000172 0.013710 -3.139980 +VERTEX_SE2 1385 -1.000790 0.000002 -3.140650 +VERTEX_SE2 1386 -2.005200 0.026180 -3.140290 +VERTEX_SE2 1387 -1.999730 0.026544 -1.570560 +VERTEX_SE2 1388 -1.979300 -0.985335 -1.570870 +VERTEX_SE2 1389 -2.016290 -1.991820 -1.570600 +VERTEX_SE2 1390 -2.003430 -1.991820 -0.001095 +VERTEX_SE2 1391 -0.977467 -1.993930 0.004607 +VERTEX_SE2 1392 0.011445 -2.003210 0.000786 +VERTEX_SE2 1393 1.000820 -1.977800 -0.001116 +VERTEX_SE2 1394 1.985000 -1.981660 -0.006470 +VERTEX_SE2 1395 3.011840 -1.973240 -0.004336 +VERTEX_SE2 1396 4.009550 -2.010350 -0.000416 +VERTEX_SE2 1397 4.999620 -2.006930 0.004595 +VERTEX_SE2 1398 4.993590 -1.998490 -1.575200 +VERTEX_SE2 1399 5.002900 -3.016040 -1.567830 +VERTEX_SE2 1400 5.000000 -4.000000 -1.570800 +EDGE_SE2 1100 1101 0.006546 0.006016 1.577310 +EDGE_SE2 1101 1102 1.052530 0.007321 -0.003030 +EDGE_SE2 1102 1103 1.013350 -0.037027 0.000144 +EDGE_SE2 1103 1104 0.997248 -0.024456 0.016611 +EDGE_SE2 1104 1105 -0.046933 -0.029547 -1.549780 +EDGE_SE2 1105 1106 1.052350 -0.114447 -0.011725 +EDGE_SE2 1106 1107 -0.039744 0.024140 -1.579690 +EDGE_SE2 1107 1108 -0.015187 0.012307 1.563970 +EDGE_SE2 1108 1109 -0.005425 -0.094311 -1.574860 +EDGE_SE2 1109 1110 0.985898 -0.047376 -0.032547 +EDGE_SE2 1110 1111 1.065070 -0.002752 0.013086 +EDGE_SE2 1111 1112 -0.067780 -0.069280 1.567360 +EDGE_SE2 1112 1113 1.045120 0.008832 0.006208 +EDGE_SE2 1113 1114 1.001370 -0.005731 0.009132 +EDGE_SE2 1114 1115 0.075400 0.079444 1.577440 +EDGE_SE2 1115 1116 0.029896 -0.059231 -1.579030 +EDGE_SE2 1116 1117 1.006680 -0.004637 0.021740 +EDGE_SE2 1117 1118 1.011010 0.048221 0.016556 +EDGE_SE2 1118 1119 1.052410 -0.091681 0.001929 +EDGE_SE2 1119 1120 1.050630 -0.076680 -0.015776 +EDGE_SE2 1120 1121 0.922191 0.050277 -0.022443 +EDGE_SE2 1121 1122 0.032551 -0.051417 1.591760 +EDGE_SE2 1122 1123 0.033758 0.005045 -1.566180 +EDGE_SE2 1123 1124 1.039660 -0.003420 -0.014672 +EDGE_SE2 1124 1125 1.017410 -0.093200 0.006436 +EDGE_SE2 1125 1126 0.964251 0.130420 0.003892 +EDGE_SE2 1126 1127 0.856684 0.012183 -0.029628 +EDGE_SE2 1127 1128 0.979513 0.013880 0.014926 +EDGE_SE2 1128 1129 0.981895 0.000055 -3.121530 +EDGE_SE2 1129 1130 0.957564 0.041416 -0.005659 +EDGE_SE2 1130 1131 1.005640 -0.016019 -0.008055 +EDGE_SE2 1131 1132 0.039455 -0.044288 -1.579770 +EDGE_SE2 1132 1133 -0.030281 -0.009131 -1.605490 +EDGE_SE2 1133 1134 -0.016991 -0.042359 -1.575260 +EDGE_SE2 1134 1135 1.060690 -0.027215 0.018718 +EDGE_SE2 1135 1136 1.012500 -0.009308 -0.001290 +EDGE_SE2 1136 1137 1.012600 -0.072095 -0.004472 +EDGE_SE2 1137 1138 0.012147 -0.004206 1.575800 +EDGE_SE2 1138 1139 0.997361 -0.079355 -0.000762 +EDGE_SE2 1139 1140 0.976426 -0.005776 -3.136120 +EDGE_SE2 1140 1141 0.982646 0.069009 -0.009121 +EDGE_SE2 1141 1142 0.995301 -0.040263 -0.023783 +EDGE_SE2 1142 1143 0.973722 -0.017159 -0.033573 +EDGE_SE2 1143 1144 0.950075 -0.043877 0.014285 +EDGE_SE2 1144 1145 -0.020798 0.052549 1.557440 +EDGE_SE2 1145 1146 1.081890 0.047459 -0.007418 +EDGE_SE2 1146 1147 0.951381 0.068256 -0.026437 +EDGE_SE2 1147 1148 1.008980 -0.001099 0.012539 +EDGE_SE2 1148 1149 0.980743 0.012567 0.013885 +EDGE_SE2 1149 1150 0.925616 0.030413 -0.003208 +EDGE_SE2 1150 1151 0.949653 0.006129 -0.000559 +EDGE_SE2 1151 1152 1.048410 -0.005658 0.021419 +EDGE_SE2 1152 1153 0.983531 0.001373 -0.002117 +EDGE_SE2 1153 1154 0.990817 -0.019346 -0.008271 +EDGE_SE2 1154 1155 0.994283 0.063489 0.003511 +EDGE_SE2 1155 1156 1.005160 0.051474 0.025668 +EDGE_SE2 1156 1157 0.037987 -0.059231 -3.125090 +EDGE_SE2 1157 1158 0.985115 -0.003985 -0.001162 +EDGE_SE2 1158 1159 0.974568 -0.002801 -0.007125 +EDGE_SE2 1159 1160 0.022454 0.011954 1.584230 +EDGE_SE2 1160 1161 0.958217 0.081555 -0.004777 +EDGE_SE2 1161 1162 -0.035230 0.002327 -1.558280 +EDGE_SE2 1162 1163 -0.011106 0.017330 -1.588970 +EDGE_SE2 1163 1164 0.979101 -0.060924 0.007463 +EDGE_SE2 1164 1165 0.982261 -0.055886 -0.016920 +EDGE_SE2 1165 1166 0.976990 0.042696 -0.019881 +EDGE_SE2 1166 1167 -0.025230 -0.019496 -1.570080 +EDGE_SE2 1167 1168 1.018860 -0.032671 0.016010 +EDGE_SE2 1168 1169 0.982399 -0.031383 -0.006237 +EDGE_SE2 1169 1170 0.007968 0.005054 -3.141590 +EDGE_SE2 1170 1171 0.989518 -0.036501 0.018927 +EDGE_SE2 1171 1172 1.073120 0.001066 -0.010569 +EDGE_SE2 1172 1173 1.078520 -0.031449 -0.008373 +EDGE_SE2 1173 1174 1.024780 0.008632 -0.001481 +EDGE_SE2 1174 1175 0.026128 0.105479 1.610900 +EDGE_SE2 1175 1176 -0.034476 0.027233 -1.587440 +EDGE_SE2 1176 1177 1.114830 0.002824 0.010802 +EDGE_SE2 1177 1178 0.989872 -0.052663 -0.016259 +EDGE_SE2 1178 1179 0.027768 -0.002131 -1.588250 +EDGE_SE2 1179 1180 0.935931 -0.041249 0.008759 +EDGE_SE2 1180 1181 0.969348 0.005468 -3.136230 +EDGE_SE2 1181 1182 0.952363 -0.115659 -0.015814 +EDGE_SE2 1182 1183 1.001700 -0.073215 0.011515 +EDGE_SE2 1183 1184 0.018297 -0.022876 1.553330 +EDGE_SE2 1184 1185 1.031400 -0.019496 0.003134 +EDGE_SE2 1185 1186 -0.002814 0.038153 1.551890 +EDGE_SE2 1186 1187 0.979085 0.048265 -0.008198 +EDGE_SE2 1187 1188 0.989818 0.001277 3.123230 +EDGE_SE2 1188 1189 1.015570 -0.013017 0.006965 +EDGE_SE2 1189 1190 0.990532 -0.012005 0.013347 +EDGE_SE2 1190 1191 -0.019576 0.002654 1.556590 +EDGE_SE2 1191 1192 0.074904 0.080515 -1.541710 +EDGE_SE2 1192 1193 0.967523 -0.016224 -0.012388 +EDGE_SE2 1193 1194 1.035240 -0.020101 0.006525 +EDGE_SE2 1194 1195 0.015861 0.032321 1.587350 +EDGE_SE2 1195 1196 1.073800 0.095692 -0.009799 +EDGE_SE2 1196 1197 0.989278 0.149784 -0.017017 +EDGE_SE2 1197 1198 1.000750 -0.028634 -0.007378 +EDGE_SE2 1198 1199 1.069300 0.029317 0.005256 +EDGE_SE2 1199 1200 -0.005872 0.078628 -1.593180 +EDGE_SE2 1200 1201 0.972572 0.010058 0.002108 +EDGE_SE2 1201 1202 1.015040 0.041944 0.001066 +EDGE_SE2 1202 1203 0.969411 0.028179 -0.003329 +EDGE_SE2 1203 1204 1.010660 -0.019988 0.012696 +EDGE_SE2 1204 1205 1.052540 -0.057178 -0.008095 +EDGE_SE2 1205 1206 0.944270 -0.002143 0.022186 +EDGE_SE2 1206 1207 0.020487 -0.122883 1.589950 +EDGE_SE2 1207 1208 0.028142 0.066378 1.573590 +EDGE_SE2 1208 1209 1.021600 0.099608 -0.014515 +EDGE_SE2 1209 1210 1.027750 0.079716 0.001802 +EDGE_SE2 1210 1211 -0.052560 0.034636 -1.559150 +EDGE_SE2 1211 1212 -0.024180 -0.008000 -1.567510 +EDGE_SE2 1212 1213 1.083300 -0.017263 -0.024112 +EDGE_SE2 1213 1214 1.002600 -0.049125 -0.000700 +EDGE_SE2 1214 1215 1.041170 -0.042436 -0.010718 +EDGE_SE2 1215 1216 1.028620 0.006495 -0.008027 +EDGE_SE2 1216 1217 1.041150 -0.000954 0.013981 +EDGE_SE2 1217 1218 1.053240 -0.012542 -0.021271 +EDGE_SE2 1218 1219 0.929746 0.002637 -0.018047 +EDGE_SE2 1219 1220 1.038960 -0.005703 -0.000112 +EDGE_SE2 1220 1221 1.020540 -0.002337 -0.014186 +EDGE_SE2 1221 1222 1.009920 0.033154 -0.008636 +EDGE_SE2 1222 1223 -0.016882 0.114579 -1.567840 +EDGE_SE2 1223 1224 1.004840 -0.042954 0.014005 +EDGE_SE2 1224 1225 1.071440 0.011965 0.015030 +EDGE_SE2 1225 1226 0.985934 0.010150 0.013273 +EDGE_SE2 1226 1227 1.079330 0.046545 -0.010418 +EDGE_SE2 1227 1228 0.978568 0.092095 0.005963 +EDGE_SE2 1228 1229 0.983281 0.008074 -0.004442 +EDGE_SE2 1229 1230 -0.058010 0.049272 -1.586130 +EDGE_SE2 1230 1231 0.982871 0.042359 0.009336 +EDGE_SE2 1231 1232 1.018420 -0.031866 0.008538 +EDGE_SE2 1232 1233 0.949570 -0.024478 0.007384 +EDGE_SE2 1233 1234 0.933499 -0.089048 -0.007462 +EDGE_SE2 1234 1235 1.008720 0.054300 -0.003793 +EDGE_SE2 1235 1236 0.987530 -0.116289 -0.003566 +EDGE_SE2 1236 1237 0.968783 0.056676 0.003822 +EDGE_SE2 1237 1238 1.041390 -0.021849 -0.002042 +EDGE_SE2 1238 1239 0.016965 0.004133 1.580790 +EDGE_SE2 1239 1240 -0.017142 -0.039698 1.572750 +EDGE_SE2 1240 1241 1.015660 -0.008740 -0.005019 +EDGE_SE2 1241 1242 1.013300 -0.015493 0.006845 +EDGE_SE2 1242 1243 1.011040 0.060168 0.000082 +EDGE_SE2 1243 1244 0.041257 0.014247 1.577050 +EDGE_SE2 1244 1245 1.003130 0.011087 0.021135 +EDGE_SE2 1245 1246 0.978989 0.045611 -0.001330 +EDGE_SE2 1246 1247 1.032790 0.011985 -0.012788 +EDGE_SE2 1247 1248 1.027850 0.055427 -0.015465 +EDGE_SE2 1248 1249 0.951532 -0.113636 0.017059 +EDGE_SE2 1249 1250 0.017396 -0.070298 -1.584690 +EDGE_SE2 1250 1251 0.980104 -0.002552 0.000870 +EDGE_SE2 1251 1252 0.962747 0.031813 0.011988 +EDGE_SE2 1252 1253 0.972941 -0.035201 -0.026202 +EDGE_SE2 1253 1254 -0.043859 0.047588 -1.563340 +EDGE_SE2 1254 1255 0.957446 -0.022734 -0.008264 +EDGE_SE2 1255 1256 1.006160 -0.021333 -0.011800 +EDGE_SE2 1256 1257 0.019816 -0.003854 1.566690 +EDGE_SE2 1257 1258 1.004610 -0.011799 -0.006698 +EDGE_SE2 1258 1259 1.028610 -0.033751 0.005326 +EDGE_SE2 1259 1260 1.080630 0.116675 -0.001219 +EDGE_SE2 1260 1261 0.942101 0.012648 0.012032 +EDGE_SE2 1261 1262 0.962592 0.053341 0.029916 +EDGE_SE2 1262 1263 0.978721 -0.004699 -0.024014 +EDGE_SE2 1263 1264 1.021120 0.012826 -0.013793 +EDGE_SE2 1264 1265 0.959543 -0.129415 0.002010 +EDGE_SE2 1265 1266 0.078358 0.059239 -1.581360 +EDGE_SE2 1266 1267 0.952083 0.033203 -0.000167 +EDGE_SE2 1267 1268 0.914446 -0.036217 0.017241 +EDGE_SE2 1268 1269 1.034020 0.022690 0.015161 +EDGE_SE2 1269 1270 0.962908 -0.054006 -0.022120 +EDGE_SE2 1270 1271 1.069580 -0.031950 0.002649 +EDGE_SE2 1271 1272 -0.019903 0.007963 -1.586580 +EDGE_SE2 1272 1273 0.985411 -0.048511 -0.005099 +EDGE_SE2 1273 1274 0.988803 -0.040850 -0.001608 +EDGE_SE2 1274 1275 0.996932 0.037888 0.011959 +EDGE_SE2 1275 1276 -0.037214 -0.061949 1.588560 +EDGE_SE2 1276 1277 0.994816 -0.029108 -0.008224 +EDGE_SE2 1277 1278 0.987955 -0.010016 0.013385 +EDGE_SE2 1278 1279 1.008660 -0.021282 -0.003377 +EDGE_SE2 1279 1280 1.035120 0.053892 -0.007487 +EDGE_SE2 1280 1281 0.011880 -0.005748 1.570020 +EDGE_SE2 1281 1282 1.022780 -0.008784 0.011790 +EDGE_SE2 1282 1283 0.027800 -0.008031 1.565280 +EDGE_SE2 1283 1284 0.010698 -0.038916 1.555360 +EDGE_SE2 1284 1285 0.895379 0.033433 -0.004346 +EDGE_SE2 1285 1286 1.110350 -0.012480 0.004406 +EDGE_SE2 1286 1287 0.965602 -0.083537 -0.016493 +EDGE_SE2 1287 1288 0.987958 -0.082818 0.013926 +EDGE_SE2 1288 1289 1.047770 -0.031598 -0.016516 +EDGE_SE2 1289 1290 0.984402 0.040989 0.019630 +EDGE_SE2 1290 1291 1.030210 0.008602 0.009294 +EDGE_SE2 1291 1292 1.019560 0.007228 -0.007305 +EDGE_SE2 1292 1293 0.985575 -0.082842 0.001047 +EDGE_SE2 1293 1294 0.049807 -0.030035 1.570940 +EDGE_SE2 1294 1295 0.008979 -0.017909 -1.567170 +EDGE_SE2 1295 1296 1.046050 0.057096 -0.017435 +EDGE_SE2 1296 1297 0.944011 0.038928 -0.013483 +EDGE_SE2 1297 1298 1.006080 -0.026380 0.015023 +EDGE_SE2 1298 1299 1.042630 0.058169 0.002883 +EDGE_SE2 1299 1300 1.022540 -0.072081 0.020272 +EDGE_SE2 1300 1301 0.998786 0.068060 -0.003453 +EDGE_SE2 1301 1302 -0.042061 -0.001740 -1.582270 +EDGE_SE2 1302 1303 1.027920 -0.030583 0.018880 +EDGE_SE2 1303 1304 0.108273 -0.006164 1.570620 +EDGE_SE2 1304 1305 0.003952 0.004445 -1.570500 +EDGE_SE2 1305 1306 -0.040015 0.013737 -1.560420 +EDGE_SE2 1306 1307 -0.084784 -0.023819 1.579780 +EDGE_SE2 1307 1308 1.019670 -0.019836 0.007376 +EDGE_SE2 1308 1309 0.012094 0.052912 1.574690 +EDGE_SE2 1309 1310 -0.013137 0.024083 1.562350 +EDGE_SE2 1310 1311 1.029980 -0.030654 -0.002423 +EDGE_SE2 1311 1312 0.990937 0.018570 0.000235 +EDGE_SE2 1312 1313 0.076680 0.031768 1.565810 +EDGE_SE2 1313 1314 0.019919 -0.025101 1.552980 +EDGE_SE2 1314 1315 0.019024 0.021016 1.556300 +EDGE_SE2 1315 1316 0.997068 0.031156 0.002847 +EDGE_SE2 1316 1317 0.966899 -0.042234 -0.003529 +EDGE_SE2 1317 1318 0.997148 0.006091 -0.007780 +EDGE_SE2 1318 1319 0.907999 0.026962 0.004224 +EDGE_SE2 1319 1320 0.948056 0.057133 0.010510 +EDGE_SE2 1320 1321 1.033990 0.052503 0.024302 +EDGE_SE2 1321 1322 0.958021 0.002762 -3.120070 +EDGE_SE2 1322 1323 1.019250 0.003862 -0.009592 +EDGE_SE2 1323 1324 0.935843 -0.005380 0.021131 +EDGE_SE2 1324 1325 0.020910 -0.076881 1.538530 +EDGE_SE2 1325 1326 1.050890 0.010874 -0.013323 +EDGE_SE2 1326 1327 0.998944 -0.015842 -0.004316 +EDGE_SE2 1327 1328 0.946482 -0.119657 0.028971 +EDGE_SE2 1328 1329 1.052950 0.015916 0.012171 +EDGE_SE2 1329 1330 1.012390 0.007027 0.002321 +EDGE_SE2 1330 1331 1.030790 0.038664 0.008146 +EDGE_SE2 1331 1332 1.024520 0.034642 0.001633 +EDGE_SE2 1332 1333 0.962030 0.010023 0.020242 +EDGE_SE2 1333 1334 1.030170 -0.045081 -0.016430 +EDGE_SE2 1334 1335 1.084730 0.044323 0.008006 +EDGE_SE2 1335 1336 0.944908 0.036967 0.000145 +EDGE_SE2 1336 1337 0.928006 0.093408 0.019848 +EDGE_SE2 1337 1338 -0.021527 -0.062579 -1.550280 +EDGE_SE2 1338 1339 1.000420 -0.030778 0.001612 +EDGE_SE2 1339 1340 0.995840 0.087416 0.005223 +EDGE_SE2 1340 1341 0.908663 -0.014885 -0.013784 +EDGE_SE2 1341 1342 0.039917 -0.024835 1.587760 +EDGE_SE2 1342 1343 0.008339 0.022664 -1.573960 +EDGE_SE2 1343 1344 0.997621 -0.002496 0.029712 +EDGE_SE2 1344 1345 0.934778 -0.008496 -0.012830 +EDGE_SE2 1345 1346 0.993062 -0.044951 -0.000391 +EDGE_SE2 1346 1347 -0.041367 0.061242 -1.587450 +EDGE_SE2 1347 1348 0.995669 -0.033812 0.001123 +EDGE_SE2 1348 1349 1.012620 0.020645 0.007472 +EDGE_SE2 1349 1350 0.954270 -0.007437 0.003780 +EDGE_SE2 1350 1351 0.040398 0.005714 -1.598510 +EDGE_SE2 1351 1352 0.910438 0.003153 -0.007242 +EDGE_SE2 1352 1353 1.053580 -0.030135 0.011691 +EDGE_SE2 1353 1354 0.017607 -0.004677 1.583210 +EDGE_SE2 1354 1355 1.056220 0.049942 -0.003547 +EDGE_SE2 1355 1356 0.030968 -0.036128 -1.567810 +EDGE_SE2 1356 1357 -0.012688 0.011791 1.568070 +EDGE_SE2 1357 1358 1.029790 -0.046087 0.025832 +EDGE_SE2 1358 1359 0.999366 0.010666 0.006802 +EDGE_SE2 1359 1360 0.948673 -0.075728 0.027616 +EDGE_SE2 1360 1361 1.025860 -0.011199 0.003648 +EDGE_SE2 1361 1362 -0.014324 -0.010395 1.564190 +EDGE_SE2 1362 1363 0.949412 -0.044915 -0.012404 +EDGE_SE2 1363 1364 0.004428 0.002160 1.546400 +EDGE_SE2 1364 1365 0.988534 0.065586 -0.003386 +EDGE_SE2 1365 1366 1.023950 0.082246 0.032425 +EDGE_SE2 1366 1367 0.010619 0.026505 -1.584260 +EDGE_SE2 1367 1368 1.016240 0.033967 -0.002488 +EDGE_SE2 1368 1369 1.083710 -0.045031 0.017554 +EDGE_SE2 1369 1370 0.961176 0.080478 -0.007277 +EDGE_SE2 1370 1371 0.974418 0.034786 0.001670 +EDGE_SE2 1371 1372 1.070020 -0.042332 -0.004261 +EDGE_SE2 1372 1373 0.991236 -0.001085 -0.027315 +EDGE_SE2 1373 1374 0.950810 -0.068687 -0.023114 +EDGE_SE2 1374 1375 -0.066995 -0.012495 -1.582940 +EDGE_SE2 1375 1376 0.971969 -0.067333 0.013652 +EDGE_SE2 1376 1377 0.066071 -0.016874 1.580410 +EDGE_SE2 1377 1378 0.033622 -0.031918 -1.545720 +EDGE_SE2 1378 1379 0.978374 0.019616 -0.000801 +EDGE_SE2 1379 1380 0.939557 0.037740 0.003304 +EDGE_SE2 1380 1381 0.973588 0.075403 -0.021901 +EDGE_SE2 1381 1382 1.000710 -0.005608 0.007829 +EDGE_SE2 1382 1383 0.997739 -0.020161 0.003349 +EDGE_SE2 1383 1384 -0.001969 -0.004847 1.554720 +EDGE_SE2 1384 1385 1.012130 0.014543 0.007025 +EDGE_SE2 1385 1386 0.952048 -0.012366 0.007127 +EDGE_SE2 1386 1387 -0.042252 0.023885 1.583910 +EDGE_SE2 1387 1388 1.084370 0.053898 0.011027 +EDGE_SE2 1388 1389 1.014120 -0.061130 0.018968 +EDGE_SE2 1389 1390 -0.051071 0.007776 1.577980 +EDGE_SE2 1390 1391 1.030600 0.039281 -0.004706 +EDGE_SE2 1391 1392 0.969706 0.040987 0.007918 +EDGE_SE2 1392 1393 0.976095 0.092576 0.006641 +EDGE_SE2 1393 1394 0.953016 0.053725 -0.037199 +EDGE_SE2 1394 1395 1.087550 0.040948 0.020023 +EDGE_SE2 1395 1396 1.003570 -0.036515 0.005622 +EDGE_SE2 1396 1397 0.964271 -0.052789 0.005242 +EDGE_SE2 1397 1398 -0.029967 -0.010418 -1.554100 +EDGE_SE2 1398 1399 1.025120 -0.012726 0.036768 +EDGE_SE2 1399 1400 0.901873 -0.033191 -0.006995 +EDGE_RANGE_SE2_XY 1101 19 4.857451 +EDGE_RANGE_SE2_XY 1101 22 3.029368 +EDGE_RANGE_SE2_XY 1101 32 3.309342 +EDGE_RANGE_SE2_XY 1101 43 3.725844 +EDGE_RANGE_SE2_XY 1101 53 4.871873 +EDGE_RANGE_SE2_XY 1101 56 1.790738 +EDGE_RANGE_SE2_XY 1102 19 3.936951 +EDGE_RANGE_SE2_XY 1102 22 3.505421 +EDGE_RANGE_SE2_XY 1102 32 2.647556 +EDGE_RANGE_SE2_XY 1102 43 3.308009 +EDGE_RANGE_SE2_XY 1102 53 4.827249 +EDGE_RANGE_SE2_XY 1102 56 0.779908 +EDGE_RANGE_SE2_XY 1103 19 2.962173 +EDGE_RANGE_SE2_XY 1103 32 2.334939 +EDGE_RANGE_SE2_XY 1103 43 3.201146 +EDGE_RANGE_SE2_XY 1103 53 4.980616 +EDGE_RANGE_SE2_XY 1104 19 1.964526 +EDGE_RANGE_SE2_XY 1104 32 2.356212 +EDGE_RANGE_SE2_XY 1104 41 4.912187 +EDGE_RANGE_SE2_XY 1104 43 3.438544 +EDGE_RANGE_SE2_XY 1104 62 4.762978 +EDGE_RANGE_SE2_XY 1105 19 1.987435 +EDGE_RANGE_SE2_XY 1105 41 4.871234 +EDGE_RANGE_SE2_XY 1105 56 1.239375 +EDGE_RANGE_SE2_XY 1105 57 4.121775 +EDGE_RANGE_SE2_XY 1105 58 4.733908 +EDGE_RANGE_SE2_XY 1105 70 4.916661 +EDGE_RANGE_SE2_XY 1106 19 2.224545 +EDGE_RANGE_SE2_XY 1106 41 4.346377 +EDGE_RANGE_SE2_XY 1106 56 1.564514 +EDGE_RANGE_SE2_XY 1106 57 4.201213 +EDGE_RANGE_SE2_XY 1106 58 4.632318 +EDGE_RANGE_SE2_XY 1106 70 4.793123 +EDGE_RANGE_SE2_XY 1107 32 3.363205 +EDGE_RANGE_SE2_XY 1107 43 4.381163 +EDGE_RANGE_SE2_XY 1107 56 1.532184 +EDGE_RANGE_SE2_XY 1107 57 4.189039 +EDGE_RANGE_SE2_XY 1107 58 4.525377 +EDGE_RANGE_SE2_XY 1107 70 4.848943 +EDGE_RANGE_SE2_XY 1108 19 2.364020 +EDGE_RANGE_SE2_XY 1108 41 4.412879 +EDGE_RANGE_SE2_XY 1108 56 1.471697 +EDGE_RANGE_SE2_XY 1108 57 4.221028 +EDGE_RANGE_SE2_XY 1108 58 4.627875 +EDGE_RANGE_SE2_XY 1108 70 4.852880 +EDGE_RANGE_SE2_XY 1109 32 3.348151 +EDGE_RANGE_SE2_XY 1109 43 4.399199 +EDGE_RANGE_SE2_XY 1109 56 1.499895 +EDGE_RANGE_SE2_XY 1109 57 4.202725 +EDGE_RANGE_SE2_XY 1109 58 4.562309 +EDGE_RANGE_SE2_XY 1109 70 4.882914 +EDGE_RANGE_SE2_XY 1110 13 4.726819 +EDGE_RANGE_SE2_XY 1110 22 4.987276 +EDGE_RANGE_SE2_XY 1110 32 3.336446 +EDGE_RANGE_SE2_XY 1110 43 4.284431 +EDGE_RANGE_SE2_XY 1110 56 0.845565 +EDGE_RANGE_SE2_XY 1110 57 3.242601 +EDGE_RANGE_SE2_XY 1110 58 3.586908 +EDGE_RANGE_SE2_XY 1110 70 3.838412 +EDGE_RANGE_SE2_XY 1111 13 3.807798 +EDGE_RANGE_SE2_XY 1111 22 4.385149 +EDGE_RANGE_SE2_XY 1111 32 3.600372 +EDGE_RANGE_SE2_XY 1111 43 4.341745 +EDGE_RANGE_SE2_XY 1111 56 1.170756 +EDGE_RANGE_SE2_XY 1111 57 2.329515 +EDGE_RANGE_SE2_XY 1111 58 2.594391 +EDGE_RANGE_SE2_XY 1111 70 2.872469 +EDGE_RANGE_SE2_XY 1111 89 4.819311 +EDGE_RANGE_SE2_XY 1112 13 3.770957 +EDGE_RANGE_SE2_XY 1112 19 4.169780 +EDGE_RANGE_SE2_XY 1112 57 2.345286 +EDGE_RANGE_SE2_XY 1112 58 2.575212 +EDGE_RANGE_SE2_XY 1112 70 2.831113 +EDGE_RANGE_SE2_XY 1112 89 4.798520 +EDGE_RANGE_SE2_XY 1113 13 4.303585 +EDGE_RANGE_SE2_XY 1113 19 4.498726 +EDGE_RANGE_SE2_XY 1113 57 2.852034 +EDGE_RANGE_SE2_XY 1113 58 2.647159 +EDGE_RANGE_SE2_XY 1113 70 3.000736 +EDGE_RANGE_SE2_XY 1114 26 4.713846 +EDGE_RANGE_SE2_XY 1114 58 3.053567 +EDGE_RANGE_SE2_XY 1114 70 3.428845 +EDGE_RANGE_SE2_XY 1115 26 4.675888 +EDGE_RANGE_SE2_XY 1115 56 2.961745 +EDGE_RANGE_SE2_XY 1115 57 3.543707 +EDGE_RANGE_SE2_XY 1116 26 4.743968 +EDGE_RANGE_SE2_XY 1116 58 3.034337 +EDGE_RANGE_SE2_XY 1116 70 3.475171 +EDGE_RANGE_SE2_XY 1117 26 4.048299 +EDGE_RANGE_SE2_XY 1117 42 4.761799 +EDGE_RANGE_SE2_XY 1117 84 4.789044 +EDGE_RANGE_SE2_XY 1117 94 4.765552 +EDGE_RANGE_SE2_XY 1118 26 3.589049 +EDGE_RANGE_SE2_XY 1118 42 4.467333 +EDGE_RANGE_SE2_XY 1118 49 4.715838 +EDGE_RANGE_SE2_XY 1118 84 3.969183 +EDGE_RANGE_SE2_XY 1118 94 4.657418 +EDGE_RANGE_SE2_XY 1119 26 3.292514 +EDGE_RANGE_SE2_XY 1119 42 4.427423 +EDGE_RANGE_SE2_XY 1119 49 4.396051 +EDGE_RANGE_SE2_XY 1119 84 3.400651 +EDGE_RANGE_SE2_XY 1119 94 4.732958 +EDGE_RANGE_SE2_XY 1120 9 4.435312 +EDGE_RANGE_SE2_XY 1120 26 3.407978 +EDGE_RANGE_SE2_XY 1120 42 4.541725 +EDGE_RANGE_SE2_XY 1120 49 4.373240 +EDGE_RANGE_SE2_XY 1120 51 4.696709 +EDGE_RANGE_SE2_XY 1120 59 4.199036 +EDGE_RANGE_SE2_XY 1120 84 3.065915 +EDGE_RANGE_SE2_XY 1121 9 3.428774 +EDGE_RANGE_SE2_XY 1121 26 3.746073 +EDGE_RANGE_SE2_XY 1121 42 4.957848 +EDGE_RANGE_SE2_XY 1121 49 4.421961 +EDGE_RANGE_SE2_XY 1121 51 3.818177 +EDGE_RANGE_SE2_XY 1121 59 3.408329 +EDGE_RANGE_SE2_XY 1121 84 2.931211 +EDGE_RANGE_SE2_XY 1121 96 4.506834 +EDGE_RANGE_SE2_XY 1122 9 3.449694 +EDGE_RANGE_SE2_XY 1122 26 3.698763 +EDGE_RANGE_SE2_XY 1122 42 4.871737 +EDGE_RANGE_SE2_XY 1122 51 3.904941 +EDGE_RANGE_SE2_XY 1122 59 3.416027 +EDGE_RANGE_SE2_XY 1122 96 4.579109 +EDGE_RANGE_SE2_XY 1123 9 3.498844 +EDGE_RANGE_SE2_XY 1123 26 3.765815 +EDGE_RANGE_SE2_XY 1123 42 4.857185 +EDGE_RANGE_SE2_XY 1123 49 4.492475 +EDGE_RANGE_SE2_XY 1123 51 3.882022 +EDGE_RANGE_SE2_XY 1123 59 3.405451 +EDGE_RANGE_SE2_XY 1123 84 2.974378 +EDGE_RANGE_SE2_XY 1123 96 4.558613 +EDGE_RANGE_SE2_XY 1124 9 2.529643 +EDGE_RANGE_SE2_XY 1124 26 4.251020 +EDGE_RANGE_SE2_XY 1124 49 4.892912 +EDGE_RANGE_SE2_XY 1124 50 4.785058 +EDGE_RANGE_SE2_XY 1124 51 3.229781 +EDGE_RANGE_SE2_XY 1124 59 2.669398 +EDGE_RANGE_SE2_XY 1124 84 3.126282 +EDGE_RANGE_SE2_XY 1124 96 3.561004 +EDGE_RANGE_SE2_XY 1125 9 1.641236 +EDGE_RANGE_SE2_XY 1125 31 4.860697 +EDGE_RANGE_SE2_XY 1125 50 4.054025 +EDGE_RANGE_SE2_XY 1125 51 2.786815 +EDGE_RANGE_SE2_XY 1125 59 2.291844 +EDGE_RANGE_SE2_XY 1125 84 3.738854 +EDGE_RANGE_SE2_XY 1125 96 2.788069 +EDGE_RANGE_SE2_XY 1126 9 0.965726 +EDGE_RANGE_SE2_XY 1126 31 4.245325 +EDGE_RANGE_SE2_XY 1126 50 3.428439 +EDGE_RANGE_SE2_XY 1126 51 2.563741 +EDGE_RANGE_SE2_XY 1126 59 2.168664 +EDGE_RANGE_SE2_XY 1126 83 4.438871 +EDGE_RANGE_SE2_XY 1126 96 1.899084 +EDGE_RANGE_SE2_XY 1127 9 1.085014 +EDGE_RANGE_SE2_XY 1127 31 3.827799 +EDGE_RANGE_SE2_XY 1127 50 3.051109 +EDGE_RANGE_SE2_XY 1127 51 2.864002 +EDGE_RANGE_SE2_XY 1127 59 2.535069 +EDGE_RANGE_SE2_XY 1127 83 3.922304 +EDGE_RANGE_SE2_XY 1127 96 1.474645 +EDGE_RANGE_SE2_XY 1128 31 3.644557 +EDGE_RANGE_SE2_XY 1128 50 2.916753 +EDGE_RANGE_SE2_XY 1128 51 3.408432 +EDGE_RANGE_SE2_XY 1128 83 3.574629 +EDGE_RANGE_SE2_XY 1128 96 1.476983 +EDGE_RANGE_SE2_XY 1129 9 2.752545 +EDGE_RANGE_SE2_XY 1129 31 3.724532 +EDGE_RANGE_SE2_XY 1129 50 3.141963 +EDGE_RANGE_SE2_XY 1129 51 4.036135 +EDGE_RANGE_SE2_XY 1129 59 4.000901 +EDGE_RANGE_SE2_XY 1129 83 3.611570 +EDGE_RANGE_SE2_XY 1129 96 2.169308 +EDGE_RANGE_SE2_XY 1130 9 1.814115 +EDGE_RANGE_SE2_XY 1130 31 3.607467 +EDGE_RANGE_SE2_XY 1130 50 2.922949 +EDGE_RANGE_SE2_XY 1130 51 3.399054 +EDGE_RANGE_SE2_XY 1130 59 3.207300 +EDGE_RANGE_SE2_XY 1130 83 3.625030 +EDGE_RANGE_SE2_XY 1130 96 1.512374 +EDGE_RANGE_SE2_XY 1131 9 1.104486 +EDGE_RANGE_SE2_XY 1131 31 3.828282 +EDGE_RANGE_SE2_XY 1131 50 3.000797 +EDGE_RANGE_SE2_XY 1131 51 2.810661 +EDGE_RANGE_SE2_XY 1131 59 2.586489 +EDGE_RANGE_SE2_XY 1131 83 3.921271 +EDGE_RANGE_SE2_XY 1131 96 1.360578 +EDGE_RANGE_SE2_XY 1132 51 2.890546 +EDGE_RANGE_SE2_XY 1132 59 2.546455 +EDGE_RANGE_SE2_XY 1132 83 3.916376 +EDGE_RANGE_SE2_XY 1133 9 1.029858 +EDGE_RANGE_SE2_XY 1133 31 3.846970 +EDGE_RANGE_SE2_XY 1133 50 2.965401 +EDGE_RANGE_SE2_XY 1133 51 2.824649 +EDGE_RANGE_SE2_XY 1133 59 2.516625 +EDGE_RANGE_SE2_XY 1133 83 3.866627 +EDGE_RANGE_SE2_XY 1133 96 1.382779 +EDGE_RANGE_SE2_XY 1134 9 1.108836 +EDGE_RANGE_SE2_XY 1134 31 3.799130 +EDGE_RANGE_SE2_XY 1134 50 2.991836 +EDGE_RANGE_SE2_XY 1134 96 1.397300 +EDGE_RANGE_SE2_XY 1135 9 0.718404 +EDGE_RANGE_SE2_XY 1135 31 2.870101 +EDGE_RANGE_SE2_XY 1135 50 2.118459 +EDGE_RANGE_SE2_XY 1135 78 4.695297 +EDGE_RANGE_SE2_XY 1135 84 4.712406 +EDGE_RANGE_SE2_XY 1135 96 0.501521 +EDGE_RANGE_SE2_XY 1136 10 4.393214 +EDGE_RANGE_SE2_XY 1136 31 2.012592 +EDGE_RANGE_SE2_XY 1136 35 4.867267 +EDGE_RANGE_SE2_XY 1136 50 1.244902 +EDGE_RANGE_SE2_XY 1136 78 3.714795 +EDGE_RANGE_SE2_XY 1136 84 4.397568 +EDGE_RANGE_SE2_XY 1137 10 3.771284 +EDGE_RANGE_SE2_XY 1137 15 4.672272 +EDGE_RANGE_SE2_XY 1137 31 1.372858 +EDGE_RANGE_SE2_XY 1137 35 4.023838 +EDGE_RANGE_SE2_XY 1137 50 0.829919 +EDGE_RANGE_SE2_XY 1137 78 2.711711 +EDGE_RANGE_SE2_XY 1137 84 4.243039 +EDGE_RANGE_SE2_XY 1138 9 2.208323 +EDGE_RANGE_SE2_XY 1138 15 4.680234 +EDGE_RANGE_SE2_XY 1138 31 1.403417 +EDGE_RANGE_SE2_XY 1138 35 4.065029 +EDGE_RANGE_SE2_XY 1138 50 0.867667 +EDGE_RANGE_SE2_XY 1138 78 2.739092 +EDGE_RANGE_SE2_XY 1138 96 1.684189 +EDGE_RANGE_SE2_XY 1139 9 2.708356 +EDGE_RANGE_SE2_XY 1139 31 0.622755 +EDGE_RANGE_SE2_XY 1139 35 3.479483 +EDGE_RANGE_SE2_XY 1139 78 3.076849 +EDGE_RANGE_SE2_XY 1139 96 1.793293 +EDGE_RANGE_SE2_XY 1140 9 3.371697 +EDGE_RANGE_SE2_XY 1140 31 0.987703 +EDGE_RANGE_SE2_XY 1140 35 3.074232 +EDGE_RANGE_SE2_XY 1140 50 1.176540 +EDGE_RANGE_SE2_XY 1140 78 3.608612 +EDGE_RANGE_SE2_XY 1140 96 2.367549 +EDGE_RANGE_SE2_XY 1141 9 2.662227 +EDGE_RANGE_SE2_XY 1141 10 4.585851 +EDGE_RANGE_SE2_XY 1141 31 0.720629 +EDGE_RANGE_SE2_XY 1141 35 3.415268 +EDGE_RANGE_SE2_XY 1141 50 0.192666 +EDGE_RANGE_SE2_XY 1141 78 3.036988 +EDGE_RANGE_SE2_XY 1141 96 1.833927 +EDGE_RANGE_SE2_XY 1142 9 2.141088 +EDGE_RANGE_SE2_XY 1142 10 3.737737 +EDGE_RANGE_SE2_XY 1142 15 4.578466 +EDGE_RANGE_SE2_XY 1142 35 4.024537 +EDGE_RANGE_SE2_XY 1142 78 2.694706 +EDGE_RANGE_SE2_XY 1142 84 4.241145 +EDGE_RANGE_SE2_XY 1142 96 1.685785 +EDGE_RANGE_SE2_XY 1143 9 2.165132 +EDGE_RANGE_SE2_XY 1143 10 3.031200 +EDGE_RANGE_SE2_XY 1143 15 4.112574 +EDGE_RANGE_SE2_XY 1143 49 4.380352 +EDGE_RANGE_SE2_XY 1143 78 2.817606 +EDGE_RANGE_SE2_XY 1143 84 3.252707 +EDGE_RANGE_SE2_XY 1143 96 2.138593 +EDGE_RANGE_SE2_XY 1144 9 2.540852 +EDGE_RANGE_SE2_XY 1144 10 2.400824 +EDGE_RANGE_SE2_XY 1144 15 3.654784 +EDGE_RANGE_SE2_XY 1144 49 3.470880 +EDGE_RANGE_SE2_XY 1144 78 3.152965 +EDGE_RANGE_SE2_XY 1144 84 2.301278 +EDGE_RANGE_SE2_XY 1145 10 2.365861 +EDGE_RANGE_SE2_XY 1145 15 3.652475 +EDGE_RANGE_SE2_XY 1145 31 3.260819 +EDGE_RANGE_SE2_XY 1145 49 3.468493 +EDGE_RANGE_SE2_XY 1145 50 2.818954 +EDGE_RANGE_SE2_XY 1145 78 3.146034 +EDGE_RANGE_SE2_XY 1145 84 2.280165 +EDGE_RANGE_SE2_XY 1145 96 2.852876 +EDGE_RANGE_SE2_XY 1146 10 1.551385 +EDGE_RANGE_SE2_XY 1146 15 2.729804 +EDGE_RANGE_SE2_XY 1146 31 3.257711 +EDGE_RANGE_SE2_XY 1146 49 3.243273 +EDGE_RANGE_SE2_XY 1146 50 3.074635 +EDGE_RANGE_SE2_XY 1146 78 2.336028 +EDGE_RANGE_SE2_XY 1146 84 2.503435 +EDGE_RANGE_SE2_XY 1146 90 4.842586 +EDGE_RANGE_SE2_XY 1146 94 4.981118 +EDGE_RANGE_SE2_XY 1147 10 1.130520 +EDGE_RANGE_SE2_XY 1147 15 1.858229 +EDGE_RANGE_SE2_XY 1147 31 3.462025 +EDGE_RANGE_SE2_XY 1147 35 4.792484 +EDGE_RANGE_SE2_XY 1147 49 3.228763 +EDGE_RANGE_SE2_XY 1147 50 3.523212 +EDGE_RANGE_SE2_XY 1147 78 1.794387 +EDGE_RANGE_SE2_XY 1147 80 4.854891 +EDGE_RANGE_SE2_XY 1147 84 3.105113 +EDGE_RANGE_SE2_XY 1147 90 4.220353 +EDGE_RANGE_SE2_XY 1147 94 4.923640 +EDGE_RANGE_SE2_XY 1148 10 1.329604 +EDGE_RANGE_SE2_XY 1148 15 1.245594 +EDGE_RANGE_SE2_XY 1148 31 4.035555 +EDGE_RANGE_SE2_XY 1148 35 4.716281 +EDGE_RANGE_SE2_XY 1148 49 3.574864 +EDGE_RANGE_SE2_XY 1148 78 1.697030 +EDGE_RANGE_SE2_XY 1148 80 3.924920 +EDGE_RANGE_SE2_XY 1148 90 3.645927 +EDGE_RANGE_SE2_XY 1149 1 4.700579 +EDGE_RANGE_SE2_XY 1149 15 1.177994 +EDGE_RANGE_SE2_XY 1149 16 4.696956 +EDGE_RANGE_SE2_XY 1149 35 4.780949 +EDGE_RANGE_SE2_XY 1149 49 4.134323 +EDGE_RANGE_SE2_XY 1149 78 2.026213 +EDGE_RANGE_SE2_XY 1149 80 2.995918 +EDGE_RANGE_SE2_XY 1149 90 3.464907 +EDGE_RANGE_SE2_XY 1150 1 4.303406 +EDGE_RANGE_SE2_XY 1150 16 3.719962 +EDGE_RANGE_SE2_XY 1150 65 4.739115 +EDGE_RANGE_SE2_XY 1150 80 2.144930 +EDGE_RANGE_SE2_XY 1150 90 3.505612 +EDGE_RANGE_SE2_XY 1151 1 4.090926 +EDGE_RANGE_SE2_XY 1151 16 2.770987 +EDGE_RANGE_SE2_XY 1151 47 4.612518 +EDGE_RANGE_SE2_XY 1151 65 3.900869 +EDGE_RANGE_SE2_XY 1151 80 1.491481 +EDGE_RANGE_SE2_XY 1151 90 3.793238 +EDGE_RANGE_SE2_XY 1151 97 4.379800 +EDGE_RANGE_SE2_XY 1152 1 4.077544 +EDGE_RANGE_SE2_XY 1152 16 1.928800 +EDGE_RANGE_SE2_XY 1152 47 4.139836 +EDGE_RANGE_SE2_XY 1152 65 3.218176 +EDGE_RANGE_SE2_XY 1152 80 1.333170 +EDGE_RANGE_SE2_XY 1152 90 4.357314 +EDGE_RANGE_SE2_XY 1152 97 3.622714 +EDGE_RANGE_SE2_XY 1153 1 4.309016 +EDGE_RANGE_SE2_XY 1153 16 1.302146 +EDGE_RANGE_SE2_XY 1153 29 4.493651 +EDGE_RANGE_SE2_XY 1153 47 3.992160 +EDGE_RANGE_SE2_XY 1153 65 2.662072 +EDGE_RANGE_SE2_XY 1153 66 4.958630 +EDGE_RANGE_SE2_XY 1153 80 1.836005 +EDGE_RANGE_SE2_XY 1153 97 2.934722 +EDGE_RANGE_SE2_XY 1154 1 4.884813 +EDGE_RANGE_SE2_XY 1154 16 1.272676 +EDGE_RANGE_SE2_XY 1154 29 3.475539 +EDGE_RANGE_SE2_XY 1154 47 3.968795 +EDGE_RANGE_SE2_XY 1154 65 2.512987 +EDGE_RANGE_SE2_XY 1154 66 4.588508 +EDGE_RANGE_SE2_XY 1154 97 2.359686 +EDGE_RANGE_SE2_XY 1155 25 4.767542 +EDGE_RANGE_SE2_XY 1155 29 2.582628 +EDGE_RANGE_SE2_XY 1155 47 4.277022 +EDGE_RANGE_SE2_XY 1155 65 2.668336 +EDGE_RANGE_SE2_XY 1155 66 4.492124 +EDGE_RANGE_SE2_XY 1155 97 2.309841 +EDGE_RANGE_SE2_XY 1156 25 4.261085 +EDGE_RANGE_SE2_XY 1156 29 1.679784 +EDGE_RANGE_SE2_XY 1156 47 4.733718 +EDGE_RANGE_SE2_XY 1156 65 3.134927 +EDGE_RANGE_SE2_XY 1156 66 4.586531 +EDGE_RANGE_SE2_XY 1156 97 2.624530 +EDGE_RANGE_SE2_XY 1157 16 2.788430 +EDGE_RANGE_SE2_XY 1157 25 4.290231 +EDGE_RANGE_SE2_XY 1157 47 4.793170 +EDGE_RANGE_SE2_XY 1157 65 3.225613 +EDGE_RANGE_SE2_XY 1157 66 4.545295 +EDGE_RANGE_SE2_XY 1157 80 4.450166 +EDGE_RANGE_SE2_XY 1157 97 2.585873 +EDGE_RANGE_SE2_XY 1158 16 1.865981 +EDGE_RANGE_SE2_XY 1158 25 4.858096 +EDGE_RANGE_SE2_XY 1158 47 4.261815 +EDGE_RANGE_SE2_XY 1158 65 2.663355 +EDGE_RANGE_SE2_XY 1158 66 4.406640 +EDGE_RANGE_SE2_XY 1158 80 3.522427 +EDGE_RANGE_SE2_XY 1158 97 2.329454 +EDGE_RANGE_SE2_XY 1159 1 4.877457 +EDGE_RANGE_SE2_XY 1159 16 1.304748 +EDGE_RANGE_SE2_XY 1159 47 4.031715 +EDGE_RANGE_SE2_XY 1159 65 2.478132 +EDGE_RANGE_SE2_XY 1159 66 4.604447 +EDGE_RANGE_SE2_XY 1159 80 2.664641 +EDGE_RANGE_SE2_XY 1159 97 2.440537 +EDGE_RANGE_SE2_XY 1160 29 3.575054 +EDGE_RANGE_SE2_XY 1160 65 2.440079 +EDGE_RANGE_SE2_XY 1160 80 2.673150 +EDGE_RANGE_SE2_XY 1160 97 2.476352 +EDGE_RANGE_SE2_XY 1161 25 4.854983 +EDGE_RANGE_SE2_XY 1161 29 3.462423 +EDGE_RANGE_SE2_XY 1161 65 1.530333 +EDGE_RANGE_SE2_XY 1161 97 1.554614 +EDGE_RANGE_SE2_XY 1162 16 2.222088 +EDGE_RANGE_SE2_XY 1162 47 4.981496 +EDGE_RANGE_SE2_XY 1162 65 1.513367 +EDGE_RANGE_SE2_XY 1162 80 3.210010 +EDGE_RANGE_SE2_XY 1162 97 1.534476 +EDGE_RANGE_SE2_XY 1163 16 2.198868 +EDGE_RANGE_SE2_XY 1163 25 4.869166 +EDGE_RANGE_SE2_XY 1163 29 3.462140 +EDGE_RANGE_SE2_XY 1163 47 4.982515 +EDGE_RANGE_SE2_XY 1163 80 3.237660 +EDGE_RANGE_SE2_XY 1164 1 4.795743 +EDGE_RANGE_SE2_XY 1164 16 1.219286 +EDGE_RANGE_SE2_XY 1164 29 3.601961 +EDGE_RANGE_SE2_XY 1164 47 3.999037 +EDGE_RANGE_SE2_XY 1164 66 4.607729 +EDGE_RANGE_SE2_XY 1164 80 2.752029 +EDGE_RANGE_SE2_XY 1165 1 4.020410 +EDGE_RANGE_SE2_XY 1165 16 0.478609 +EDGE_RANGE_SE2_XY 1165 29 3.858515 +EDGE_RANGE_SE2_XY 1165 47 3.023760 +EDGE_RANGE_SE2_XY 1165 66 3.610648 +EDGE_RANGE_SE2_XY 1165 80 2.389709 +EDGE_RANGE_SE2_XY 1166 1 3.353562 +EDGE_RANGE_SE2_XY 1166 29 4.431941 +EDGE_RANGE_SE2_XY 1166 47 2.017845 +EDGE_RANGE_SE2_XY 1166 66 2.715548 +EDGE_RANGE_SE2_XY 1166 80 2.430321 +EDGE_RANGE_SE2_XY 1167 16 0.999937 +EDGE_RANGE_SE2_XY 1167 29 4.382108 +EDGE_RANGE_SE2_XY 1167 47 2.038770 +EDGE_RANGE_SE2_XY 1167 65 4.549515 +EDGE_RANGE_SE2_XY 1167 66 2.723001 +EDGE_RANGE_SE2_XY 1167 97 4.363190 +EDGE_RANGE_SE2_XY 1168 29 3.672282 +EDGE_RANGE_SE2_XY 1168 47 2.563235 +EDGE_RANGE_SE2_XY 1168 65 4.582283 +EDGE_RANGE_SE2_XY 1168 66 2.483766 +EDGE_RANGE_SE2_XY 1168 97 4.280925 +EDGE_RANGE_SE2_XY 1169 29 3.172586 +EDGE_RANGE_SE2_XY 1169 65 4.923564 +EDGE_RANGE_SE2_XY 1169 66 2.609205 +EDGE_RANGE_SE2_XY 1169 97 4.497770 +EDGE_RANGE_SE2_XY 1170 16 2.598201 +EDGE_RANGE_SE2_XY 1170 29 3.125969 +EDGE_RANGE_SE2_XY 1170 47 3.269382 +EDGE_RANGE_SE2_XY 1170 65 4.933013 +EDGE_RANGE_SE2_XY 1170 66 2.593892 +EDGE_RANGE_SE2_XY 1170 80 4.394753 +EDGE_RANGE_SE2_XY 1170 97 4.535325 +EDGE_RANGE_SE2_XY 1171 1 4.148532 +EDGE_RANGE_SE2_XY 1171 16 1.673786 +EDGE_RANGE_SE2_XY 1171 29 3.703739 +EDGE_RANGE_SE2_XY 1171 47 2.536660 +EDGE_RANGE_SE2_XY 1171 65 4.605101 +EDGE_RANGE_SE2_XY 1171 66 2.446587 +EDGE_RANGE_SE2_XY 1171 80 3.392022 +EDGE_RANGE_SE2_XY 1171 97 4.352014 +EDGE_RANGE_SE2_XY 1172 1 3.426765 +EDGE_RANGE_SE2_XY 1172 16 1.009684 +EDGE_RANGE_SE2_XY 1172 47 2.048337 +EDGE_RANGE_SE2_XY 1172 65 4.514483 +EDGE_RANGE_SE2_XY 1172 66 2.765336 +EDGE_RANGE_SE2_XY 1172 80 2.407441 +EDGE_RANGE_SE2_XY 1172 97 4.432687 +EDGE_RANGE_SE2_XY 1173 1 2.589445 +EDGE_RANGE_SE2_XY 1173 16 1.055351 +EDGE_RANGE_SE2_XY 1173 47 2.011266 +EDGE_RANGE_SE2_XY 1173 65 4.587919 +EDGE_RANGE_SE2_XY 1173 66 3.281745 +EDGE_RANGE_SE2_XY 1173 80 1.435058 +EDGE_RANGE_SE2_XY 1173 97 4.696270 +EDGE_RANGE_SE2_XY 1174 1 2.151050 +EDGE_RANGE_SE2_XY 1174 15 4.687283 +EDGE_RANGE_SE2_XY 1174 35 4.807009 +EDGE_RANGE_SE2_XY 1174 47 2.408032 +EDGE_RANGE_SE2_XY 1174 65 4.889724 +EDGE_RANGE_SE2_XY 1174 78 4.306198 +EDGE_RANGE_SE2_XY 1174 80 0.695258 +EDGE_RANGE_SE2_XY 1175 15 4.574224 +EDGE_RANGE_SE2_XY 1175 16 1.687543 +EDGE_RANGE_SE2_XY 1175 35 4.755338 +EDGE_RANGE_SE2_XY 1175 65 4.922041 +EDGE_RANGE_SE2_XY 1175 66 4.005861 +EDGE_RANGE_SE2_XY 1175 78 4.296639 +EDGE_RANGE_SE2_XY 1175 80 0.788367 +EDGE_RANGE_SE2_XY 1176 1 2.177345 +EDGE_RANGE_SE2_XY 1176 15 4.702453 +EDGE_RANGE_SE2_XY 1176 35 4.754957 +EDGE_RANGE_SE2_XY 1176 47 2.364127 +EDGE_RANGE_SE2_XY 1176 65 4.927586 +EDGE_RANGE_SE2_XY 1176 78 4.284921 +EDGE_RANGE_SE2_XY 1176 80 0.786461 +EDGE_RANGE_SE2_XY 1177 1 2.048740 +EDGE_RANGE_SE2_XY 1177 10 4.934034 +EDGE_RANGE_SE2_XY 1177 15 3.973749 +EDGE_RANGE_SE2_XY 1177 35 3.990033 +EDGE_RANGE_SE2_XY 1177 78 3.310759 +EDGE_RANGE_SE2_XY 1178 1 2.469010 +EDGE_RANGE_SE2_XY 1178 10 4.176141 +EDGE_RANGE_SE2_XY 1178 15 3.456755 +EDGE_RANGE_SE2_XY 1178 31 4.568072 +EDGE_RANGE_SE2_XY 1178 35 3.308961 +EDGE_RANGE_SE2_XY 1178 78 2.360775 +EDGE_RANGE_SE2_XY 1179 1 2.506316 +EDGE_RANGE_SE2_XY 1179 16 3.642095 +EDGE_RANGE_SE2_XY 1179 31 4.522855 +EDGE_RANGE_SE2_XY 1179 35 3.361805 +EDGE_RANGE_SE2_XY 1179 47 3.884441 +EDGE_RANGE_SE2_XY 1179 78 2.347048 +EDGE_RANGE_SE2_XY 1179 80 1.888614 +EDGE_RANGE_SE2_XY 1180 1 1.798030 +EDGE_RANGE_SE2_XY 1180 16 3.942264 +EDGE_RANGE_SE2_XY 1180 31 4.366865 +EDGE_RANGE_SE2_XY 1180 35 2.587503 +EDGE_RANGE_SE2_XY 1180 47 3.504823 +EDGE_RANGE_SE2_XY 1180 78 2.691418 +EDGE_RANGE_SE2_XY 1180 80 2.357345 +EDGE_RANGE_SE2_XY 1181 1 1.361379 +EDGE_RANGE_SE2_XY 1181 16 4.498936 +EDGE_RANGE_SE2_XY 1181 31 4.488777 +EDGE_RANGE_SE2_XY 1181 35 2.047911 +EDGE_RANGE_SE2_XY 1181 47 3.380098 +EDGE_RANGE_SE2_XY 1181 78 3.299718 +EDGE_RANGE_SE2_XY 1181 80 3.164674 +EDGE_RANGE_SE2_XY 1182 1 1.725614 +EDGE_RANGE_SE2_XY 1182 10 4.980229 +EDGE_RANGE_SE2_XY 1182 15 4.339524 +EDGE_RANGE_SE2_XY 1182 16 3.968929 +EDGE_RANGE_SE2_XY 1182 31 4.448985 +EDGE_RANGE_SE2_XY 1182 35 2.627655 +EDGE_RANGE_SE2_XY 1182 47 3.475686 +EDGE_RANGE_SE2_XY 1182 78 2.655191 +EDGE_RANGE_SE2_XY 1182 80 2.394601 +EDGE_RANGE_SE2_XY 1183 10 4.223932 +EDGE_RANGE_SE2_XY 1183 15 3.449554 +EDGE_RANGE_SE2_XY 1183 16 3.620267 +EDGE_RANGE_SE2_XY 1183 31 4.539252 +EDGE_RANGE_SE2_XY 1183 47 3.863987 +EDGE_RANGE_SE2_XY 1183 78 2.388948 +EDGE_RANGE_SE2_XY 1183 80 1.816922 +EDGE_RANGE_SE2_XY 1184 1 2.502003 +EDGE_RANGE_SE2_XY 1184 10 4.236620 +EDGE_RANGE_SE2_XY 1184 15 3.432912 +EDGE_RANGE_SE2_XY 1184 16 3.624569 +EDGE_RANGE_SE2_XY 1184 35 3.305621 +EDGE_RANGE_SE2_XY 1184 47 3.855162 +EDGE_RANGE_SE2_XY 1184 80 1.832514 +EDGE_RANGE_SE2_XY 1185 1 2.089569 +EDGE_RANGE_SE2_XY 1185 15 3.956948 +EDGE_RANGE_SE2_XY 1185 16 2.662002 +EDGE_RANGE_SE2_XY 1185 47 3.115248 +EDGE_RANGE_SE2_XY 1185 66 4.819181 +EDGE_RANGE_SE2_XY 1185 80 0.946817 +EDGE_RANGE_SE2_XY 1186 1 2.107665 +EDGE_RANGE_SE2_XY 1186 10 4.944048 +EDGE_RANGE_SE2_XY 1186 16 2.678224 +EDGE_RANGE_SE2_XY 1186 35 3.988387 +EDGE_RANGE_SE2_XY 1186 47 3.076053 +EDGE_RANGE_SE2_XY 1186 66 4.827344 +EDGE_RANGE_SE2_XY 1186 78 3.302367 +EDGE_RANGE_SE2_XY 1186 80 1.002975 +EDGE_RANGE_SE2_XY 1187 1 1.170034 +EDGE_RANGE_SE2_XY 1187 16 3.048679 +EDGE_RANGE_SE2_XY 1187 35 3.408842 +EDGE_RANGE_SE2_XY 1187 47 2.581752 +EDGE_RANGE_SE2_XY 1187 66 4.324636 +EDGE_RANGE_SE2_XY 1187 78 3.639306 +EDGE_RANGE_SE2_XY 1188 1 0.340246 +EDGE_RANGE_SE2_XY 1188 16 3.838670 +EDGE_RANGE_SE2_XY 1188 35 3.051018 +EDGE_RANGE_SE2_XY 1188 47 2.333342 +EDGE_RANGE_SE2_XY 1188 66 4.169105 +EDGE_RANGE_SE2_XY 1188 78 4.056196 +EDGE_RANGE_SE2_XY 1188 80 2.730367 +EDGE_RANGE_SE2_XY 1189 15 4.742387 +EDGE_RANGE_SE2_XY 1189 16 3.122202 +EDGE_RANGE_SE2_XY 1189 35 3.429597 +EDGE_RANGE_SE2_XY 1189 47 2.513488 +EDGE_RANGE_SE2_XY 1189 66 4.444488 +EDGE_RANGE_SE2_XY 1189 78 3.631189 +EDGE_RANGE_SE2_XY 1189 80 1.789555 +EDGE_RANGE_SE2_XY 1190 10 4.886740 +EDGE_RANGE_SE2_XY 1190 15 3.971558 +EDGE_RANGE_SE2_XY 1190 16 2.614404 +EDGE_RANGE_SE2_XY 1190 35 3.984046 +EDGE_RANGE_SE2_XY 1190 47 3.069546 +EDGE_RANGE_SE2_XY 1190 66 4.820887 +EDGE_RANGE_SE2_XY 1190 78 3.351778 +EDGE_RANGE_SE2_XY 1190 80 1.004693 +EDGE_RANGE_SE2_XY 1191 1 2.123200 +EDGE_RANGE_SE2_XY 1191 15 3.987192 +EDGE_RANGE_SE2_XY 1191 16 2.632612 +EDGE_RANGE_SE2_XY 1191 47 3.068079 +EDGE_RANGE_SE2_XY 1191 66 4.863784 +EDGE_RANGE_SE2_XY 1191 80 0.941562 +EDGE_RANGE_SE2_XY 1192 10 4.893439 +EDGE_RANGE_SE2_XY 1192 15 3.968018 +EDGE_RANGE_SE2_XY 1192 16 2.697036 +EDGE_RANGE_SE2_XY 1192 35 3.943686 +EDGE_RANGE_SE2_XY 1192 47 3.087854 +EDGE_RANGE_SE2_XY 1192 66 4.828451 +EDGE_RANGE_SE2_XY 1192 78 3.301073 +EDGE_RANGE_SE2_XY 1192 80 0.952622 +EDGE_RANGE_SE2_XY 1193 10 4.329564 +EDGE_RANGE_SE2_XY 1193 15 3.219333 +EDGE_RANGE_SE2_XY 1193 16 2.546244 +EDGE_RANGE_SE2_XY 1193 65 4.651653 +EDGE_RANGE_SE2_XY 1193 78 3.325221 +EDGE_RANGE_SE2_XY 1193 80 0.791087 +EDGE_RANGE_SE2_XY 1193 90 4.760429 +EDGE_RANGE_SE2_XY 1194 10 3.949832 +EDGE_RANGE_SE2_XY 1194 15 2.706968 +EDGE_RANGE_SE2_XY 1194 16 2.715280 +EDGE_RANGE_SE2_XY 1194 65 3.938081 +EDGE_RANGE_SE2_XY 1194 78 3.695611 +EDGE_RANGE_SE2_XY 1194 90 3.786680 +EDGE_RANGE_SE2_XY 1194 97 4.441485 +EDGE_RANGE_SE2_XY 1195 1 4.070442 +EDGE_RANGE_SE2_XY 1195 16 2.863135 +EDGE_RANGE_SE2_XY 1195 47 4.567223 +EDGE_RANGE_SE2_XY 1195 65 3.920206 +EDGE_RANGE_SE2_XY 1195 80 1.449495 +EDGE_RANGE_SE2_XY 1195 90 3.826172 +EDGE_RANGE_SE2_XY 1195 97 4.401054 +EDGE_RANGE_SE2_XY 1196 1 4.133477 +EDGE_RANGE_SE2_XY 1196 16 1.885302 +EDGE_RANGE_SE2_XY 1196 47 4.206361 +EDGE_RANGE_SE2_XY 1196 65 3.232485 +EDGE_RANGE_SE2_XY 1196 80 1.338347 +EDGE_RANGE_SE2_XY 1196 90 4.328686 +EDGE_RANGE_SE2_XY 1196 97 3.610394 +EDGE_RANGE_SE2_XY 1197 1 4.416918 +EDGE_RANGE_SE2_XY 1197 16 1.289153 +EDGE_RANGE_SE2_XY 1197 29 4.560841 +EDGE_RANGE_SE2_XY 1197 47 3.957951 +EDGE_RANGE_SE2_XY 1197 65 2.729209 +EDGE_RANGE_SE2_XY 1197 66 4.986463 +EDGE_RANGE_SE2_XY 1197 80 1.803454 +EDGE_RANGE_SE2_XY 1197 97 2.932736 +EDGE_RANGE_SE2_XY 1198 1 4.909354 +EDGE_RANGE_SE2_XY 1198 16 1.250421 +EDGE_RANGE_SE2_XY 1198 29 3.487527 +EDGE_RANGE_SE2_XY 1198 47 3.971228 +EDGE_RANGE_SE2_XY 1198 65 2.503570 +EDGE_RANGE_SE2_XY 1198 66 4.644293 +EDGE_RANGE_SE2_XY 1198 97 2.380034 +EDGE_RANGE_SE2_XY 1199 25 4.811476 +EDGE_RANGE_SE2_XY 1199 29 2.602070 +EDGE_RANGE_SE2_XY 1199 47 4.274801 +EDGE_RANGE_SE2_XY 1199 65 2.666547 +EDGE_RANGE_SE2_XY 1199 66 4.457827 +EDGE_RANGE_SE2_XY 1199 97 2.327553 +EDGE_RANGE_SE2_XY 1200 16 1.893688 +EDGE_RANGE_SE2_XY 1200 25 4.837983 +EDGE_RANGE_SE2_XY 1200 29 2.540046 +EDGE_RANGE_SE2_XY 1200 65 2.690557 +EDGE_RANGE_SE2_XY 1200 80 3.527857 +EDGE_RANGE_SE2_XY 1200 97 2.320451 +EDGE_RANGE_SE2_XY 1201 25 4.062562 +EDGE_RANGE_SE2_XY 1201 29 2.478835 +EDGE_RANGE_SE2_XY 1201 65 1.746844 +EDGE_RANGE_SE2_XY 1201 80 4.097271 +EDGE_RANGE_SE2_XY 1201 97 1.341309 +EDGE_RANGE_SE2_XY 1202 25 3.424665 +EDGE_RANGE_SE2_XY 1202 29 2.764506 +EDGE_RANGE_SE2_XY 1202 65 1.115291 +EDGE_RANGE_SE2_XY 1202 97 0.401839 +EDGE_RANGE_SE2_XY 1203 25 3.039439 +EDGE_RANGE_SE2_XY 1203 29 3.327397 +EDGE_RANGE_SE2_XY 1203 65 1.059490 +EDGE_RANGE_SE2_XY 1204 25 2.955107 +EDGE_RANGE_SE2_XY 1204 85 4.672656 +EDGE_RANGE_SE2_XY 1205 25 3.153098 +EDGE_RANGE_SE2_XY 1205 85 3.681370 +EDGE_RANGE_SE2_XY 1206 25 3.644466 +EDGE_RANGE_SE2_XY 1206 85 2.740042 +EDGE_RANGE_SE2_XY 1207 25 3.608870 +EDGE_RANGE_SE2_XY 1207 65 3.635359 +EDGE_RANGE_SE2_XY 1207 85 2.832692 +EDGE_RANGE_SE2_XY 1207 97 3.733134 +EDGE_RANGE_SE2_XY 1208 25 3.670818 +EDGE_RANGE_SE2_XY 1208 65 3.630327 +EDGE_RANGE_SE2_XY 1208 97 3.747595 +EDGE_RANGE_SE2_XY 1209 25 3.158081 +EDGE_RANGE_SE2_XY 1209 29 4.819441 +EDGE_RANGE_SE2_XY 1209 65 2.686371 +EDGE_RANGE_SE2_XY 1209 97 2.660065 +EDGE_RANGE_SE2_XY 1210 25 2.907611 +EDGE_RANGE_SE2_XY 1210 29 4.054449 +EDGE_RANGE_SE2_XY 1210 65 1.829921 +EDGE_RANGE_SE2_XY 1210 97 1.699815 +EDGE_RANGE_SE2_XY 1211 25 2.954148 +EDGE_RANGE_SE2_XY 1211 29 4.079020 +EDGE_RANGE_SE2_XY 1211 65 1.801341 +EDGE_RANGE_SE2_XY 1211 85 4.586944 +EDGE_RANGE_SE2_XY 1211 97 1.682302 +EDGE_RANGE_SE2_XY 1212 25 2.872034 +EDGE_RANGE_SE2_XY 1212 85 4.674533 +EDGE_RANGE_SE2_XY 1213 25 3.178980 +EDGE_RANGE_SE2_XY 1213 85 3.712502 +EDGE_RANGE_SE2_XY 1214 25 3.578454 +EDGE_RANGE_SE2_XY 1214 85 2.794567 +EDGE_RANGE_SE2_XY 1215 85 1.913891 +EDGE_RANGE_SE2_XY 1216 85 1.516091 +EDGE_RANGE_SE2_XY 1217 85 1.496699 +EDGE_RANGE_SE2_XY 1220 7 5.025832 +EDGE_RANGE_SE2_XY 1220 36 4.807054 +EDGE_RANGE_SE2_XY 1220 76 4.261249 +EDGE_RANGE_SE2_XY 1221 7 4.162080 +EDGE_RANGE_SE2_XY 1221 36 3.948160 +EDGE_RANGE_SE2_XY 1221 76 3.397153 +EDGE_RANGE_SE2_XY 1221 88 4.354935 +EDGE_RANGE_SE2_XY 1222 7 3.587738 +EDGE_RANGE_SE2_XY 1222 36 3.310180 +EDGE_RANGE_SE2_XY 1222 76 2.486001 +EDGE_RANGE_SE2_XY 1222 88 3.427855 +EDGE_RANGE_SE2_XY 1223 76 2.562533 +EDGE_RANGE_SE2_XY 1223 88 3.315923 +EDGE_RANGE_SE2_XY 1224 88 3.213683 +EDGE_RANGE_SE2_XY 1225 88 3.487200 +EDGE_RANGE_SE2_XY 1225 95 4.947531 +EDGE_RANGE_SE2_XY 1226 45 4.729564 +EDGE_RANGE_SE2_XY 1226 88 3.836709 +EDGE_RANGE_SE2_XY 1226 95 4.186590 +EDGE_RANGE_SE2_XY 1227 45 3.732015 +EDGE_RANGE_SE2_XY 1227 48 4.690890 +EDGE_RANGE_SE2_XY 1227 88 4.495451 +EDGE_RANGE_SE2_XY 1227 92 4.864575 +EDGE_RANGE_SE2_XY 1227 95 3.430961 +EDGE_RANGE_SE2_XY 1228 45 2.868818 +EDGE_RANGE_SE2_XY 1228 48 3.706979 +EDGE_RANGE_SE2_XY 1228 86 4.413380 +EDGE_RANGE_SE2_XY 1228 92 3.901915 +EDGE_RANGE_SE2_XY 1228 95 2.929153 +EDGE_RANGE_SE2_XY 1229 13 4.884696 +EDGE_RANGE_SE2_XY 1229 22 4.905469 +EDGE_RANGE_SE2_XY 1229 45 1.998537 +EDGE_RANGE_SE2_XY 1229 48 2.773156 +EDGE_RANGE_SE2_XY 1229 86 3.437633 +EDGE_RANGE_SE2_XY 1229 89 4.483337 +EDGE_RANGE_SE2_XY 1229 92 2.985930 +EDGE_RANGE_SE2_XY 1229 95 2.737702 +EDGE_RANGE_SE2_XY 1230 13 4.874541 +EDGE_RANGE_SE2_XY 1230 22 4.904797 +EDGE_RANGE_SE2_XY 1230 45 1.980051 +EDGE_RANGE_SE2_XY 1230 48 2.691680 +EDGE_RANGE_SE2_XY 1230 86 3.418111 +EDGE_RANGE_SE2_XY 1230 89 4.472245 +EDGE_RANGE_SE2_XY 1230 92 3.082565 +EDGE_RANGE_SE2_XY 1230 95 2.757656 +EDGE_RANGE_SE2_XY 1231 13 4.283046 +EDGE_RANGE_SE2_XY 1231 22 4.773159 +EDGE_RANGE_SE2_XY 1231 45 1.562323 +EDGE_RANGE_SE2_XY 1231 48 2.591490 +EDGE_RANGE_SE2_XY 1231 86 3.905893 +EDGE_RANGE_SE2_XY 1231 89 3.680481 +EDGE_RANGE_SE2_XY 1231 95 1.786610 +EDGE_RANGE_SE2_XY 1232 13 3.824515 +EDGE_RANGE_SE2_XY 1232 22 4.798024 +EDGE_RANGE_SE2_XY 1232 45 1.811695 +EDGE_RANGE_SE2_XY 1232 48 2.843236 +EDGE_RANGE_SE2_XY 1232 89 2.934137 +EDGE_RANGE_SE2_XY 1232 95 0.797827 +EDGE_RANGE_SE2_XY 1233 13 3.665537 +EDGE_RANGE_SE2_XY 1233 46 4.173350 +EDGE_RANGE_SE2_XY 1233 48 3.371316 +EDGE_RANGE_SE2_XY 1233 57 5.033949 +EDGE_RANGE_SE2_XY 1233 70 4.629676 +EDGE_RANGE_SE2_XY 1233 89 2.458587 +EDGE_RANGE_SE2_XY 1234 13 3.698568 +EDGE_RANGE_SE2_XY 1234 46 3.146642 +EDGE_RANGE_SE2_XY 1234 57 4.884318 +EDGE_RANGE_SE2_XY 1234 58 4.618880 +EDGE_RANGE_SE2_XY 1234 70 4.300247 +EDGE_RANGE_SE2_XY 1234 89 2.345803 +EDGE_RANGE_SE2_XY 1235 13 4.100670 +EDGE_RANGE_SE2_XY 1235 46 2.420150 +EDGE_RANGE_SE2_XY 1235 57 4.904865 +EDGE_RANGE_SE2_XY 1235 58 4.452771 +EDGE_RANGE_SE2_XY 1235 70 4.148658 +EDGE_RANGE_SE2_XY 1235 89 2.706360 +EDGE_RANGE_SE2_XY 1235 94 4.728010 +EDGE_RANGE_SE2_XY 1236 13 4.588444 +EDGE_RANGE_SE2_XY 1236 46 1.858859 +EDGE_RANGE_SE2_XY 1236 58 4.500299 +EDGE_RANGE_SE2_XY 1236 70 4.336632 +EDGE_RANGE_SE2_XY 1236 89 3.170372 +EDGE_RANGE_SE2_XY 1236 90 4.574416 +EDGE_RANGE_SE2_XY 1236 94 3.856795 +EDGE_RANGE_SE2_XY 1237 46 1.741251 +EDGE_RANGE_SE2_XY 1237 49 4.670148 +EDGE_RANGE_SE2_XY 1237 58 4.728350 +EDGE_RANGE_SE2_XY 1237 70 4.648247 +EDGE_RANGE_SE2_XY 1237 90 3.533917 +EDGE_RANGE_SE2_XY 1237 94 3.152951 +EDGE_RANGE_SE2_XY 1238 15 4.950128 +EDGE_RANGE_SE2_XY 1238 46 2.017402 +EDGE_RANGE_SE2_XY 1238 49 3.828888 +EDGE_RANGE_SE2_XY 1238 90 2.563085 +EDGE_RANGE_SE2_XY 1238 94 2.601087 +EDGE_RANGE_SE2_XY 1239 15 4.963691 +EDGE_RANGE_SE2_XY 1239 46 2.085862 +EDGE_RANGE_SE2_XY 1239 49 3.875075 +EDGE_RANGE_SE2_XY 1239 89 4.834595 +EDGE_RANGE_SE2_XY 1239 90 2.565275 +EDGE_RANGE_SE2_XY 1239 94 2.607385 +EDGE_RANGE_SE2_XY 1240 46 2.069027 +EDGE_RANGE_SE2_XY 1240 89 4.830231 +EDGE_RANGE_SE2_XY 1240 94 2.598213 +EDGE_RANGE_SE2_XY 1241 46 1.677517 +EDGE_RANGE_SE2_XY 1241 58 4.687600 +EDGE_RANGE_SE2_XY 1241 70 4.589563 +EDGE_RANGE_SE2_XY 1241 89 4.005086 +EDGE_RANGE_SE2_XY 1241 94 3.157980 +EDGE_RANGE_SE2_XY 1241 95 4.251354 +EDGE_RANGE_SE2_XY 1242 13 4.557106 +EDGE_RANGE_SE2_XY 1242 46 1.779386 +EDGE_RANGE_SE2_XY 1242 58 4.414014 +EDGE_RANGE_SE2_XY 1242 70 4.330822 +EDGE_RANGE_SE2_XY 1242 89 3.232256 +EDGE_RANGE_SE2_XY 1242 95 3.246384 +EDGE_RANGE_SE2_XY 1243 13 4.100092 +EDGE_RANGE_SE2_XY 1243 45 4.185016 +EDGE_RANGE_SE2_XY 1243 48 4.924093 +EDGE_RANGE_SE2_XY 1243 57 4.934821 +EDGE_RANGE_SE2_XY 1243 58 4.502068 +EDGE_RANGE_SE2_XY 1243 70 4.162285 +EDGE_RANGE_SE2_XY 1243 89 2.597506 +EDGE_RANGE_SE2_XY 1243 95 2.291012 +EDGE_RANGE_SE2_XY 1244 45 4.175544 +EDGE_RANGE_SE2_XY 1244 46 2.455749 +EDGE_RANGE_SE2_XY 1244 48 4.875079 +EDGE_RANGE_SE2_XY 1244 94 4.731783 +EDGE_RANGE_SE2_XY 1244 95 2.293464 +EDGE_RANGE_SE2_XY 1245 45 4.648957 +EDGE_RANGE_SE2_XY 1245 95 2.491083 +EDGE_RANGE_SE2_XY 1246 95 3.043062 +EDGE_RANGE_SE2_XY 1247 85 4.450371 +EDGE_RANGE_SE2_XY 1248 85 3.459402 +EDGE_RANGE_SE2_XY 1249 85 2.486152 +EDGE_RANGE_SE2_XY 1250 85 2.500222 +EDGE_RANGE_SE2_XY 1251 85 2.880987 +EDGE_RANGE_SE2_XY 1253 76 4.682937 +EDGE_RANGE_SE2_XY 1254 76 4.722052 +EDGE_RANGE_SE2_XY 1254 85 4.284673 +EDGE_RANGE_SE2_XY 1255 85 4.925454 +EDGE_RANGE_SE2_XY 1255 95 4.159936 +EDGE_RANGE_SE2_XY 1256 45 4.741565 +EDGE_RANGE_SE2_XY 1256 95 3.194540 +EDGE_RANGE_SE2_XY 1257 45 4.693971 +EDGE_RANGE_SE2_XY 1257 95 3.235635 +EDGE_RANGE_SE2_XY 1258 45 4.551213 +EDGE_RANGE_SE2_XY 1258 88 4.708445 +EDGE_RANGE_SE2_XY 1258 95 3.576131 +EDGE_RANGE_SE2_XY 1259 45 4.766895 +EDGE_RANGE_SE2_XY 1259 76 4.996521 +EDGE_RANGE_SE2_XY 1259 88 3.895599 +EDGE_RANGE_SE2_XY 1259 95 4.216114 +EDGE_RANGE_SE2_XY 1260 71 4.478186 +EDGE_RANGE_SE2_XY 1260 76 4.710070 +EDGE_RANGE_SE2_XY 1260 88 3.066984 +EDGE_RANGE_SE2_XY 1261 14 4.837468 +EDGE_RANGE_SE2_XY 1261 71 3.528099 +EDGE_RANGE_SE2_XY 1261 76 4.512326 +EDGE_RANGE_SE2_XY 1261 88 2.454725 +EDGE_RANGE_SE2_XY 1262 14 4.095101 +EDGE_RANGE_SE2_XY 1262 20 4.256187 +EDGE_RANGE_SE2_XY 1262 71 2.788134 +EDGE_RANGE_SE2_XY 1262 76 4.690158 +EDGE_RANGE_SE2_XY 1262 88 2.141852 +EDGE_RANGE_SE2_XY 1263 14 3.589026 +EDGE_RANGE_SE2_XY 1263 20 3.230367 +EDGE_RANGE_SE2_XY 1263 71 2.118562 +EDGE_RANGE_SE2_XY 1263 88 2.198045 +EDGE_RANGE_SE2_XY 1264 14 3.184778 +EDGE_RANGE_SE2_XY 1264 20 2.263384 +EDGE_RANGE_SE2_XY 1264 71 1.872364 +EDGE_RANGE_SE2_XY 1264 88 2.753385 +EDGE_RANGE_SE2_XY 1265 14 3.045889 +EDGE_RANGE_SE2_XY 1265 20 1.276676 +EDGE_RANGE_SE2_XY 1265 71 2.095155 +EDGE_RANGE_SE2_XY 1265 73 4.121732 +EDGE_RANGE_SE2_XY 1265 79 4.160250 +EDGE_RANGE_SE2_XY 1266 14 3.062959 +EDGE_RANGE_SE2_XY 1266 20 1.245096 +EDGE_RANGE_SE2_XY 1266 73 4.100068 +EDGE_RANGE_SE2_XY 1266 79 4.146829 +EDGE_RANGE_SE2_XY 1266 88 3.463712 +EDGE_RANGE_SE2_XY 1267 14 2.067031 +EDGE_RANGE_SE2_XY 1267 20 1.410491 +EDGE_RANGE_SE2_XY 1267 73 3.840888 +EDGE_RANGE_SE2_XY 1267 79 4.576199 +EDGE_RANGE_SE2_XY 1268 14 1.091351 +EDGE_RANGE_SE2_XY 1268 73 3.835747 +EDGE_RANGE_SE2_XY 1269 14 0.235072 +EDGE_RANGE_SE2_XY 1269 73 4.067198 +EDGE_RANGE_SE2_XY 1270 52 4.414945 +EDGE_RANGE_SE2_XY 1270 73 4.503675 +EDGE_RANGE_SE2_XY 1270 92 4.636388 +EDGE_RANGE_SE2_XY 1271 44 4.962265 +EDGE_RANGE_SE2_XY 1271 52 3.463221 +EDGE_RANGE_SE2_XY 1271 81 4.927370 +EDGE_RANGE_SE2_XY 1271 82 4.092316 +EDGE_RANGE_SE2_XY 1271 86 4.842935 +EDGE_RANGE_SE2_XY 1271 92 4.420958 +EDGE_RANGE_SE2_XY 1272 14 1.988432 +EDGE_RANGE_SE2_XY 1272 20 4.828816 +EDGE_RANGE_SE2_XY 1272 44 4.929056 +EDGE_RANGE_SE2_XY 1272 52 3.454819 +EDGE_RANGE_SE2_XY 1272 81 4.937037 +EDGE_RANGE_SE2_XY 1272 82 3.986897 +EDGE_RANGE_SE2_XY 1272 86 4.801727 +EDGE_RANGE_SE2_XY 1272 92 4.378054 +EDGE_RANGE_SE2_XY 1273 14 2.116795 +EDGE_RANGE_SE2_XY 1273 44 4.787627 +EDGE_RANGE_SE2_XY 1273 52 4.013688 +EDGE_RANGE_SE2_XY 1273 81 4.357543 +EDGE_RANGE_SE2_XY 1273 82 3.811295 +EDGE_RANGE_SE2_XY 1273 86 3.857038 +EDGE_RANGE_SE2_XY 1273 92 3.451116 +EDGE_RANGE_SE2_XY 1274 14 2.681443 +EDGE_RANGE_SE2_XY 1274 44 4.882887 +EDGE_RANGE_SE2_XY 1274 48 4.910631 +EDGE_RANGE_SE2_XY 1274 81 3.931309 +EDGE_RANGE_SE2_XY 1274 82 3.714208 +EDGE_RANGE_SE2_XY 1274 86 2.881065 +EDGE_RANGE_SE2_XY 1274 92 2.455685 +EDGE_RANGE_SE2_XY 1275 45 4.175326 +EDGE_RANGE_SE2_XY 1275 48 3.891521 +EDGE_RANGE_SE2_XY 1275 81 3.765544 +EDGE_RANGE_SE2_XY 1275 82 3.909520 +EDGE_RANGE_SE2_XY 1275 86 2.053101 +EDGE_RANGE_SE2_XY 1275 92 1.518415 +EDGE_RANGE_SE2_XY 1276 14 3.396183 +EDGE_RANGE_SE2_XY 1276 45 4.168524 +EDGE_RANGE_SE2_XY 1276 48 3.825816 +EDGE_RANGE_SE2_XY 1276 81 3.773525 +EDGE_RANGE_SE2_XY 1276 82 3.978836 +EDGE_RANGE_SE2_XY 1276 86 2.037015 +EDGE_RANGE_SE2_XY 1276 92 1.486834 +EDGE_RANGE_SE2_XY 1277 2 4.623981 +EDGE_RANGE_SE2_XY 1277 22 4.652136 +EDGE_RANGE_SE2_XY 1277 44 4.246896 +EDGE_RANGE_SE2_XY 1277 45 4.379695 +EDGE_RANGE_SE2_XY 1277 48 3.888707 +EDGE_RANGE_SE2_XY 1277 52 4.860047 +EDGE_RANGE_SE2_XY 1277 53 4.506790 +EDGE_RANGE_SE2_XY 1277 77 4.330529 +EDGE_RANGE_SE2_XY 1277 81 2.769729 +EDGE_RANGE_SE2_XY 1277 82 2.995590 +EDGE_RANGE_SE2_XY 1277 86 1.698151 +EDGE_RANGE_SE2_XY 1277 92 1.495560 +EDGE_RANGE_SE2_XY 1278 2 3.703716 +EDGE_RANGE_SE2_XY 1278 22 4.346654 +EDGE_RANGE_SE2_XY 1278 44 3.356126 +EDGE_RANGE_SE2_XY 1278 45 4.721130 +EDGE_RANGE_SE2_XY 1278 48 4.085425 +EDGE_RANGE_SE2_XY 1278 52 4.577173 +EDGE_RANGE_SE2_XY 1278 53 3.661755 +EDGE_RANGE_SE2_XY 1278 77 3.381674 +EDGE_RANGE_SE2_XY 1278 81 1.754797 +EDGE_RANGE_SE2_XY 1278 82 2.221140 +EDGE_RANGE_SE2_XY 1278 86 1.871838 +EDGE_RANGE_SE2_XY 1279 2 2.725430 +EDGE_RANGE_SE2_XY 1279 22 4.275036 +EDGE_RANGE_SE2_XY 1279 43 4.742250 +EDGE_RANGE_SE2_XY 1279 44 2.524849 +EDGE_RANGE_SE2_XY 1279 48 4.519649 +EDGE_RANGE_SE2_XY 1279 52 4.426156 +EDGE_RANGE_SE2_XY 1279 53 2.903794 +EDGE_RANGE_SE2_XY 1279 77 2.405473 +EDGE_RANGE_SE2_XY 1279 81 0.808210 +EDGE_RANGE_SE2_XY 1279 82 1.510961 +EDGE_RANGE_SE2_XY 1280 2 1.925936 +EDGE_RANGE_SE2_XY 1280 22 4.461893 +EDGE_RANGE_SE2_XY 1280 43 4.214063 +EDGE_RANGE_SE2_XY 1280 44 1.942191 +EDGE_RANGE_SE2_XY 1280 52 4.517238 +EDGE_RANGE_SE2_XY 1280 53 2.366075 +EDGE_RANGE_SE2_XY 1280 77 1.474101 +EDGE_RANGE_SE2_XY 1280 82 1.355377 +EDGE_RANGE_SE2_XY 1281 2 1.844271 +EDGE_RANGE_SE2_XY 1281 44 1.910390 +EDGE_RANGE_SE2_XY 1281 52 4.449889 +EDGE_RANGE_SE2_XY 1281 77 1.356354 +EDGE_RANGE_SE2_XY 1281 81 0.317423 +EDGE_RANGE_SE2_XY 1281 82 1.324630 +EDGE_RANGE_SE2_XY 1281 86 3.305991 +EDGE_RANGE_SE2_XY 1281 92 3.667947 +EDGE_RANGE_SE2_XY 1282 44 1.105743 +EDGE_RANGE_SE2_XY 1282 52 3.533202 +EDGE_RANGE_SE2_XY 1282 77 1.350927 +EDGE_RANGE_SE2_XY 1282 82 0.451458 +EDGE_RANGE_SE2_XY 1282 86 3.907387 +EDGE_RANGE_SE2_XY 1282 92 4.185877 +EDGE_RANGE_SE2_XY 1283 2 2.666971 +EDGE_RANGE_SE2_XY 1283 52 3.470431 +EDGE_RANGE_SE2_XY 1283 53 3.325599 +EDGE_RANGE_SE2_XY 1283 81 1.174150 +EDGE_RANGE_SE2_XY 1283 82 0.446313 +EDGE_RANGE_SE2_XY 1283 86 3.951945 +EDGE_RANGE_SE2_XY 1283 92 4.103931 +EDGE_RANGE_SE2_XY 1284 2 2.625995 +EDGE_RANGE_SE2_XY 1284 44 1.130278 +EDGE_RANGE_SE2_XY 1284 53 3.352898 +EDGE_RANGE_SE2_XY 1284 77 1.373262 +EDGE_RANGE_SE2_XY 1284 81 1.197537 +EDGE_RANGE_SE2_XY 1284 86 3.945248 +EDGE_RANGE_SE2_XY 1284 92 4.143425 +EDGE_RANGE_SE2_XY 1285 2 1.879499 +EDGE_RANGE_SE2_XY 1285 22 4.484983 +EDGE_RANGE_SE2_XY 1285 43 4.267837 +EDGE_RANGE_SE2_XY 1285 53 2.395062 +EDGE_RANGE_SE2_XY 1285 77 1.429183 +EDGE_RANGE_SE2_XY 1285 81 0.291862 +EDGE_RANGE_SE2_XY 1285 86 3.339092 +EDGE_RANGE_SE2_XY 1285 92 3.647848 +EDGE_RANGE_SE2_XY 1286 2 1.472806 +EDGE_RANGE_SE2_XY 1286 22 3.492610 +EDGE_RANGE_SE2_XY 1286 32 4.414517 +EDGE_RANGE_SE2_XY 1286 43 3.309260 +EDGE_RANGE_SE2_XY 1286 48 4.435993 +EDGE_RANGE_SE2_XY 1286 53 1.495044 +EDGE_RANGE_SE2_XY 1286 86 2.920705 +EDGE_RANGE_SE2_XY 1286 92 3.440778 +EDGE_RANGE_SE2_XY 1287 2 1.621166 +EDGE_RANGE_SE2_XY 1287 13 4.808545 +EDGE_RANGE_SE2_XY 1287 22 2.629627 +EDGE_RANGE_SE2_XY 1287 32 3.589715 +EDGE_RANGE_SE2_XY 1287 43 2.556977 +EDGE_RANGE_SE2_XY 1287 45 4.857075 +EDGE_RANGE_SE2_XY 1287 48 3.851681 +EDGE_RANGE_SE2_XY 1287 53 0.894320 +EDGE_RANGE_SE2_XY 1287 86 2.863668 +EDGE_RANGE_SE2_XY 1287 92 3.474394 +EDGE_RANGE_SE2_XY 1288 13 3.989193 +EDGE_RANGE_SE2_XY 1288 22 1.805312 +EDGE_RANGE_SE2_XY 1288 32 2.931509 +EDGE_RANGE_SE2_XY 1288 43 1.976415 +EDGE_RANGE_SE2_XY 1288 45 4.558154 +EDGE_RANGE_SE2_XY 1288 48 3.470809 +EDGE_RANGE_SE2_XY 1288 53 1.169658 +EDGE_RANGE_SE2_XY 1288 56 4.530705 +EDGE_RANGE_SE2_XY 1288 57 4.184733 +EDGE_RANGE_SE2_XY 1288 86 3.108068 +EDGE_RANGE_SE2_XY 1288 92 3.754182 +EDGE_RANGE_SE2_XY 1289 13 3.241487 +EDGE_RANGE_SE2_XY 1289 22 1.243058 +EDGE_RANGE_SE2_XY 1289 32 2.536938 +EDGE_RANGE_SE2_XY 1289 43 1.855549 +EDGE_RANGE_SE2_XY 1289 45 4.428318 +EDGE_RANGE_SE2_XY 1289 48 3.365773 +EDGE_RANGE_SE2_XY 1289 56 3.599799 +EDGE_RANGE_SE2_XY 1289 57 3.302304 +EDGE_RANGE_SE2_XY 1289 58 4.659555 +EDGE_RANGE_SE2_XY 1289 70 4.400884 +EDGE_RANGE_SE2_XY 1289 86 3.699348 +EDGE_RANGE_SE2_XY 1289 89 4.615387 +EDGE_RANGE_SE2_XY 1289 92 4.281365 +EDGE_RANGE_SE2_XY 1290 13 2.624643 +EDGE_RANGE_SE2_XY 1290 22 1.455756 +EDGE_RANGE_SE2_XY 1290 32 2.494457 +EDGE_RANGE_SE2_XY 1290 43 2.204883 +EDGE_RANGE_SE2_XY 1290 45 4.446543 +EDGE_RANGE_SE2_XY 1290 48 3.579561 +EDGE_RANGE_SE2_XY 1290 56 2.786621 +EDGE_RANGE_SE2_XY 1290 57 2.384745 +EDGE_RANGE_SE2_XY 1290 58 3.777514 +EDGE_RANGE_SE2_XY 1290 70 3.546602 +EDGE_RANGE_SE2_XY 1290 89 4.058115 +EDGE_RANGE_SE2_XY 1291 13 2.389766 +EDGE_RANGE_SE2_XY 1291 19 4.940563 +EDGE_RANGE_SE2_XY 1291 32 2.797034 +EDGE_RANGE_SE2_XY 1291 45 4.765905 +EDGE_RANGE_SE2_XY 1291 48 4.070783 +EDGE_RANGE_SE2_XY 1291 56 2.121230 +EDGE_RANGE_SE2_XY 1291 57 1.530099 +EDGE_RANGE_SE2_XY 1291 58 2.862678 +EDGE_RANGE_SE2_XY 1291 70 2.807323 +EDGE_RANGE_SE2_XY 1291 89 3.742873 +EDGE_RANGE_SE2_XY 1292 13 2.496375 +EDGE_RANGE_SE2_XY 1292 19 4.924565 +EDGE_RANGE_SE2_XY 1292 32 3.377225 +EDGE_RANGE_SE2_XY 1292 48 4.644819 +EDGE_RANGE_SE2_XY 1292 56 1.683986 +EDGE_RANGE_SE2_XY 1292 57 1.109628 +EDGE_RANGE_SE2_XY 1292 58 2.124230 +EDGE_RANGE_SE2_XY 1292 70 2.067546 +EDGE_RANGE_SE2_XY 1292 89 3.675254 +EDGE_RANGE_SE2_XY 1293 13 2.902459 +EDGE_RANGE_SE2_XY 1293 46 4.716153 +EDGE_RANGE_SE2_XY 1293 56 1.943696 +EDGE_RANGE_SE2_XY 1293 57 1.444226 +EDGE_RANGE_SE2_XY 1293 58 1.595566 +EDGE_RANGE_SE2_XY 1293 70 1.854717 +EDGE_RANGE_SE2_XY 1293 89 3.831137 +EDGE_RANGE_SE2_XY 1294 22 3.960571 +EDGE_RANGE_SE2_XY 1294 32 4.066581 +EDGE_RANGE_SE2_XY 1294 43 4.602679 +EDGE_RANGE_SE2_XY 1294 56 1.928226 +EDGE_RANGE_SE2_XY 1295 13 2.851424 +EDGE_RANGE_SE2_XY 1295 46 4.714164 +EDGE_RANGE_SE2_XY 1295 56 1.935007 +EDGE_RANGE_SE2_XY 1295 57 1.464385 +EDGE_RANGE_SE2_XY 1295 58 1.633014 +EDGE_RANGE_SE2_XY 1295 70 1.869437 +EDGE_RANGE_SE2_XY 1295 89 3.792808 +EDGE_RANGE_SE2_XY 1296 46 4.384748 +EDGE_RANGE_SE2_XY 1296 58 1.690269 +EDGE_RANGE_SE2_XY 1296 70 2.160697 +EDGE_RANGE_SE2_XY 1296 89 4.204460 +EDGE_RANGE_SE2_XY 1296 94 4.726742 +EDGE_RANGE_SE2_XY 1297 46 4.281354 +EDGE_RANGE_SE2_XY 1297 89 4.816233 +EDGE_RANGE_SE2_XY 1297 94 4.132851 +EDGE_RANGE_SE2_XY 1298 26 4.900856 +EDGE_RANGE_SE2_XY 1298 46 4.419546 +EDGE_RANGE_SE2_XY 1298 49 4.376752 +EDGE_RANGE_SE2_XY 1298 84 4.172923 +EDGE_RANGE_SE2_XY 1298 94 3.751827 +EDGE_RANGE_SE2_XY 1299 26 4.536593 +EDGE_RANGE_SE2_XY 1299 46 4.804809 +EDGE_RANGE_SE2_XY 1299 49 3.819084 +EDGE_RANGE_SE2_XY 1299 84 3.356955 +EDGE_RANGE_SE2_XY 1299 94 3.594022 +EDGE_RANGE_SE2_XY 1300 26 4.352760 +EDGE_RANGE_SE2_XY 1300 49 3.458195 +EDGE_RANGE_SE2_XY 1300 84 2.601248 +EDGE_RANGE_SE2_XY 1300 94 3.738140 +EDGE_RANGE_SE2_XY 1301 9 4.383572 +EDGE_RANGE_SE2_XY 1301 10 4.563404 +EDGE_RANGE_SE2_XY 1301 26 4.397839 +EDGE_RANGE_SE2_XY 1301 49 3.394041 +EDGE_RANGE_SE2_XY 1301 59 4.771256 +EDGE_RANGE_SE2_XY 1301 84 2.107430 +EDGE_RANGE_SE2_XY 1301 94 4.099481 +EDGE_RANGE_SE2_XY 1302 9 4.366461 +EDGE_RANGE_SE2_XY 1302 10 4.570484 +EDGE_RANGE_SE2_XY 1302 49 3.375475 +EDGE_RANGE_SE2_XY 1302 59 4.827922 +EDGE_RANGE_SE2_XY 1302 84 2.071011 +EDGE_RANGE_SE2_XY 1302 94 4.091899 +EDGE_RANGE_SE2_XY 1303 9 4.515332 +EDGE_RANGE_SE2_XY 1303 10 3.682531 +EDGE_RANGE_SE2_XY 1303 15 4.850322 +EDGE_RANGE_SE2_XY 1303 49 2.340735 +EDGE_RANGE_SE2_XY 1303 84 1.189454 +EDGE_RANGE_SE2_XY 1303 94 3.244082 +EDGE_RANGE_SE2_XY 1304 9 4.496173 +EDGE_RANGE_SE2_XY 1304 10 3.673187 +EDGE_RANGE_SE2_XY 1304 15 4.864539 +EDGE_RANGE_SE2_XY 1304 49 2.338773 +EDGE_RANGE_SE2_XY 1304 84 1.208701 +EDGE_RANGE_SE2_XY 1304 94 3.231548 +EDGE_RANGE_SE2_XY 1305 9 4.414827 +EDGE_RANGE_SE2_XY 1305 10 3.721318 +EDGE_RANGE_SE2_XY 1305 15 4.914226 +EDGE_RANGE_SE2_XY 1305 49 2.391348 +EDGE_RANGE_SE2_XY 1305 84 1.185354 +EDGE_RANGE_SE2_XY 1305 94 3.254959 +EDGE_RANGE_SE2_XY 1306 10 3.722926 +EDGE_RANGE_SE2_XY 1306 15 4.886584 +EDGE_RANGE_SE2_XY 1306 49 2.338735 +EDGE_RANGE_SE2_XY 1306 84 1.148940 +EDGE_RANGE_SE2_XY 1306 94 3.228555 +EDGE_RANGE_SE2_XY 1307 9 4.471809 +EDGE_RANGE_SE2_XY 1307 10 3.714716 +EDGE_RANGE_SE2_XY 1307 15 4.906841 +EDGE_RANGE_SE2_XY 1307 49 2.385740 +EDGE_RANGE_SE2_XY 1307 84 1.214837 +EDGE_RANGE_SE2_XY 1307 94 3.272828 +EDGE_RANGE_SE2_XY 1308 9 4.863626 +EDGE_RANGE_SE2_XY 1308 10 2.869972 +EDGE_RANGE_SE2_XY 1308 15 3.961584 +EDGE_RANGE_SE2_XY 1308 46 4.815195 +EDGE_RANGE_SE2_XY 1308 49 1.408692 +EDGE_RANGE_SE2_XY 1308 84 0.768081 +EDGE_RANGE_SE2_XY 1308 90 4.445417 +EDGE_RANGE_SE2_XY 1308 94 2.527471 +EDGE_RANGE_SE2_XY 1309 9 4.826135 +EDGE_RANGE_SE2_XY 1309 10 2.885173 +EDGE_RANGE_SE2_XY 1309 15 3.999062 +EDGE_RANGE_SE2_XY 1309 49 1.409538 +EDGE_RANGE_SE2_XY 1309 84 0.753935 +EDGE_RANGE_SE2_XY 1309 90 4.412177 +EDGE_RANGE_SE2_XY 1310 9 4.830314 +EDGE_RANGE_SE2_XY 1310 46 4.784649 +EDGE_RANGE_SE2_XY 1310 84 0.704061 +EDGE_RANGE_SE2_XY 1310 94 2.476936 +EDGE_RANGE_SE2_XY 1311 9 4.490580 +EDGE_RANGE_SE2_XY 1312 9 4.350014 +EDGE_RANGE_SE2_XY 1312 26 4.346948 +EDGE_RANGE_SE2_XY 1312 59 4.742408 +EDGE_RANGE_SE2_XY 1313 10 4.586518 +EDGE_RANGE_SE2_XY 1313 26 4.416232 +EDGE_RANGE_SE2_XY 1313 49 3.346049 +EDGE_RANGE_SE2_XY 1313 84 1.985025 +EDGE_RANGE_SE2_XY 1313 94 4.119307 +EDGE_RANGE_SE2_XY 1314 9 4.396376 +EDGE_RANGE_SE2_XY 1314 10 4.581796 +EDGE_RANGE_SE2_XY 1314 49 3.365585 +EDGE_RANGE_SE2_XY 1314 59 4.800259 +EDGE_RANGE_SE2_XY 1314 84 2.074071 +EDGE_RANGE_SE2_XY 1314 94 4.129650 +EDGE_RANGE_SE2_XY 1315 9 4.324960 +EDGE_RANGE_SE2_XY 1315 10 4.556697 +EDGE_RANGE_SE2_XY 1315 26 4.361030 +EDGE_RANGE_SE2_XY 1315 49 3.398626 +EDGE_RANGE_SE2_XY 1315 59 4.764822 +EDGE_RANGE_SE2_XY 1315 84 2.061233 +EDGE_RANGE_SE2_XY 1315 94 4.120594 +EDGE_RANGE_SE2_XY 1316 9 3.334851 +EDGE_RANGE_SE2_XY 1316 10 4.270855 +EDGE_RANGE_SE2_XY 1316 26 4.658510 +EDGE_RANGE_SE2_XY 1316 49 3.561589 +EDGE_RANGE_SE2_XY 1316 51 4.653717 +EDGE_RANGE_SE2_XY 1316 59 4.114061 +EDGE_RANGE_SE2_XY 1316 84 1.965389 +EDGE_RANGE_SE2_XY 1316 94 4.637638 +EDGE_RANGE_SE2_XY 1316 96 4.304451 +EDGE_RANGE_SE2_XY 1317 9 2.336492 +EDGE_RANGE_SE2_XY 1317 10 4.216541 +EDGE_RANGE_SE2_XY 1317 31 4.939956 +EDGE_RANGE_SE2_XY 1317 49 4.059980 +EDGE_RANGE_SE2_XY 1317 50 4.303540 +EDGE_RANGE_SE2_XY 1317 51 4.110375 +EDGE_RANGE_SE2_XY 1317 59 3.581715 +EDGE_RANGE_SE2_XY 1317 84 2.299668 +EDGE_RANGE_SE2_XY 1317 96 3.347648 +EDGE_RANGE_SE2_XY 1318 9 1.364889 +EDGE_RANGE_SE2_XY 1318 10 4.267624 +EDGE_RANGE_SE2_XY 1318 31 4.117879 +EDGE_RANGE_SE2_XY 1318 49 4.613379 +EDGE_RANGE_SE2_XY 1318 50 3.391876 +EDGE_RANGE_SE2_XY 1318 51 3.724207 +EDGE_RANGE_SE2_XY 1318 59 3.187021 +EDGE_RANGE_SE2_XY 1318 78 4.996566 +EDGE_RANGE_SE2_XY 1318 96 2.333294 +EDGE_RANGE_SE2_XY 1319 9 0.338949 +EDGE_RANGE_SE2_XY 1319 10 4.691087 +EDGE_RANGE_SE2_XY 1319 31 3.450318 +EDGE_RANGE_SE2_XY 1319 50 2.687108 +EDGE_RANGE_SE2_XY 1319 51 3.588311 +EDGE_RANGE_SE2_XY 1319 59 3.130531 +EDGE_RANGE_SE2_XY 1319 78 4.803011 +EDGE_RANGE_SE2_XY 1319 96 1.349979 +EDGE_RANGE_SE2_XY 1320 31 2.855156 +EDGE_RANGE_SE2_XY 1320 50 2.047356 +EDGE_RANGE_SE2_XY 1320 51 3.773578 +EDGE_RANGE_SE2_XY 1320 59 3.428495 +EDGE_RANGE_SE2_XY 1320 78 4.692631 +EDGE_RANGE_SE2_XY 1320 83 4.884891 +EDGE_RANGE_SE2_XY 1320 96 0.462274 +EDGE_RANGE_SE2_XY 1321 31 2.641873 +EDGE_RANGE_SE2_XY 1321 50 1.907999 +EDGE_RANGE_SE2_XY 1321 51 4.201361 +EDGE_RANGE_SE2_XY 1321 59 3.933613 +EDGE_RANGE_SE2_XY 1321 78 4.893728 +EDGE_RANGE_SE2_XY 1321 83 4.559607 +EDGE_RANGE_SE2_XY 1322 9 2.686006 +EDGE_RANGE_SE2_XY 1322 31 2.789072 +EDGE_RANGE_SE2_XY 1322 50 2.276729 +EDGE_RANGE_SE2_XY 1322 51 4.750058 +EDGE_RANGE_SE2_XY 1322 59 4.617884 +EDGE_RANGE_SE2_XY 1322 83 4.594979 +EDGE_RANGE_SE2_XY 1322 96 1.702682 +EDGE_RANGE_SE2_XY 1323 9 1.643811 +EDGE_RANGE_SE2_XY 1323 31 2.696296 +EDGE_RANGE_SE2_XY 1323 50 1.900392 +EDGE_RANGE_SE2_XY 1323 51 4.174018 +EDGE_RANGE_SE2_XY 1323 59 3.956789 +EDGE_RANGE_SE2_XY 1323 78 4.901255 +EDGE_RANGE_SE2_XY 1323 83 4.588878 +EDGE_RANGE_SE2_XY 1323 96 0.818561 +EDGE_RANGE_SE2_XY 1324 9 0.693152 +EDGE_RANGE_SE2_XY 1324 31 2.846821 +EDGE_RANGE_SE2_XY 1324 50 2.042286 +EDGE_RANGE_SE2_XY 1324 51 3.744549 +EDGE_RANGE_SE2_XY 1324 59 3.489403 +EDGE_RANGE_SE2_XY 1324 78 4.707126 +EDGE_RANGE_SE2_XY 1324 83 4.834197 +EDGE_RANGE_SE2_XY 1324 84 4.718835 +EDGE_RANGE_SE2_XY 1324 96 0.490146 +EDGE_RANGE_SE2_XY 1325 9 0.735768 +EDGE_RANGE_SE2_XY 1325 31 2.916759 +EDGE_RANGE_SE2_XY 1325 50 2.097159 +EDGE_RANGE_SE2_XY 1325 78 4.727067 +EDGE_RANGE_SE2_XY 1325 84 4.637786 +EDGE_RANGE_SE2_XY 1325 96 0.482140 +EDGE_RANGE_SE2_XY 1326 10 4.382307 +EDGE_RANGE_SE2_XY 1326 31 2.039593 +EDGE_RANGE_SE2_XY 1326 35 4.801250 +EDGE_RANGE_SE2_XY 1326 50 1.317585 +EDGE_RANGE_SE2_XY 1326 78 3.677293 +EDGE_RANGE_SE2_XY 1326 84 4.403040 +EDGE_RANGE_SE2_XY 1327 10 3.726408 +EDGE_RANGE_SE2_XY 1327 15 4.651796 +EDGE_RANGE_SE2_XY 1327 31 1.363600 +EDGE_RANGE_SE2_XY 1327 35 4.071566 +EDGE_RANGE_SE2_XY 1327 50 0.764624 +EDGE_RANGE_SE2_XY 1327 78 2.777668 +EDGE_RANGE_SE2_XY 1327 84 4.236059 +EDGE_RANGE_SE2_XY 1328 10 3.266707 +EDGE_RANGE_SE2_XY 1328 15 3.966440 +EDGE_RANGE_SE2_XY 1328 31 1.239508 +EDGE_RANGE_SE2_XY 1328 35 3.339891 +EDGE_RANGE_SE2_XY 1328 78 1.722278 +EDGE_RANGE_SE2_XY 1328 84 4.373435 +EDGE_RANGE_SE2_XY 1329 1 4.857089 +EDGE_RANGE_SE2_XY 1329 10 3.082365 +EDGE_RANGE_SE2_XY 1329 15 3.412508 +EDGE_RANGE_SE2_XY 1329 35 2.887182 +EDGE_RANGE_SE2_XY 1329 78 0.731531 +EDGE_RANGE_SE2_XY 1329 80 4.786360 +EDGE_RANGE_SE2_XY 1329 84 4.756380 +EDGE_RANGE_SE2_XY 1330 1 3.930274 +EDGE_RANGE_SE2_XY 1330 10 3.179603 +EDGE_RANGE_SE2_XY 1330 15 3.119878 +EDGE_RANGE_SE2_XY 1330 35 2.696723 +EDGE_RANGE_SE2_XY 1330 78 0.472705 +EDGE_RANGE_SE2_XY 1330 80 3.762533 +EDGE_RANGE_SE2_XY 1331 1 3.193595 +EDGE_RANGE_SE2_XY 1331 10 3.602300 +EDGE_RANGE_SE2_XY 1331 15 3.138672 +EDGE_RANGE_SE2_XY 1331 16 4.581880 +EDGE_RANGE_SE2_XY 1331 35 2.857320 +EDGE_RANGE_SE2_XY 1331 47 4.709894 +EDGE_RANGE_SE2_XY 1331 80 2.797682 +EDGE_RANGE_SE2_XY 1332 1 2.477752 +EDGE_RANGE_SE2_XY 1332 10 4.201915 +EDGE_RANGE_SE2_XY 1332 15 3.416803 +EDGE_RANGE_SE2_XY 1332 16 3.623625 +EDGE_RANGE_SE2_XY 1332 35 3.240164 +EDGE_RANGE_SE2_XY 1332 47 3.926398 +EDGE_RANGE_SE2_XY 1332 80 1.839594 +EDGE_RANGE_SE2_XY 1333 1 2.111500 +EDGE_RANGE_SE2_XY 1333 15 3.958009 +EDGE_RANGE_SE2_XY 1333 16 2.647397 +EDGE_RANGE_SE2_XY 1333 47 3.055708 +EDGE_RANGE_SE2_XY 1333 66 4.779509 +EDGE_RANGE_SE2_XY 1333 80 0.980256 +EDGE_RANGE_SE2_XY 1334 1 2.167013 +EDGE_RANGE_SE2_XY 1334 16 1.780753 +EDGE_RANGE_SE2_XY 1334 47 2.397760 +EDGE_RANGE_SE2_XY 1334 65 4.931424 +EDGE_RANGE_SE2_XY 1334 66 3.985168 +EDGE_RANGE_SE2_XY 1334 80 0.724967 +EDGE_RANGE_SE2_XY 1335 1 2.609227 +EDGE_RANGE_SE2_XY 1335 16 0.985547 +EDGE_RANGE_SE2_XY 1335 47 1.969476 +EDGE_RANGE_SE2_XY 1335 65 4.607382 +EDGE_RANGE_SE2_XY 1335 66 3.268911 +EDGE_RANGE_SE2_XY 1335 97 4.696691 +EDGE_RANGE_SE2_XY 1336 16 0.934458 +EDGE_RANGE_SE2_XY 1336 29 4.427099 +EDGE_RANGE_SE2_XY 1336 47 2.126840 +EDGE_RANGE_SE2_XY 1336 65 4.532947 +EDGE_RANGE_SE2_XY 1336 66 2.744377 +EDGE_RANGE_SE2_XY 1336 97 4.429963 +EDGE_RANGE_SE2_XY 1337 29 3.717733 +EDGE_RANGE_SE2_XY 1337 47 2.523124 +EDGE_RANGE_SE2_XY 1337 65 4.606941 +EDGE_RANGE_SE2_XY 1337 66 2.461384 +EDGE_RANGE_SE2_XY 1337 97 4.358465 +EDGE_RANGE_SE2_XY 1338 1 4.200360 +EDGE_RANGE_SE2_XY 1338 16 1.693329 +EDGE_RANGE_SE2_XY 1338 29 3.655275 +EDGE_RANGE_SE2_XY 1338 65 4.573998 +EDGE_RANGE_SE2_XY 1338 80 3.398462 +EDGE_RANGE_SE2_XY 1338 97 4.275359 +EDGE_RANGE_SE2_XY 1339 1 4.749187 +EDGE_RANGE_SE2_XY 1339 16 1.496289 +EDGE_RANGE_SE2_XY 1339 29 3.032828 +EDGE_RANGE_SE2_XY 1339 65 3.644016 +EDGE_RANGE_SE2_XY 1339 80 3.340824 +EDGE_RANGE_SE2_XY 1339 97 3.354871 +EDGE_RANGE_SE2_XY 1340 16 1.847517 +EDGE_RANGE_SE2_XY 1340 25 4.877191 +EDGE_RANGE_SE2_XY 1340 29 2.553053 +EDGE_RANGE_SE2_XY 1340 65 2.671614 +EDGE_RANGE_SE2_XY 1340 80 3.551347 +EDGE_RANGE_SE2_XY 1340 97 2.399654 +EDGE_RANGE_SE2_XY 1341 25 4.084240 +EDGE_RANGE_SE2_XY 1341 29 2.449121 +EDGE_RANGE_SE2_XY 1341 65 1.757213 +EDGE_RANGE_SE2_XY 1341 80 4.057183 +EDGE_RANGE_SE2_XY 1341 97 1.319348 +EDGE_RANGE_SE2_XY 1342 16 2.672827 +EDGE_RANGE_SE2_XY 1342 25 4.059641 +EDGE_RANGE_SE2_XY 1342 29 2.556585 +EDGE_RANGE_SE2_XY 1342 65 1.746948 +EDGE_RANGE_SE2_XY 1342 97 1.353580 +EDGE_RANGE_SE2_XY 1343 25 4.034602 +EDGE_RANGE_SE2_XY 1343 29 2.454697 +EDGE_RANGE_SE2_XY 1343 65 1.745343 +EDGE_RANGE_SE2_XY 1343 80 4.058935 +EDGE_RANGE_SE2_XY 1343 97 1.428100 +EDGE_RANGE_SE2_XY 1344 25 3.412954 +EDGE_RANGE_SE2_XY 1344 29 2.808827 +EDGE_RANGE_SE2_XY 1344 65 1.095652 +EDGE_RANGE_SE2_XY 1344 97 0.342025 +EDGE_RANGE_SE2_XY 1345 25 3.079802 +EDGE_RANGE_SE2_XY 1345 29 3.245204 +EDGE_RANGE_SE2_XY 1345 65 1.139171 +EDGE_RANGE_SE2_XY 1346 25 2.932933 +EDGE_RANGE_SE2_XY 1346 85 4.604348 +EDGE_RANGE_SE2_XY 1347 29 4.071790 +EDGE_RANGE_SE2_XY 1347 65 1.728125 +EDGE_RANGE_SE2_XY 1347 85 4.640534 +EDGE_RANGE_SE2_XY 1347 97 1.687093 +EDGE_RANGE_SE2_XY 1348 65 1.546169 +EDGE_RANGE_SE2_XY 1348 90 4.649750 +EDGE_RANGE_SE2_XY 1348 97 1.829555 +EDGE_RANGE_SE2_XY 1349 65 1.803035 +EDGE_RANGE_SE2_XY 1349 90 3.649408 +EDGE_RANGE_SE2_XY 1350 15 4.609724 +EDGE_RANGE_SE2_XY 1350 90 2.718690 +EDGE_RANGE_SE2_XY 1351 15 4.555639 +EDGE_RANGE_SE2_XY 1351 65 2.489262 +EDGE_RANGE_SE2_XY 1351 90 2.682685 +EDGE_RANGE_SE2_XY 1351 97 3.264832 +EDGE_RANGE_SE2_XY 1352 15 4.000885 +EDGE_RANGE_SE2_XY 1352 16 4.467877 +EDGE_RANGE_SE2_XY 1352 65 2.043105 +EDGE_RANGE_SE2_XY 1352 80 4.303348 +EDGE_RANGE_SE2_XY 1352 90 2.726582 +EDGE_RANGE_SE2_XY 1352 97 2.840721 +EDGE_RANGE_SE2_XY 1353 10 4.948487 +EDGE_RANGE_SE2_XY 1353 15 3.599795 +EDGE_RANGE_SE2_XY 1353 16 3.574354 +EDGE_RANGE_SE2_XY 1353 65 2.061990 +EDGE_RANGE_SE2_XY 1353 80 3.322781 +EDGE_RANGE_SE2_XY 1353 90 2.997433 +EDGE_RANGE_SE2_XY 1353 97 2.847851 +EDGE_RANGE_SE2_XY 1354 10 4.898578 +EDGE_RANGE_SE2_XY 1354 15 3.606691 +EDGE_RANGE_SE2_XY 1354 16 3.522111 +EDGE_RANGE_SE2_XY 1354 80 3.372243 +EDGE_RANGE_SE2_XY 1354 90 3.010177 +EDGE_RANGE_SE2_XY 1355 10 3.942320 +EDGE_RANGE_SE2_XY 1355 15 2.649168 +EDGE_RANGE_SE2_XY 1355 16 4.018532 +EDGE_RANGE_SE2_XY 1355 49 4.779926 +EDGE_RANGE_SE2_XY 1355 78 4.886214 +EDGE_RANGE_SE2_XY 1355 80 3.363783 +EDGE_RANGE_SE2_XY 1355 90 2.254187 +EDGE_RANGE_SE2_XY 1356 10 3.972717 +EDGE_RANGE_SE2_XY 1356 15 2.632941 +EDGE_RANGE_SE2_XY 1356 16 4.043918 +EDGE_RANGE_SE2_XY 1356 49 4.816956 +EDGE_RANGE_SE2_XY 1356 65 3.063433 +EDGE_RANGE_SE2_XY 1356 78 4.931605 +EDGE_RANGE_SE2_XY 1356 80 3.372789 +EDGE_RANGE_SE2_XY 1356 90 2.167781 +EDGE_RANGE_SE2_XY 1356 97 3.781812 +EDGE_RANGE_SE2_XY 1357 10 3.964178 +EDGE_RANGE_SE2_XY 1357 15 2.718064 +EDGE_RANGE_SE2_XY 1357 16 4.016297 +EDGE_RANGE_SE2_XY 1357 49 4.808647 +EDGE_RANGE_SE2_XY 1357 78 4.902641 +EDGE_RANGE_SE2_XY 1357 80 3.392429 +EDGE_RANGE_SE2_XY 1357 90 2.181649 +EDGE_RANGE_SE2_XY 1358 10 2.957251 +EDGE_RANGE_SE2_XY 1358 15 1.742184 +EDGE_RANGE_SE2_XY 1358 49 3.875357 +EDGE_RANGE_SE2_XY 1358 78 4.302516 +EDGE_RANGE_SE2_XY 1358 80 3.754249 +EDGE_RANGE_SE2_XY 1358 90 1.628989 +EDGE_RANGE_SE2_XY 1358 94 4.440784 +EDGE_RANGE_SE2_XY 1359 10 2.085710 +EDGE_RANGE_SE2_XY 1359 15 1.066483 +EDGE_RANGE_SE2_XY 1359 49 2.910015 +EDGE_RANGE_SE2_XY 1359 78 3.865689 +EDGE_RANGE_SE2_XY 1359 80 4.270140 +EDGE_RANGE_SE2_XY 1359 84 4.072615 +EDGE_RANGE_SE2_XY 1359 90 1.460415 +EDGE_RANGE_SE2_XY 1359 94 3.773133 +EDGE_RANGE_SE2_XY 1360 10 1.237812 +EDGE_RANGE_SE2_XY 1360 15 1.048828 +EDGE_RANGE_SE2_XY 1360 49 2.044883 +EDGE_RANGE_SE2_XY 1360 78 3.662762 +EDGE_RANGE_SE2_XY 1360 84 3.090259 +EDGE_RANGE_SE2_XY 1360 90 1.949964 +EDGE_RANGE_SE2_XY 1360 94 3.251638 +EDGE_RANGE_SE2_XY 1361 10 0.983106 +EDGE_RANGE_SE2_XY 1361 49 1.372085 +EDGE_RANGE_SE2_XY 1361 78 3.732033 +EDGE_RANGE_SE2_XY 1361 84 2.083371 +EDGE_RANGE_SE2_XY 1361 94 2.928544 +EDGE_RANGE_SE2_XY 1362 15 1.770330 +EDGE_RANGE_SE2_XY 1362 49 1.329447 +EDGE_RANGE_SE2_XY 1362 84 2.062741 +EDGE_RANGE_SE2_XY 1362 90 2.795144 +EDGE_RANGE_SE2_XY 1362 94 2.970880 +EDGE_RANGE_SE2_XY 1363 46 4.174225 +EDGE_RANGE_SE2_XY 1363 49 0.678812 +EDGE_RANGE_SE2_XY 1363 84 2.200221 +EDGE_RANGE_SE2_XY 1363 90 2.411322 +EDGE_RANGE_SE2_XY 1363 94 1.946718 +EDGE_RANGE_SE2_XY 1364 10 1.952734 +EDGE_RANGE_SE2_XY 1364 15 2.487303 +EDGE_RANGE_SE2_XY 1364 46 4.217262 +EDGE_RANGE_SE2_XY 1364 78 4.669685 +EDGE_RANGE_SE2_XY 1364 90 2.412675 +EDGE_RANGE_SE2_XY 1364 94 1.910240 +EDGE_RANGE_SE2_XY 1365 10 2.109893 +EDGE_RANGE_SE2_XY 1365 15 2.029562 +EDGE_RANGE_SE2_XY 1365 46 4.255456 +EDGE_RANGE_SE2_XY 1365 78 4.685046 +EDGE_RANGE_SE2_XY 1365 90 1.380978 +EDGE_RANGE_SE2_XY 1365 94 2.368749 +EDGE_RANGE_SE2_XY 1366 10 2.668657 +EDGE_RANGE_SE2_XY 1366 15 1.948528 +EDGE_RANGE_SE2_XY 1366 46 4.527511 +EDGE_RANGE_SE2_XY 1366 78 4.796299 +EDGE_RANGE_SE2_XY 1366 90 0.596671 +EDGE_RANGE_SE2_XY 1367 46 4.543098 +EDGE_RANGE_SE2_XY 1367 49 2.681213 +EDGE_RANGE_SE2_XY 1367 84 4.135763 +EDGE_RANGE_SE2_XY 1367 90 0.599362 +EDGE_RANGE_SE2_XY 1367 94 3.060569 +EDGE_RANGE_SE2_XY 1368 46 3.646936 +EDGE_RANGE_SE2_XY 1368 49 2.799532 +EDGE_RANGE_SE2_XY 1368 84 4.414422 +EDGE_RANGE_SE2_XY 1368 94 2.553201 +EDGE_RANGE_SE2_XY 1369 46 2.796971 +EDGE_RANGE_SE2_XY 1369 49 3.160349 +EDGE_RANGE_SE2_XY 1369 84 4.875968 +EDGE_RANGE_SE2_XY 1369 94 2.335935 +EDGE_RANGE_SE2_XY 1370 46 2.035401 +EDGE_RANGE_SE2_XY 1370 89 4.804087 +EDGE_RANGE_SE2_XY 1370 94 2.656819 +EDGE_RANGE_SE2_XY 1371 46 1.687738 +EDGE_RANGE_SE2_XY 1371 58 4.668054 +EDGE_RANGE_SE2_XY 1371 70 4.605942 +EDGE_RANGE_SE2_XY 1371 89 3.968371 +EDGE_RANGE_SE2_XY 1371 94 3.105973 +EDGE_RANGE_SE2_XY 1371 95 4.244433 +EDGE_RANGE_SE2_XY 1372 13 4.592349 +EDGE_RANGE_SE2_XY 1372 46 1.896162 +EDGE_RANGE_SE2_XY 1372 58 4.544023 +EDGE_RANGE_SE2_XY 1372 70 4.266893 +EDGE_RANGE_SE2_XY 1372 89 3.231734 +EDGE_RANGE_SE2_XY 1372 95 3.248003 +EDGE_RANGE_SE2_XY 1373 13 4.057195 +EDGE_RANGE_SE2_XY 1373 45 4.191862 +EDGE_RANGE_SE2_XY 1373 48 4.945683 +EDGE_RANGE_SE2_XY 1373 57 4.943160 +EDGE_RANGE_SE2_XY 1373 58 4.377364 +EDGE_RANGE_SE2_XY 1373 70 4.193707 +EDGE_RANGE_SE2_XY 1373 89 2.691704 +EDGE_RANGE_SE2_XY 1373 95 2.235713 +EDGE_RANGE_SE2_XY 1374 13 3.716875 +EDGE_RANGE_SE2_XY 1374 45 3.251690 +EDGE_RANGE_SE2_XY 1374 48 4.098178 +EDGE_RANGE_SE2_XY 1374 57 4.892008 +EDGE_RANGE_SE2_XY 1374 58 4.567664 +EDGE_RANGE_SE2_XY 1374 70 4.320005 +EDGE_RANGE_SE2_XY 1374 89 2.380732 +EDGE_RANGE_SE2_XY 1374 95 1.270554 +EDGE_RANGE_SE2_XY 1375 13 3.694200 +EDGE_RANGE_SE2_XY 1375 45 3.244103 +EDGE_RANGE_SE2_XY 1375 46 3.266506 +EDGE_RANGE_SE2_XY 1375 48 4.103353 +EDGE_RANGE_SE2_XY 1375 57 4.907065 +EDGE_RANGE_SE2_XY 1375 58 4.633657 +EDGE_RANGE_SE2_XY 1375 70 4.237048 +EDGE_RANGE_SE2_XY 1375 89 2.349426 +EDGE_RANGE_SE2_XY 1375 95 1.237825 +EDGE_RANGE_SE2_XY 1376 13 2.808372 +EDGE_RANGE_SE2_XY 1376 22 4.616708 +EDGE_RANGE_SE2_XY 1376 45 2.943319 +EDGE_RANGE_SE2_XY 1376 46 2.820006 +EDGE_RANGE_SE2_XY 1376 48 3.553011 +EDGE_RANGE_SE2_XY 1376 57 3.941669 +EDGE_RANGE_SE2_XY 1376 58 3.732885 +EDGE_RANGE_SE2_XY 1376 70 3.322513 +EDGE_RANGE_SE2_XY 1376 89 1.329525 +EDGE_RANGE_SE2_XY 1376 95 1.555888 +EDGE_RANGE_SE2_XY 1377 13 2.815194 +EDGE_RANGE_SE2_XY 1377 22 4.696165 +EDGE_RANGE_SE2_XY 1377 45 2.894795 +EDGE_RANGE_SE2_XY 1377 48 3.532175 +EDGE_RANGE_SE2_XY 1377 57 3.891660 +EDGE_RANGE_SE2_XY 1377 58 3.686718 +EDGE_RANGE_SE2_XY 1377 70 3.357645 +EDGE_RANGE_SE2_XY 1377 89 1.366141 +EDGE_RANGE_SE2_XY 1377 95 1.522455 +EDGE_RANGE_SE2_XY 1378 13 2.819689 +EDGE_RANGE_SE2_XY 1378 22 4.664477 +EDGE_RANGE_SE2_XY 1378 45 2.953564 +EDGE_RANGE_SE2_XY 1378 46 2.859975 +EDGE_RANGE_SE2_XY 1378 48 3.500173 +EDGE_RANGE_SE2_XY 1378 57 3.865852 +EDGE_RANGE_SE2_XY 1378 58 3.736254 +EDGE_RANGE_SE2_XY 1378 70 3.303872 +EDGE_RANGE_SE2_XY 1378 89 1.374429 +EDGE_RANGE_SE2_XY 1378 95 1.540802 +EDGE_RANGE_SE2_XY 1379 13 1.847208 +EDGE_RANGE_SE2_XY 1379 22 3.894242 +EDGE_RANGE_SE2_XY 1379 45 2.913096 +EDGE_RANGE_SE2_XY 1379 46 2.849935 +EDGE_RANGE_SE2_XY 1379 48 3.271577 +EDGE_RANGE_SE2_XY 1379 57 2.912287 +EDGE_RANGE_SE2_XY 1379 58 2.832345 +EDGE_RANGE_SE2_XY 1379 70 2.469029 +EDGE_RANGE_SE2_XY 1379 89 0.417632 +EDGE_RANGE_SE2_XY 1380 13 1.037138 +EDGE_RANGE_SE2_XY 1380 22 3.291561 +EDGE_RANGE_SE2_XY 1380 45 3.157722 +EDGE_RANGE_SE2_XY 1380 46 3.094880 +EDGE_RANGE_SE2_XY 1380 48 3.177119 +EDGE_RANGE_SE2_XY 1380 56 4.716572 +EDGE_RANGE_SE2_XY 1380 57 1.836589 +EDGE_RANGE_SE2_XY 1380 58 2.020146 +EDGE_RANGE_SE2_XY 1380 70 1.548348 +EDGE_RANGE_SE2_XY 1381 13 0.809685 +EDGE_RANGE_SE2_XY 1381 22 2.856074 +EDGE_RANGE_SE2_XY 1381 32 4.941014 +EDGE_RANGE_SE2_XY 1381 45 3.747877 +EDGE_RANGE_SE2_XY 1381 46 3.650757 +EDGE_RANGE_SE2_XY 1381 48 3.480027 +EDGE_RANGE_SE2_XY 1381 56 3.723543 +EDGE_RANGE_SE2_XY 1381 57 0.866828 +EDGE_RANGE_SE2_XY 1381 58 1.462096 +EDGE_RANGE_SE2_XY 1381 70 1.079571 +EDGE_RANGE_SE2_XY 1382 22 2.689251 +EDGE_RANGE_SE2_XY 1382 32 4.130553 +EDGE_RANGE_SE2_XY 1382 43 4.340263 +EDGE_RANGE_SE2_XY 1382 48 3.966366 +EDGE_RANGE_SE2_XY 1382 56 2.741614 +EDGE_RANGE_SE2_XY 1382 58 1.492160 +EDGE_RANGE_SE2_XY 1382 70 1.291041 +EDGE_RANGE_SE2_XY 1383 19 4.913324 +EDGE_RANGE_SE2_XY 1383 22 3.064006 +EDGE_RANGE_SE2_XY 1383 32 3.272725 +EDGE_RANGE_SE2_XY 1383 43 3.761352 +EDGE_RANGE_SE2_XY 1383 53 4.890964 +EDGE_RANGE_SE2_XY 1383 56 1.761020 +EDGE_RANGE_SE2_XY 1384 13 2.426031 +EDGE_RANGE_SE2_XY 1384 19 4.906882 +EDGE_RANGE_SE2_XY 1384 22 2.996916 +EDGE_RANGE_SE2_XY 1384 32 3.334292 +EDGE_RANGE_SE2_XY 1384 43 3.752447 +EDGE_RANGE_SE2_XY 1384 48 4.598472 +EDGE_RANGE_SE2_XY 1384 53 4.880146 +EDGE_RANGE_SE2_XY 1384 56 1.717764 +EDGE_RANGE_SE2_XY 1384 57 1.159164 +EDGE_RANGE_SE2_XY 1384 58 2.091874 +EDGE_RANGE_SE2_XY 1384 70 2.085685 +EDGE_RANGE_SE2_XY 1384 89 3.653386 +EDGE_RANGE_SE2_XY 1385 2 5.016015 +EDGE_RANGE_SE2_XY 1385 13 2.276796 +EDGE_RANGE_SE2_XY 1385 19 4.915156 +EDGE_RANGE_SE2_XY 1385 22 2.150653 +EDGE_RANGE_SE2_XY 1385 32 2.764067 +EDGE_RANGE_SE2_XY 1385 43 2.868866 +EDGE_RANGE_SE2_XY 1385 45 4.756360 +EDGE_RANGE_SE2_XY 1385 48 3.991789 +EDGE_RANGE_SE2_XY 1385 53 3.900859 +EDGE_RANGE_SE2_XY 1385 56 2.128867 +EDGE_RANGE_SE2_XY 1385 57 1.578685 +EDGE_RANGE_SE2_XY 1385 89 3.735164 +EDGE_RANGE_SE2_XY 1386 2 4.026168 +EDGE_RANGE_SE2_XY 1386 13 2.628876 +EDGE_RANGE_SE2_XY 1386 22 1.480637 +EDGE_RANGE_SE2_XY 1386 32 2.461866 +EDGE_RANGE_SE2_XY 1386 43 2.214441 +EDGE_RANGE_SE2_XY 1386 45 4.482753 +EDGE_RANGE_SE2_XY 1386 48 3.588628 +EDGE_RANGE_SE2_XY 1386 53 2.901227 +EDGE_RANGE_SE2_XY 1386 81 4.833115 +EDGE_RANGE_SE2_XY 1386 86 4.383662 +EDGE_RANGE_SE2_XY 1386 89 4.082088 +EDGE_RANGE_SE2_XY 1386 92 4.976972 +EDGE_RANGE_SE2_XY 1387 2 3.954849 +EDGE_RANGE_SE2_XY 1387 13 2.688291 +EDGE_RANGE_SE2_XY 1387 22 1.484809 +EDGE_RANGE_SE2_XY 1387 45 4.487653 +EDGE_RANGE_SE2_XY 1387 48 3.572379 +EDGE_RANGE_SE2_XY 1387 53 2.941519 +EDGE_RANGE_SE2_XY 1387 56 2.762483 +EDGE_RANGE_SE2_XY 1387 57 2.380357 +EDGE_RANGE_SE2_XY 1387 58 3.743315 +EDGE_RANGE_SE2_XY 1387 70 3.613687 +EDGE_RANGE_SE2_XY 1387 81 4.857331 +EDGE_RANGE_SE2_XY 1387 86 4.380806 +EDGE_RANGE_SE2_XY 1387 89 4.040381 +EDGE_RANGE_SE2_XY 1387 92 4.991979 +EDGE_RANGE_SE2_XY 1388 2 4.523111 +EDGE_RANGE_SE2_XY 1388 13 1.836420 +EDGE_RANGE_SE2_XY 1388 22 0.794541 +EDGE_RANGE_SE2_XY 1388 45 3.543186 +EDGE_RANGE_SE2_XY 1388 48 2.670529 +EDGE_RANGE_SE2_XY 1388 53 3.413888 +EDGE_RANGE_SE2_XY 1388 57 2.103458 +EDGE_RANGE_SE2_XY 1388 58 3.347430 +EDGE_RANGE_SE2_XY 1388 70 3.107432 +EDGE_RANGE_SE2_XY 1388 81 4.878707 +EDGE_RANGE_SE2_XY 1388 86 3.791420 +EDGE_RANGE_SE2_XY 1388 89 3.240185 +EDGE_RANGE_SE2_XY 1388 92 4.346393 +EDGE_RANGE_SE2_XY 1388 95 5.000533 +EDGE_RANGE_SE2_XY 1389 13 1.297774 +EDGE_RANGE_SE2_XY 1389 45 2.606249 +EDGE_RANGE_SE2_XY 1389 48 1.786112 +EDGE_RANGE_SE2_XY 1389 57 2.353216 +EDGE_RANGE_SE2_XY 1389 58 3.433081 +EDGE_RANGE_SE2_XY 1389 70 3.000678 +EDGE_RANGE_SE2_XY 1389 86 3.398353 +EDGE_RANGE_SE2_XY 1389 89 2.427415 +EDGE_RANGE_SE2_XY 1389 92 3.855912 +EDGE_RANGE_SE2_XY 1389 95 3.920745 +EDGE_RANGE_SE2_XY 1390 13 1.331042 +EDGE_RANGE_SE2_XY 1390 22 1.082932 +EDGE_RANGE_SE2_XY 1390 32 4.459106 +EDGE_RANGE_SE2_XY 1390 43 4.060653 +EDGE_RANGE_SE2_XY 1390 45 2.534467 +EDGE_RANGE_SE2_XY 1390 48 1.799172 +EDGE_RANGE_SE2_XY 1390 53 4.029391 +EDGE_RANGE_SE2_XY 1390 56 4.317862 +EDGE_RANGE_SE2_XY 1390 57 2.296033 +EDGE_RANGE_SE2_XY 1390 58 3.366784 +EDGE_RANGE_SE2_XY 1390 70 3.022431 +EDGE_RANGE_SE2_XY 1390 89 2.487879 +EDGE_RANGE_SE2_XY 1390 95 3.991291 +EDGE_RANGE_SE2_XY 1391 13 0.370762 +EDGE_RANGE_SE2_XY 1391 32 4.641467 +EDGE_RANGE_SE2_XY 1391 43 4.490879 +EDGE_RANGE_SE2_XY 1391 45 3.066710 +EDGE_RANGE_SE2_XY 1391 46 4.369944 +EDGE_RANGE_SE2_XY 1391 56 3.959121 +EDGE_RANGE_SE2_XY 1391 57 1.378124 +EDGE_RANGE_SE2_XY 1391 58 2.404784 +EDGE_RANGE_SE2_XY 1391 70 2.059496 +EDGE_RANGE_SE2_XY 1391 89 1.828759 +EDGE_RANGE_SE2_XY 1391 95 3.897963 +EDGE_RANGE_SE2_XY 1392 32 5.021301 +EDGE_RANGE_SE2_XY 1392 46 3.586325 +EDGE_RANGE_SE2_XY 1392 56 3.750666 +EDGE_RANGE_SE2_XY 1392 57 0.886645 +EDGE_RANGE_SE2_XY 1392 58 1.492320 +EDGE_RANGE_SE2_XY 1392 70 1.001937 +EDGE_RANGE_SE2_XY 1392 89 1.614526 +EDGE_RANGE_SE2_XY 1392 95 4.064508 +EDGE_RANGE_SE2_XY 1393 46 2.914115 +EDGE_RANGE_SE2_XY 1393 56 3.804979 +EDGE_RANGE_SE2_XY 1393 58 0.574100 +EDGE_RANGE_SE2_XY 1393 70 0.135985 +EDGE_RANGE_SE2_XY 1393 89 2.083559 +EDGE_RANGE_SE2_XY 1393 94 4.319978 +EDGE_RANGE_SE2_XY 1393 95 4.477080 +EDGE_RANGE_SE2_XY 1394 46 2.428082 +EDGE_RANGE_SE2_XY 1394 49 4.990984 +EDGE_RANGE_SE2_XY 1394 56 4.213011 +EDGE_RANGE_SE2_XY 1394 94 3.513243 +EDGE_RANGE_SE2_XY 1395 46 2.312226 +EDGE_RANGE_SE2_XY 1395 49 4.082538 +EDGE_RANGE_SE2_XY 1395 56 4.715526 +EDGE_RANGE_SE2_XY 1395 84 4.683636 +EDGE_RANGE_SE2_XY 1395 94 2.645193 +EDGE_RANGE_SE2_XY 1396 46 2.607986 +EDGE_RANGE_SE2_XY 1396 49 3.087157 +EDGE_RANGE_SE2_XY 1396 84 3.732940 +EDGE_RANGE_SE2_XY 1396 94 1.890706 +EDGE_RANGE_SE2_XY 1397 10 4.471345 +EDGE_RANGE_SE2_XY 1397 46 3.189215 +EDGE_RANGE_SE2_XY 1397 49 2.253090 +EDGE_RANGE_SE2_XY 1397 84 2.745449 +EDGE_RANGE_SE2_XY 1397 90 4.590416 +EDGE_RANGE_SE2_XY 1397 94 1.619757 +EDGE_RANGE_SE2_XY 1398 10 4.444648 +EDGE_RANGE_SE2_XY 1398 46 3.233763 +EDGE_RANGE_SE2_XY 1398 49 2.217796 +EDGE_RANGE_SE2_XY 1398 57 4.957315 +EDGE_RANGE_SE2_XY 1398 58 3.649264 +EDGE_RANGE_SE2_XY 1398 70 3.948844 +EDGE_RANGE_SE2_XY 1398 84 2.730233 +EDGE_RANGE_SE2_XY 1398 90 4.637887 +EDGE_RANGE_SE2_XY 1398 94 1.626878 +EDGE_RANGE_SE2_XY 1399 10 4.087325 +EDGE_RANGE_SE2_XY 1399 15 4.701102 +EDGE_RANGE_SE2_XY 1399 46 2.575736 +EDGE_RANGE_SE2_XY 1399 49 1.838579 +EDGE_RANGE_SE2_XY 1399 58 3.914756 +EDGE_RANGE_SE2_XY 1399 70 4.151095 +EDGE_RANGE_SE2_XY 1399 84 2.909338 +EDGE_RANGE_SE2_XY 1399 90 3.675554 +EDGE_RANGE_SE2_XY 1399 94 0.549531 +EDGE_RANGE_SE2_XY 1400 10 3.890546 +EDGE_RANGE_SE2_XY 1400 15 4.139046 +EDGE_RANGE_SE2_XY 1400 46 2.216355 +EDGE_RANGE_SE2_XY 1400 49 1.933057 +EDGE_RANGE_SE2_XY 1400 58 4.325068 +EDGE_RANGE_SE2_XY 1400 70 4.497607 +EDGE_RANGE_SE2_XY 1400 84 3.429599 +EDGE_RANGE_SE2_XY 1400 90 2.823162 diff --git a/data/slam2d_range_only_initial_guess.g2o b/data/slam2d_range_only_initial_guess.g2o new file mode 100644 index 0000000..f6f3777 --- /dev/null +++ b/data/slam2d_range_only_initial_guess.g2o @@ -0,0 +1,2381 @@ +VERTEX_SE2 1100 0.424855 0.941289 -0.106706 +VERTEX_SE2 1101 0.432005 0.946574 1.470600 +VERTEX_SE2 1102 0.530000 1.994560 1.467570 +VERTEX_SE2 1103 0.671245 2.998700 1.467720 +VERTEX_SE2 1104 0.798184 3.988140 1.484330 +VERTEX_SE2 1105 0.823567 3.938830 -0.065451 +VERTEX_SE2 1106 1.866180 3.755800 -0.077176 +VERTEX_SE2 1107 1.828410 3.782930 -1.656870 +VERTEX_SE2 1108 1.841980 3.797000 -0.092896 +VERTEX_SE2 1109 1.827830 3.703600 -1.667760 +VERTEX_SE2 1110 1.685230 2.726920 -1.700300 +VERTEX_SE2 1111 1.544960 1.671130 -1.687220 +VERTEX_SE2 1112 1.484020 1.746490 -0.119857 +VERTEX_SE2 1113 2.522700 1.630300 -0.113650 +VERTEX_SE2 1114 3.516960 1.511040 -0.104517 +VERTEX_SE2 1115 3.600230 1.582190 1.472920 +VERTEX_SE2 1116 3.662100 1.606150 -0.106107 +VERTEX_SE2 1117 4.662630 1.494930 -0.084367 +VERTEX_SE2 1118 5.674110 1.457780 -0.067811 +VERTEX_SE2 1119 6.717890 1.295000 -0.065882 +VERTEX_SE2 1120 7.761190 1.149320 -0.081658 +VERTEX_SE2 1121 8.684410 1.124200 -0.104101 +VERTEX_SE2 1122 8.711440 1.069680 1.487660 +VERTEX_SE2 1123 8.709220 1.103740 -0.078521 +VERTEX_SE2 1124 9.745400 1.018780 -0.093193 +VERTEX_SE2 1125 10.749700 0.831309 -0.086757 +VERTEX_SE2 1126 11.721700 0.877688 -0.082865 +VERTEX_SE2 1127 12.576400 0.818921 -0.112493 +VERTEX_SE2 1128 13.551300 0.722758 -0.097567 +VERTEX_SE2 1129 14.528500 0.627164 3.064090 +VERTEX_SE2 1130 13.570600 0.660013 3.058430 +VERTEX_SE2 1131 12.569800 0.759513 3.050370 +VERTEX_SE2 1132 12.534500 0.807211 1.470600 +VERTEX_SE2 1133 12.540600 0.776168 -0.134885 +VERTEX_SE2 1134 12.518100 0.736479 -1.710150 +VERTEX_SE2 1135 12.343800 -0.310150 -1.691430 +VERTEX_SE2 1136 12.212700 -1.314170 -1.692720 +VERTEX_SE2 1137 12.018000 -2.310490 -1.697190 +VERTEX_SE2 1138 12.012300 -2.322010 -0.121390 +VERTEX_SE2 1139 12.992700 -2.521550 -0.122152 +VERTEX_SE2 1140 13.961100 -2.646260 3.024910 +VERTEX_SE2 1141 12.977100 -2.600400 3.015790 +VERTEX_SE2 1142 11.994800 -2.435580 2.992010 +VERTEX_SE2 1143 11.034500 -2.273500 2.958440 +VERTEX_SE2 1144 10.108300 -2.057320 2.972720 +VERTEX_SE2 1145 10.119900 -2.112620 -1.753020 +VERTEX_SE2 1146 9.970550 -3.185190 -1.760440 +VERTEX_SE2 1147 9.858240 -4.132380 -1.786880 +VERTEX_SE2 1148 9.640840 -5.117660 -1.774340 +VERTEX_SE2 1149 9.454900 -6.080700 -1.760450 +VERTEX_SE2 1150 9.310260 -6.995450 -1.763660 +VERTEX_SE2 1151 9.134260 -7.928670 -1.764220 +VERTEX_SE2 1152 8.927180 -8.956440 -1.742800 +VERTEX_SE2 1153 8.760190 -9.925700 -1.744920 +VERTEX_SE2 1154 8.569480 -10.898200 -1.753190 +VERTEX_SE2 1155 8.451570 -11.887500 -1.749680 +VERTEX_SE2 1156 8.323380 -12.885800 -1.724010 +VERTEX_SE2 1157 8.259040 -12.914300 1.434080 +VERTEX_SE2 1158 8.397250 -11.938900 1.432920 +VERTEX_SE2 1159 8.533960 -10.974000 1.425800 +VERTEX_SE2 1160 8.525380 -10.950000 3.010030 +VERTEX_SE2 1161 7.564740 -10.905200 3.005250 +VERTEX_SE2 1162 7.599330 -10.912200 1.446970 +VERTEX_SE2 1163 7.580760 -10.921100 -0.141998 +VERTEX_SE2 1164 8.541390 -11.120000 -0.134535 +VERTEX_SE2 1165 9.507280 -11.307100 -0.151455 +VERTEX_SE2 1166 10.479500 -11.412300 -0.171336 +VERTEX_SE2 1167 10.451300 -11.427200 -1.741420 +VERTEX_SE2 1168 10.246100 -12.425800 -1.725410 +VERTEX_SE2 1169 10.063900 -13.391600 -1.731640 +VERTEX_SE2 1170 10.067600 -13.400300 1.409950 +VERTEX_SE2 1171 10.262100 -12.429400 1.428880 +VERTEX_SE2 1172 10.412800 -11.366900 1.418310 +VERTEX_SE2 1173 10.607700 -10.305700 1.409940 +VERTEX_SE2 1174 10.763300 -9.292740 1.408460 +VERTEX_SE2 1175 10.663400 -9.249900 3.019360 +VERTEX_SE2 1176 10.694300 -9.281140 1.431920 +VERTEX_SE2 1177 10.845900 -8.176650 1.442720 +VERTEX_SE2 1178 11.024500 -7.201610 1.426460 +VERTEX_SE2 1179 11.030600 -7.174440 -0.161791 +VERTEX_SE2 1180 11.947700 -7.365920 -0.153032 +VERTEX_SE2 1181 12.906600 -7.508280 2.993920 +VERTEX_SE2 1182 11.981600 -7.253750 2.978110 +VERTEX_SE2 1183 11.005200 -7.018480 2.989620 +VERTEX_SE2 1184 10.990500 -6.993100 -1.740230 +VERTEX_SE2 1185 10.797400 -8.006440 -1.737100 +VERTEX_SE2 1186 10.835500 -8.009980 -0.185207 +VERTEX_SE2 1187 11.806700 -8.142840 -0.193405 +VERTEX_SE2 1188 12.778300 -8.331830 2.929830 +VERTEX_SE2 1189 11.788200 -8.105640 2.936790 +VERTEX_SE2 1190 10.820800 -7.892440 2.950140 +VERTEX_SE2 1191 10.839500 -7.898770 -1.776460 +VERTEX_SE2 1192 10.903000 -7.988540 2.965020 +VERTEX_SE2 1193 9.953400 -7.802610 2.952630 +VERTEX_SE2 1194 8.940360 -7.588410 2.959150 +VERTEX_SE2 1195 8.918900 -7.617320 -1.736680 +VERTEX_SE2 1196 8.835970 -8.692180 -1.746480 +VERTEX_SE2 1197 8.810540 -9.692410 -1.763500 +VERTEX_SE2 1198 8.590780 -10.669100 -1.770880 +VERTEX_SE2 1199 8.406990 -11.722900 -1.765620 +VERTEX_SE2 1200 8.485270 -11.732400 2.924390 +VERTEX_SE2 1201 7.533380 -11.532600 2.926490 +VERTEX_SE2 1202 6.532780 -11.357000 2.927560 +VERTEX_SE2 1203 5.579500 -11.178600 2.924230 +VERTEX_SE2 1204 4.596930 -10.941100 2.936930 +VERTEX_SE2 1205 3.577980 -10.671200 2.928830 +VERTEX_SE2 1206 2.655460 -10.469700 2.951020 +VERTEX_SE2 1207 2.658620 -10.345200 -1.742220 +VERTEX_SE2 1208 2.719220 -10.384200 -0.168627 +VERTEX_SE2 1209 3.743050 -10.457500 -0.183142 +VERTEX_SE2 1210 4.768130 -10.566300 -0.181340 +VERTEX_SE2 1211 4.722680 -10.522700 -1.740490 +VERTEX_SE2 1212 4.718880 -10.497600 2.975190 +VERTEX_SE2 1213 3.653400 -10.301100 2.951070 +VERTEX_SE2 1214 2.678240 -10.063000 2.950370 +VERTEX_SE2 1215 1.664120 -9.823460 2.939660 +VERTEX_SE2 1216 0.655095 -9.623510 2.931630 +VERTEX_SE2 1217 -0.362991 -9.405580 2.945610 +VERTEX_SE2 1218 -1.393630 -9.188180 2.924340 +VERTEX_SE2 1219 -2.302080 -8.990340 2.906290 +VERTEX_SE2 1220 -3.311090 -8.742580 2.906180 +VERTEX_SE2 1221 -4.302930 -8.502270 2.891990 +VERTEX_SE2 1222 -5.289750 -8.284930 2.883360 +VERTEX_SE2 1223 -5.302680 -8.400020 1.315520 +VERTEX_SE2 1224 -5.007390 -7.438600 1.329520 +VERTEX_SE2 1225 -4.762990 -6.395330 1.344550 +VERTEX_SE2 1226 -4.551720 -5.432250 1.357830 +VERTEX_SE2 1227 -4.369090 -4.367460 1.347410 +VERTEX_SE2 1228 -4.242110 -3.392810 1.353370 +VERTEX_SE2 1229 -4.037880 -2.430940 1.348930 +VERTEX_SE2 1230 -4.098710 -2.476680 -0.237201 +VERTEX_SE2 1231 -3.133410 -2.666470 -0.227865 +VERTEX_SE2 1232 -2.148510 -2.927570 -0.219327 +VERTEX_SE2 1233 -1.227010 -3.158060 -0.211943 +VERTEX_SE2 1234 -0.333133 -3.441480 -0.219404 +VERTEX_SE2 1235 0.663223 -3.608030 -0.223197 +VERTEX_SE2 1236 1.600520 -3.940030 -0.226763 +VERTEX_SE2 1237 2.557240 -4.102610 -0.222941 +VERTEX_SE2 1238 3.568030 -4.354170 -0.224983 +VERTEX_SE2 1239 3.585490 -4.353920 1.355810 +VERTEX_SE2 1240 3.620610 -4.379140 2.928560 +VERTEX_SE2 1241 2.629760 -4.155860 2.923540 +VERTEX_SE2 1242 1.643810 -3.921520 2.930380 +VERTEX_SE2 1243 0.642621 -3.768390 2.930460 +VERTEX_SE2 1244 0.599295 -3.773680 -1.775670 +VERTEX_SE2 1245 0.406070 -4.758090 -1.754540 +VERTEX_SE2 1246 0.272044 -5.728930 -1.755870 +VERTEX_SE2 1247 0.093776 -6.746290 -1.768650 +VERTEX_SE2 1248 -0.053921 -7.764980 -1.784120 +VERTEX_SE2 1249 -0.366428 -8.670890 -1.767060 +VERTEX_SE2 1250 -0.438769 -8.674240 2.931440 +VERTEX_SE2 1251 -1.396780 -8.467280 2.932310 +VERTEX_SE2 1252 -2.345130 -8.298380 2.944290 +VERTEX_SE2 1253 -3.292290 -8.073140 2.918090 +VERTEX_SE2 1254 -3.260070 -8.129270 1.354750 +VERTEX_SE2 1255 -3.032620 -7.198950 1.346490 +VERTEX_SE2 1256 -2.788020 -6.222740 1.334690 +VERTEX_SE2 1257 -2.779640 -6.204380 2.901380 +VERTEX_SE2 1258 -3.752590 -5.953910 2.894680 +VERTEX_SE2 1259 -4.741760 -5.669780 2.900010 +VERTEX_SE2 1260 -5.818920 -5.524530 2.898790 +VERTEX_SE2 1261 -6.736430 -5.310300 2.910820 +VERTEX_SE2 1262 -7.685700 -5.142060 2.940740 +VERTEX_SE2 1263 -8.643810 -4.942190 2.916720 +VERTEX_SE2 1264 -9.642080 -4.727000 2.902930 +VERTEX_SE2 1265 -10.543800 -4.374410 2.904940 +VERTEX_SE2 1266 -10.633900 -4.413630 1.323580 +VERTEX_SE2 1267 -10.433100 -3.482370 1.323410 +VERTEX_SE2 1268 -10.174100 -2.604630 1.340650 +VERTEX_SE2 1269 -9.960290 -1.592700 1.355810 +VERTEX_SE2 1270 -9.702110 -0.663478 1.333690 +VERTEX_SE2 1271 -9.419820 0.368674 1.336340 +VERTEX_SE2 1272 -9.432190 0.351165 -0.250237 +VERTEX_SE2 1273 -8.489480 0.060145 -0.255336 +VERTEX_SE2 1274 -7.543060 -0.229123 -0.256944 +VERTEX_SE2 1275 -6.569220 -0.445825 -0.244985 +VERTEX_SE2 1276 -6.620350 -0.496899 1.343580 +VERTEX_SE2 1277 -6.367890 0.465790 1.335350 +VERTEX_SE2 1278 -6.127680 1.424150 1.348740 +VERTEX_SE2 1279 -5.884780 2.403360 1.345360 +VERTEX_SE2 1280 -5.705920 3.424330 1.337870 +VERTEX_SE2 1281 -5.697590 3.434560 2.907890 +VERTEX_SE2 1282 -6.690530 3.679960 2.919680 +VERTEX_SE2 1283 -6.715880 3.693920 -1.798220 +VERTEX_SE2 1284 -6.756210 3.692270 -0.242863 +VERTEX_SE2 1285 -5.879060 3.509400 -0.247209 +VERTEX_SE2 1286 -4.805520 3.225590 -0.242803 +VERTEX_SE2 1287 -3.888330 2.912350 -0.259296 +VERTEX_SE2 1288 -2.954630 2.578990 -0.245371 +VERTEX_SE2 1289 -1.945920 2.293820 -0.261886 +VERTEX_SE2 1290 -0.984471 2.078550 -0.242256 +VERTEX_SE2 1291 0.017719 1.839760 -0.232962 +VERTEX_SE2 1292 1.011410 1.611420 -0.240266 +VERTEX_SE2 1293 1.948960 1.296420 -0.239219 +VERTEX_SE2 1294 1.990230 1.255440 1.331720 +VERTEX_SE2 1295 2.009760 1.259930 -0.235449 +VERTEX_SE2 1296 3.040260 1.071420 -0.252884 +VERTEX_SE2 1297 3.963990 0.872924 -0.266367 +VERTEX_SE2 1298 4.927650 0.582646 -0.251344 +VERTEX_SE2 1299 5.951980 0.379678 -0.248461 +VERTEX_SE2 1300 6.925400 0.058355 -0.228189 +VERTEX_SE2 1301 7.913690 -0.101289 -0.231643 +VERTEX_SE2 1302 7.872350 -0.093326 -1.813910 +VERTEX_SE2 1303 7.595220 -1.083650 -1.795030 +VERTEX_SE2 1304 7.565130 -1.187850 -0.224413 +VERTEX_SE2 1305 7.569970 -1.184390 -1.794910 +VERTEX_SE2 1306 7.592260 -1.148430 2.927850 +VERTEX_SE2 1307 7.680170 -1.143140 -1.775550 +VERTEX_SE2 1308 7.453420 -2.137470 -1.768180 +VERTEX_SE2 1309 7.502930 -2.159710 -0.193487 +VERTEX_SE2 1310 7.494670 -2.133550 1.368860 +VERTEX_SE2 1311 7.731280 -1.130650 1.366440 +VERTEX_SE2 1312 7.914190 -0.156561 1.366670 +VERTEX_SE2 1313 7.898630 -0.075033 2.932480 +VERTEX_SE2 1314 7.884350 -0.046343 -1.797720 +VERTEX_SE2 1315 7.900550 -0.069608 -0.241421 +VERTEX_SE2 1316 8.876150 -0.277737 -0.238574 +VERTEX_SE2 1317 9.805680 -0.547269 -0.242103 +VERTEX_SE2 1318 10.775200 -0.780417 -0.249882 +VERTEX_SE2 1319 11.661700 -0.978832 -0.245658 +VERTEX_SE2 1320 12.595200 -1.153980 -0.235149 +VERTEX_SE2 1321 13.612900 -1.343820 -0.210847 +VERTEX_SE2 1322 14.550300 -1.541630 2.952270 +VERTEX_SE2 1323 13.548500 -1.353600 2.942680 +VERTEX_SE2 1324 12.632200 -1.163400 2.963810 +VERTEX_SE2 1325 12.625200 -1.084030 -1.780850 +VERTEX_SE2 1326 12.416800 -2.114090 -1.794170 +VERTEX_SE2 1327 12.180000 -3.084710 -1.798490 +VERTEX_SE2 1328 11.849800 -3.979750 -1.769520 +VERTEX_SE2 1329 11.657500 -5.015120 -1.757340 +VERTEX_SE2 1330 11.476700 -6.011250 -1.755020 +VERTEX_SE2 1331 11.325900 -7.031680 -1.746880 +VERTEX_SE2 1332 11.180500 -8.046430 -1.745250 +VERTEX_SE2 1333 11.023400 -8.995600 -1.725000 +VERTEX_SE2 1334 10.820600 -10.006600 -1.741430 +VERTEX_SE2 1335 10.680100 -11.083100 -1.733430 +VERTEX_SE2 1336 10.563600 -12.021500 -1.733280 +VERTEX_SE2 1337 10.505600 -12.952400 -1.713430 +VERTEX_SE2 1338 10.446700 -12.922200 3.019470 +VERTEX_SE2 1339 9.457520 -12.769800 3.021080 +VERTEX_SE2 1340 8.458400 -12.736900 3.026310 +VERTEX_SE2 1341 7.557480 -12.617600 3.012520 +VERTEX_SE2 1342 7.521090 -12.587800 -1.682900 +VERTEX_SE2 1343 7.542680 -12.598600 3.026320 +VERTEX_SE2 1344 6.551970 -12.481400 3.056030 +VERTEX_SE2 1345 5.621330 -12.393100 3.043200 +VERTEX_SE2 1346 4.637490 -12.250800 3.042810 +VERTEX_SE2 1347 4.672620 -12.315800 1.455360 +VERTEX_SE2 1348 4.820880 -11.330600 1.456490 +VERTEX_SE2 1349 4.915870 -10.322300 1.463960 +VERTEX_SE2 1350 5.025030 -9.374240 1.467740 +VERTEX_SE2 1351 5.023500 -9.333470 -0.130773 +VERTEX_SE2 1352 5.926580 -9.449070 -0.138015 +VERTEX_SE2 1353 6.965990 -9.623860 -0.126324 +VERTEX_SE2 1354 6.982870 -9.630720 1.456890 +VERTEX_SE2 1355 7.053300 -8.575670 1.453340 +VERTEX_SE2 1356 7.092810 -8.549150 -0.114471 +VERTEX_SE2 1357 7.081550 -8.535990 1.453600 +VERTEX_SE2 1358 7.247740 -7.518650 1.479430 +VERTEX_SE2 1359 7.328300 -6.522480 1.486230 +VERTEX_SE2 1360 7.483880 -5.583590 1.513850 +VERTEX_SE2 1361 7.553450 -4.560030 1.517500 +VERTEX_SE2 1362 7.563070 -4.574890 3.081690 +VERTEX_SE2 1363 6.618050 -4.473210 3.069280 +VERTEX_SE2 1364 6.613480 -4.475050 -1.667500 +VERTEX_SE2 1365 6.583310 -5.465300 -1.670890 +VERTEX_SE2 1366 6.562820 -6.492340 -1.638460 +VERTEX_SE2 1367 6.588550 -6.504730 3.060460 +VERTEX_SE2 1368 5.572900 -6.456220 3.057970 +VERTEX_SE2 1369 4.496740 -6.320840 3.075530 +VERTEX_SE2 1370 3.532350 -6.337690 3.068250 +VERTEX_SE2 1371 2.558000 -6.300980 3.069920 +VERTEX_SE2 1372 1.493760 -6.182130 3.065660 +VERTEX_SE2 1373 0.505458 -6.105860 3.038350 +VERTEX_SE2 1374 -0.433209 -5.939540 3.015230 +VERTEX_SE2 1375 -0.365174 -5.935590 1.432290 +VERTEX_SE2 1376 -0.164293 -4.982220 1.445940 +VERTEX_SE2 1377 -0.139323 -4.918770 3.026350 +VERTEX_SE2 1378 -0.169052 -4.883200 1.480630 +VERTEX_SE2 1379 -0.100495 -3.907030 1.479830 +VERTEX_SE2 1380 -0.052732 -2.967930 1.483140 +VERTEX_SE2 1381 -0.042610 -1.991480 1.461240 +VERTEX_SE2 1382 0.072384 -0.997383 1.469060 +VERTEX_SE2 1383 0.193766 -0.006850 1.472410 +VERTEX_SE2 1384 0.198396 -0.009285 3.027130 +VERTEX_SE2 1385 -0.808772 0.091862 3.034160 +VERTEX_SE2 1386 -1.754010 0.206243 3.041290 +VERTEX_SE2 1387 -1.714360 0.178246 -1.657990 +VERTEX_SE2 1388 -1.755090 -0.906698 -1.646960 +VERTEX_SE2 1389 -1.893210 -1.913230 -1.627990 +VERTEX_SE2 1390 -1.882530 -1.862680 -0.050015 +VERTEX_SE2 1391 -0.851256 -1.874970 -0.054721 +VERTEX_SE2 1392 0.119241 -1.887090 -0.046803 +VERTEX_SE2 1393 1.098600 -1.840280 -0.040162 +VERTEX_SE2 1394 2.053000 -1.824860 -0.077360 +VERTEX_SE2 1395 3.140460 -1.868090 -0.057338 +VERTEX_SE2 1396 4.140290 -1.962050 -0.051715 +VERTEX_SE2 1397 5.100550 -2.064620 -0.046474 +VERTEX_SE2 1398 5.070130 -2.073630 -1.600570 +VERTEX_SE2 1399 5.026890 -3.097920 -1.563810 +VERTEX_SE2 1400 5.000000 -4.000000 -1.570800 +EDGE_SE2 1100 1101 0.006546 0.006016 1.577310 +EDGE_SE2 1101 1102 1.052530 0.007321 -0.003030 +EDGE_SE2 1102 1103 1.013350 -0.037027 0.000144 +EDGE_SE2 1103 1104 0.997248 -0.024456 0.016611 +EDGE_SE2 1104 1105 -0.046933 -0.029547 -1.549780 +EDGE_SE2 1105 1106 1.052350 -0.114447 -0.011725 +EDGE_SE2 1106 1107 -0.039744 0.024140 -1.579690 +EDGE_SE2 1107 1108 -0.015187 0.012307 1.563970 +EDGE_SE2 1108 1109 -0.005425 -0.094311 -1.574860 +EDGE_SE2 1109 1110 0.985898 -0.047376 -0.032547 +EDGE_SE2 1110 1111 1.065070 -0.002752 0.013086 +EDGE_SE2 1111 1112 -0.067780 -0.069280 1.567360 +EDGE_SE2 1112 1113 1.045120 0.008832 0.006208 +EDGE_SE2 1113 1114 1.001370 -0.005731 0.009132 +EDGE_SE2 1114 1115 0.075400 0.079444 1.577440 +EDGE_SE2 1115 1116 0.029896 -0.059231 -1.579030 +EDGE_SE2 1116 1117 1.006680 -0.004637 0.021740 +EDGE_SE2 1117 1118 1.011010 0.048221 0.016556 +EDGE_SE2 1118 1119 1.052410 -0.091681 0.001929 +EDGE_SE2 1119 1120 1.050630 -0.076680 -0.015776 +EDGE_SE2 1120 1121 0.922191 0.050277 -0.022443 +EDGE_SE2 1121 1122 0.032551 -0.051417 1.591760 +EDGE_SE2 1122 1123 0.033758 0.005045 -1.566180 +EDGE_SE2 1123 1124 1.039660 -0.003420 -0.014672 +EDGE_SE2 1124 1125 1.017410 -0.093200 0.006436 +EDGE_SE2 1125 1126 0.964251 0.130420 0.003892 +EDGE_SE2 1126 1127 0.856684 0.012183 -0.029628 +EDGE_SE2 1127 1128 0.979513 0.013880 0.014926 +EDGE_SE2 1128 1129 0.981895 0.000055 -3.121530 +EDGE_SE2 1129 1130 0.957564 0.041416 -0.005659 +EDGE_SE2 1130 1131 1.005640 -0.016019 -0.008055 +EDGE_SE2 1131 1132 0.039455 -0.044288 -1.579770 +EDGE_SE2 1132 1133 -0.030281 -0.009131 -1.605490 +EDGE_SE2 1133 1134 -0.016991 -0.042359 -1.575260 +EDGE_SE2 1134 1135 1.060690 -0.027215 0.018718 +EDGE_SE2 1135 1136 1.012500 -0.009308 -0.001290 +EDGE_SE2 1136 1137 1.012600 -0.072095 -0.004472 +EDGE_SE2 1137 1138 0.012147 -0.004206 1.575800 +EDGE_SE2 1138 1139 0.997361 -0.079355 -0.000762 +EDGE_SE2 1139 1140 0.976426 -0.005776 -3.136120 +EDGE_SE2 1140 1141 0.982646 0.069009 -0.009121 +EDGE_SE2 1141 1142 0.995301 -0.040263 -0.023783 +EDGE_SE2 1142 1143 0.973722 -0.017159 -0.033573 +EDGE_SE2 1143 1144 0.950075 -0.043877 0.014285 +EDGE_SE2 1144 1145 -0.020798 0.052549 1.557440 +EDGE_SE2 1145 1146 1.081890 0.047459 -0.007418 +EDGE_SE2 1146 1147 0.951381 0.068256 -0.026437 +EDGE_SE2 1147 1148 1.008980 -0.001099 0.012539 +EDGE_SE2 1148 1149 0.980743 0.012567 0.013885 +EDGE_SE2 1149 1150 0.925616 0.030413 -0.003208 +EDGE_SE2 1150 1151 0.949653 0.006129 -0.000559 +EDGE_SE2 1151 1152 1.048410 -0.005658 0.021419 +EDGE_SE2 1152 1153 0.983531 0.001373 -0.002117 +EDGE_SE2 1153 1154 0.990817 -0.019346 -0.008271 +EDGE_SE2 1154 1155 0.994283 0.063489 0.003511 +EDGE_SE2 1155 1156 1.005160 0.051474 0.025668 +EDGE_SE2 1156 1157 0.037987 -0.059231 -3.125090 +EDGE_SE2 1157 1158 0.985115 -0.003985 -0.001162 +EDGE_SE2 1158 1159 0.974568 -0.002801 -0.007125 +EDGE_SE2 1159 1160 0.022454 0.011954 1.584230 +EDGE_SE2 1160 1161 0.958217 0.081555 -0.004777 +EDGE_SE2 1161 1162 -0.035230 0.002327 -1.558280 +EDGE_SE2 1162 1163 -0.011106 0.017330 -1.588970 +EDGE_SE2 1163 1164 0.979101 -0.060924 0.007463 +EDGE_SE2 1164 1165 0.982261 -0.055886 -0.016920 +EDGE_SE2 1165 1166 0.976990 0.042696 -0.019881 +EDGE_SE2 1166 1167 -0.025230 -0.019496 -1.570080 +EDGE_SE2 1167 1168 1.018860 -0.032671 0.016010 +EDGE_SE2 1168 1169 0.982399 -0.031383 -0.006237 +EDGE_SE2 1169 1170 0.007968 0.005054 -3.141590 +EDGE_SE2 1170 1171 0.989518 -0.036501 0.018927 +EDGE_SE2 1171 1172 1.073120 0.001066 -0.010569 +EDGE_SE2 1172 1173 1.078520 -0.031449 -0.008373 +EDGE_SE2 1173 1174 1.024780 0.008632 -0.001481 +EDGE_SE2 1174 1175 0.026128 0.105479 1.610900 +EDGE_SE2 1175 1176 -0.034476 0.027233 -1.587440 +EDGE_SE2 1176 1177 1.114830 0.002824 0.010802 +EDGE_SE2 1177 1178 0.989872 -0.052663 -0.016259 +EDGE_SE2 1178 1179 0.027768 -0.002131 -1.588250 +EDGE_SE2 1179 1180 0.935931 -0.041249 0.008759 +EDGE_SE2 1180 1181 0.969348 0.005468 -3.136230 +EDGE_SE2 1181 1182 0.952363 -0.115659 -0.015814 +EDGE_SE2 1182 1183 1.001700 -0.073215 0.011515 +EDGE_SE2 1183 1184 0.018297 -0.022876 1.553330 +EDGE_SE2 1184 1185 1.031400 -0.019496 0.003134 +EDGE_SE2 1185 1186 -0.002814 0.038153 1.551890 +EDGE_SE2 1186 1187 0.979085 0.048265 -0.008198 +EDGE_SE2 1187 1188 0.989818 0.001277 3.123230 +EDGE_SE2 1188 1189 1.015570 -0.013017 0.006965 +EDGE_SE2 1189 1190 0.990532 -0.012005 0.013347 +EDGE_SE2 1190 1191 -0.019576 0.002654 1.556590 +EDGE_SE2 1191 1192 0.074904 0.080515 -1.541710 +EDGE_SE2 1192 1193 0.967523 -0.016224 -0.012388 +EDGE_SE2 1193 1194 1.035240 -0.020101 0.006525 +EDGE_SE2 1194 1195 0.015861 0.032321 1.587350 +EDGE_SE2 1195 1196 1.073800 0.095692 -0.009799 +EDGE_SE2 1196 1197 0.989278 0.149784 -0.017017 +EDGE_SE2 1197 1198 1.000750 -0.028634 -0.007378 +EDGE_SE2 1198 1199 1.069300 0.029317 0.005256 +EDGE_SE2 1199 1200 -0.005872 0.078628 -1.593180 +EDGE_SE2 1200 1201 0.972572 0.010058 0.002108 +EDGE_SE2 1201 1202 1.015040 0.041944 0.001066 +EDGE_SE2 1202 1203 0.969411 0.028179 -0.003329 +EDGE_SE2 1203 1204 1.010660 -0.019988 0.012696 +EDGE_SE2 1204 1205 1.052540 -0.057178 -0.008095 +EDGE_SE2 1205 1206 0.944270 -0.002143 0.022186 +EDGE_SE2 1206 1207 0.020487 -0.122883 1.589950 +EDGE_SE2 1207 1208 0.028142 0.066378 1.573590 +EDGE_SE2 1208 1209 1.021600 0.099608 -0.014515 +EDGE_SE2 1209 1210 1.027750 0.079716 0.001802 +EDGE_SE2 1210 1211 -0.052560 0.034636 -1.559150 +EDGE_SE2 1211 1212 -0.024180 -0.008000 -1.567510 +EDGE_SE2 1212 1213 1.083300 -0.017263 -0.024112 +EDGE_SE2 1213 1214 1.002600 -0.049125 -0.000700 +EDGE_SE2 1214 1215 1.041170 -0.042436 -0.010718 +EDGE_SE2 1215 1216 1.028620 0.006495 -0.008027 +EDGE_SE2 1216 1217 1.041150 -0.000954 0.013981 +EDGE_SE2 1217 1218 1.053240 -0.012542 -0.021271 +EDGE_SE2 1218 1219 0.929746 0.002637 -0.018047 +EDGE_SE2 1219 1220 1.038960 -0.005703 -0.000112 +EDGE_SE2 1220 1221 1.020540 -0.002337 -0.014186 +EDGE_SE2 1221 1222 1.009920 0.033154 -0.008636 +EDGE_SE2 1222 1223 -0.016882 0.114579 -1.567840 +EDGE_SE2 1223 1224 1.004840 -0.042954 0.014005 +EDGE_SE2 1224 1225 1.071440 0.011965 0.015030 +EDGE_SE2 1225 1226 0.985934 0.010150 0.013273 +EDGE_SE2 1226 1227 1.079330 0.046545 -0.010418 +EDGE_SE2 1227 1228 0.978568 0.092095 0.005963 +EDGE_SE2 1228 1229 0.983281 0.008074 -0.004442 +EDGE_SE2 1229 1230 -0.058010 0.049272 -1.586130 +EDGE_SE2 1230 1231 0.982871 0.042359 0.009336 +EDGE_SE2 1231 1232 1.018420 -0.031866 0.008538 +EDGE_SE2 1232 1233 0.949570 -0.024478 0.007384 +EDGE_SE2 1233 1234 0.933499 -0.089048 -0.007462 +EDGE_SE2 1234 1235 1.008720 0.054300 -0.003793 +EDGE_SE2 1235 1236 0.987530 -0.116289 -0.003566 +EDGE_SE2 1236 1237 0.968783 0.056676 0.003822 +EDGE_SE2 1237 1238 1.041390 -0.021849 -0.002042 +EDGE_SE2 1238 1239 0.016965 0.004133 1.580790 +EDGE_SE2 1239 1240 -0.017142 -0.039698 1.572750 +EDGE_SE2 1240 1241 1.015660 -0.008740 -0.005019 +EDGE_SE2 1241 1242 1.013300 -0.015493 0.006845 +EDGE_SE2 1242 1243 1.011040 0.060168 0.000082 +EDGE_SE2 1243 1244 0.041257 0.014247 1.577050 +EDGE_SE2 1244 1245 1.003130 0.011087 0.021135 +EDGE_SE2 1245 1246 0.978989 0.045611 -0.001330 +EDGE_SE2 1246 1247 1.032790 0.011985 -0.012788 +EDGE_SE2 1247 1248 1.027850 0.055427 -0.015465 +EDGE_SE2 1248 1249 0.951532 -0.113636 0.017059 +EDGE_SE2 1249 1250 0.017396 -0.070298 -1.584690 +EDGE_SE2 1250 1251 0.980104 -0.002552 0.000870 +EDGE_SE2 1251 1252 0.962747 0.031813 0.011988 +EDGE_SE2 1252 1253 0.972941 -0.035201 -0.026202 +EDGE_SE2 1253 1254 -0.043859 0.047588 -1.563340 +EDGE_SE2 1254 1255 0.957446 -0.022734 -0.008264 +EDGE_SE2 1255 1256 1.006160 -0.021333 -0.011800 +EDGE_SE2 1256 1257 0.019816 -0.003854 1.566690 +EDGE_SE2 1257 1258 1.004610 -0.011799 -0.006698 +EDGE_SE2 1258 1259 1.028610 -0.033751 0.005326 +EDGE_SE2 1259 1260 1.080630 0.116675 -0.001219 +EDGE_SE2 1260 1261 0.942101 0.012648 0.012032 +EDGE_SE2 1261 1262 0.962592 0.053341 0.029916 +EDGE_SE2 1262 1263 0.978721 -0.004699 -0.024014 +EDGE_SE2 1263 1264 1.021120 0.012826 -0.013793 +EDGE_SE2 1264 1265 0.959543 -0.129415 0.002010 +EDGE_SE2 1265 1266 0.078358 0.059239 -1.581360 +EDGE_SE2 1266 1267 0.952083 0.033203 -0.000167 +EDGE_SE2 1267 1268 0.914446 -0.036217 0.017241 +EDGE_SE2 1268 1269 1.034020 0.022690 0.015161 +EDGE_SE2 1269 1270 0.962908 -0.054006 -0.022120 +EDGE_SE2 1270 1271 1.069580 -0.031950 0.002649 +EDGE_SE2 1271 1272 -0.019903 0.007963 -1.586580 +EDGE_SE2 1272 1273 0.985411 -0.048511 -0.005099 +EDGE_SE2 1273 1274 0.988803 -0.040850 -0.001608 +EDGE_SE2 1274 1275 0.996932 0.037888 0.011959 +EDGE_SE2 1275 1276 -0.037214 -0.061949 1.588560 +EDGE_SE2 1276 1277 0.994816 -0.029108 -0.008224 +EDGE_SE2 1277 1278 0.987955 -0.010016 0.013385 +EDGE_SE2 1278 1279 1.008660 -0.021282 -0.003377 +EDGE_SE2 1279 1280 1.035120 0.053892 -0.007487 +EDGE_SE2 1280 1281 0.011880 -0.005748 1.570020 +EDGE_SE2 1281 1282 1.022780 -0.008784 0.011790 +EDGE_SE2 1282 1283 0.027800 -0.008031 1.565280 +EDGE_SE2 1283 1284 0.010698 -0.038916 1.555360 +EDGE_SE2 1284 1285 0.895379 0.033433 -0.004346 +EDGE_SE2 1285 1286 1.110350 -0.012480 0.004406 +EDGE_SE2 1286 1287 0.965602 -0.083537 -0.016493 +EDGE_SE2 1287 1288 0.987958 -0.082818 0.013926 +EDGE_SE2 1288 1289 1.047770 -0.031598 -0.016516 +EDGE_SE2 1289 1290 0.984402 0.040989 0.019630 +EDGE_SE2 1290 1291 1.030210 0.008602 0.009294 +EDGE_SE2 1291 1292 1.019560 0.007228 -0.007305 +EDGE_SE2 1292 1293 0.985575 -0.082842 0.001047 +EDGE_SE2 1293 1294 0.049807 -0.030035 1.570940 +EDGE_SE2 1294 1295 0.008979 -0.017909 -1.567170 +EDGE_SE2 1295 1296 1.046050 0.057096 -0.017435 +EDGE_SE2 1296 1297 0.944011 0.038928 -0.013483 +EDGE_SE2 1297 1298 1.006080 -0.026380 0.015023 +EDGE_SE2 1298 1299 1.042630 0.058169 0.002883 +EDGE_SE2 1299 1300 1.022540 -0.072081 0.020272 +EDGE_SE2 1300 1301 0.998786 0.068060 -0.003453 +EDGE_SE2 1301 1302 -0.042061 -0.001740 -1.582270 +EDGE_SE2 1302 1303 1.027920 -0.030583 0.018880 +EDGE_SE2 1303 1304 0.108273 -0.006164 1.570620 +EDGE_SE2 1304 1305 0.003952 0.004445 -1.570500 +EDGE_SE2 1305 1306 -0.040015 0.013737 -1.560420 +EDGE_SE2 1306 1307 -0.084784 -0.023819 1.579780 +EDGE_SE2 1307 1308 1.019670 -0.019836 0.007376 +EDGE_SE2 1308 1309 0.012094 0.052912 1.574690 +EDGE_SE2 1309 1310 -0.013137 0.024083 1.562350 +EDGE_SE2 1310 1311 1.029980 -0.030654 -0.002423 +EDGE_SE2 1311 1312 0.990937 0.018570 0.000235 +EDGE_SE2 1312 1313 0.076680 0.031768 1.565810 +EDGE_SE2 1313 1314 0.019919 -0.025101 1.552980 +EDGE_SE2 1314 1315 0.019024 0.021016 1.556300 +EDGE_SE2 1315 1316 0.997068 0.031156 0.002847 +EDGE_SE2 1316 1317 0.966899 -0.042234 -0.003529 +EDGE_SE2 1317 1318 0.997148 0.006091 -0.007780 +EDGE_SE2 1318 1319 0.907999 0.026962 0.004224 +EDGE_SE2 1319 1320 0.948056 0.057133 0.010510 +EDGE_SE2 1320 1321 1.033990 0.052503 0.024302 +EDGE_SE2 1321 1322 0.958021 0.002762 -3.120070 +EDGE_SE2 1322 1323 1.019250 0.003862 -0.009592 +EDGE_SE2 1323 1324 0.935843 -0.005380 0.021131 +EDGE_SE2 1324 1325 0.020910 -0.076881 1.538530 +EDGE_SE2 1325 1326 1.050890 0.010874 -0.013323 +EDGE_SE2 1326 1327 0.998944 -0.015842 -0.004316 +EDGE_SE2 1327 1328 0.946482 -0.119657 0.028971 +EDGE_SE2 1328 1329 1.052950 0.015916 0.012171 +EDGE_SE2 1329 1330 1.012390 0.007027 0.002321 +EDGE_SE2 1330 1331 1.030790 0.038664 0.008146 +EDGE_SE2 1331 1332 1.024520 0.034642 0.001633 +EDGE_SE2 1332 1333 0.962030 0.010023 0.020242 +EDGE_SE2 1333 1334 1.030170 -0.045081 -0.016430 +EDGE_SE2 1334 1335 1.084730 0.044323 0.008006 +EDGE_SE2 1335 1336 0.944908 0.036967 0.000145 +EDGE_SE2 1336 1337 0.928006 0.093408 0.019848 +EDGE_SE2 1337 1338 -0.021527 -0.062579 -1.550280 +EDGE_SE2 1338 1339 1.000420 -0.030778 0.001612 +EDGE_SE2 1339 1340 0.995840 0.087416 0.005223 +EDGE_SE2 1340 1341 0.908663 -0.014885 -0.013784 +EDGE_SE2 1341 1342 0.039917 -0.024835 1.587760 +EDGE_SE2 1342 1343 0.008339 0.022664 -1.573960 +EDGE_SE2 1343 1344 0.997621 -0.002496 0.029712 +EDGE_SE2 1344 1345 0.934778 -0.008496 -0.012830 +EDGE_SE2 1345 1346 0.993062 -0.044951 -0.000391 +EDGE_SE2 1346 1347 -0.041367 0.061242 -1.587450 +EDGE_SE2 1347 1348 0.995669 -0.033812 0.001123 +EDGE_SE2 1348 1349 1.012620 0.020645 0.007472 +EDGE_SE2 1349 1350 0.954270 -0.007437 0.003780 +EDGE_SE2 1350 1351 0.040398 0.005714 -1.598510 +EDGE_SE2 1351 1352 0.910438 0.003153 -0.007242 +EDGE_SE2 1352 1353 1.053580 -0.030135 0.011691 +EDGE_SE2 1353 1354 0.017607 -0.004677 1.583210 +EDGE_SE2 1354 1355 1.056220 0.049942 -0.003547 +EDGE_SE2 1355 1356 0.030968 -0.036128 -1.567810 +EDGE_SE2 1356 1357 -0.012688 0.011791 1.568070 +EDGE_SE2 1357 1358 1.029790 -0.046087 0.025832 +EDGE_SE2 1358 1359 0.999366 0.010666 0.006802 +EDGE_SE2 1359 1360 0.948673 -0.075728 0.027616 +EDGE_SE2 1360 1361 1.025860 -0.011199 0.003648 +EDGE_SE2 1361 1362 -0.014324 -0.010395 1.564190 +EDGE_SE2 1362 1363 0.949412 -0.044915 -0.012404 +EDGE_SE2 1363 1364 0.004428 0.002160 1.546400 +EDGE_SE2 1364 1365 0.988534 0.065586 -0.003386 +EDGE_SE2 1365 1366 1.023950 0.082246 0.032425 +EDGE_SE2 1366 1367 0.010619 0.026505 -1.584260 +EDGE_SE2 1367 1368 1.016240 0.033967 -0.002488 +EDGE_SE2 1368 1369 1.083710 -0.045031 0.017554 +EDGE_SE2 1369 1370 0.961176 0.080478 -0.007277 +EDGE_SE2 1370 1371 0.974418 0.034786 0.001670 +EDGE_SE2 1371 1372 1.070020 -0.042332 -0.004261 +EDGE_SE2 1372 1373 0.991236 -0.001085 -0.027315 +EDGE_SE2 1373 1374 0.950810 -0.068687 -0.023114 +EDGE_SE2 1374 1375 -0.066995 -0.012495 -1.582940 +EDGE_SE2 1375 1376 0.971969 -0.067333 0.013652 +EDGE_SE2 1376 1377 0.066071 -0.016874 1.580410 +EDGE_SE2 1377 1378 0.033622 -0.031918 -1.545720 +EDGE_SE2 1378 1379 0.978374 0.019616 -0.000801 +EDGE_SE2 1379 1380 0.939557 0.037740 0.003304 +EDGE_SE2 1380 1381 0.973588 0.075403 -0.021901 +EDGE_SE2 1381 1382 1.000710 -0.005608 0.007829 +EDGE_SE2 1382 1383 0.997739 -0.020161 0.003349 +EDGE_SE2 1383 1384 -0.001969 -0.004847 1.554720 +EDGE_SE2 1384 1385 1.012130 0.014543 0.007025 +EDGE_SE2 1385 1386 0.952048 -0.012366 0.007127 +EDGE_SE2 1386 1387 -0.042252 0.023885 1.583910 +EDGE_SE2 1387 1388 1.084370 0.053898 0.011027 +EDGE_SE2 1388 1389 1.014120 -0.061130 0.018968 +EDGE_SE2 1389 1390 -0.051071 0.007776 1.577980 +EDGE_SE2 1390 1391 1.030600 0.039281 -0.004706 +EDGE_SE2 1391 1392 0.969706 0.040987 0.007918 +EDGE_SE2 1392 1393 0.976095 0.092576 0.006641 +EDGE_SE2 1393 1394 0.953016 0.053725 -0.037199 +EDGE_SE2 1394 1395 1.087550 0.040948 0.020023 +EDGE_SE2 1395 1396 1.003570 -0.036515 0.005622 +EDGE_SE2 1396 1397 0.964271 -0.052789 0.005242 +EDGE_SE2 1397 1398 -0.029967 -0.010418 -1.554100 +EDGE_SE2 1398 1399 1.025120 -0.012726 0.036768 +EDGE_SE2 1399 1400 0.901873 -0.033191 -0.006995 +EDGE_RANGE_SE2_XY 1101 19 4.857451 +EDGE_RANGE_SE2_XY 1101 22 3.029368 +EDGE_RANGE_SE2_XY 1101 32 3.309342 +EDGE_RANGE_SE2_XY 1101 43 3.725844 +EDGE_RANGE_SE2_XY 1101 53 4.871873 +EDGE_RANGE_SE2_XY 1101 56 1.790738 +EDGE_RANGE_SE2_XY 1102 19 3.936951 +EDGE_RANGE_SE2_XY 1102 22 3.505421 +EDGE_RANGE_SE2_XY 1102 32 2.647556 +EDGE_RANGE_SE2_XY 1102 43 3.308009 +EDGE_RANGE_SE2_XY 1102 53 4.827249 +EDGE_RANGE_SE2_XY 1102 56 0.779908 +EDGE_RANGE_SE2_XY 1103 19 2.962173 +EDGE_RANGE_SE2_XY 1103 32 2.334939 +EDGE_RANGE_SE2_XY 1103 43 3.201146 +EDGE_RANGE_SE2_XY 1103 53 4.980616 +EDGE_RANGE_SE2_XY 1104 19 1.964526 +EDGE_RANGE_SE2_XY 1104 32 2.356212 +EDGE_RANGE_SE2_XY 1104 41 4.912187 +EDGE_RANGE_SE2_XY 1104 43 3.438544 +EDGE_RANGE_SE2_XY 1104 62 4.762978 +EDGE_RANGE_SE2_XY 1105 19 1.987435 +EDGE_RANGE_SE2_XY 1105 41 4.871234 +EDGE_RANGE_SE2_XY 1105 56 1.239375 +EDGE_RANGE_SE2_XY 1105 57 4.121775 +EDGE_RANGE_SE2_XY 1105 58 4.733908 +EDGE_RANGE_SE2_XY 1105 70 4.916661 +EDGE_RANGE_SE2_XY 1106 19 2.224545 +EDGE_RANGE_SE2_XY 1106 41 4.346377 +EDGE_RANGE_SE2_XY 1106 56 1.564514 +EDGE_RANGE_SE2_XY 1106 57 4.201213 +EDGE_RANGE_SE2_XY 1106 58 4.632318 +EDGE_RANGE_SE2_XY 1106 70 4.793123 +EDGE_RANGE_SE2_XY 1107 32 3.363205 +EDGE_RANGE_SE2_XY 1107 43 4.381163 +EDGE_RANGE_SE2_XY 1107 56 1.532184 +EDGE_RANGE_SE2_XY 1107 57 4.189039 +EDGE_RANGE_SE2_XY 1107 58 4.525377 +EDGE_RANGE_SE2_XY 1107 70 4.848943 +EDGE_RANGE_SE2_XY 1108 19 2.364020 +EDGE_RANGE_SE2_XY 1108 41 4.412879 +EDGE_RANGE_SE2_XY 1108 56 1.471697 +EDGE_RANGE_SE2_XY 1108 57 4.221028 +EDGE_RANGE_SE2_XY 1108 58 4.627875 +EDGE_RANGE_SE2_XY 1108 70 4.852880 +EDGE_RANGE_SE2_XY 1109 32 3.348151 +EDGE_RANGE_SE2_XY 1109 43 4.399199 +EDGE_RANGE_SE2_XY 1109 56 1.499895 +EDGE_RANGE_SE2_XY 1109 57 4.202725 +EDGE_RANGE_SE2_XY 1109 58 4.562309 +EDGE_RANGE_SE2_XY 1109 70 4.882914 +EDGE_RANGE_SE2_XY 1110 13 4.726819 +EDGE_RANGE_SE2_XY 1110 22 4.987276 +EDGE_RANGE_SE2_XY 1110 32 3.336446 +EDGE_RANGE_SE2_XY 1110 43 4.284431 +EDGE_RANGE_SE2_XY 1110 56 0.845565 +EDGE_RANGE_SE2_XY 1110 57 3.242601 +EDGE_RANGE_SE2_XY 1110 58 3.586908 +EDGE_RANGE_SE2_XY 1110 70 3.838412 +EDGE_RANGE_SE2_XY 1111 13 3.807798 +EDGE_RANGE_SE2_XY 1111 22 4.385149 +EDGE_RANGE_SE2_XY 1111 32 3.600372 +EDGE_RANGE_SE2_XY 1111 43 4.341745 +EDGE_RANGE_SE2_XY 1111 56 1.170756 +EDGE_RANGE_SE2_XY 1111 57 2.329515 +EDGE_RANGE_SE2_XY 1111 58 2.594391 +EDGE_RANGE_SE2_XY 1111 70 2.872469 +EDGE_RANGE_SE2_XY 1111 89 4.819311 +EDGE_RANGE_SE2_XY 1112 13 3.770957 +EDGE_RANGE_SE2_XY 1112 19 4.169780 +EDGE_RANGE_SE2_XY 1112 57 2.345286 +EDGE_RANGE_SE2_XY 1112 58 2.575212 +EDGE_RANGE_SE2_XY 1112 70 2.831113 +EDGE_RANGE_SE2_XY 1112 89 4.798520 +EDGE_RANGE_SE2_XY 1113 13 4.303585 +EDGE_RANGE_SE2_XY 1113 19 4.498726 +EDGE_RANGE_SE2_XY 1113 57 2.852034 +EDGE_RANGE_SE2_XY 1113 58 2.647159 +EDGE_RANGE_SE2_XY 1113 70 3.000736 +EDGE_RANGE_SE2_XY 1114 26 4.713846 +EDGE_RANGE_SE2_XY 1114 58 3.053567 +EDGE_RANGE_SE2_XY 1114 70 3.428845 +EDGE_RANGE_SE2_XY 1115 26 4.675888 +EDGE_RANGE_SE2_XY 1115 56 2.961745 +EDGE_RANGE_SE2_XY 1115 57 3.543707 +EDGE_RANGE_SE2_XY 1116 26 4.743968 +EDGE_RANGE_SE2_XY 1116 58 3.034337 +EDGE_RANGE_SE2_XY 1116 70 3.475171 +EDGE_RANGE_SE2_XY 1117 26 4.048299 +EDGE_RANGE_SE2_XY 1117 42 4.761799 +EDGE_RANGE_SE2_XY 1117 84 4.789044 +EDGE_RANGE_SE2_XY 1117 94 4.765552 +EDGE_RANGE_SE2_XY 1118 26 3.589049 +EDGE_RANGE_SE2_XY 1118 42 4.467333 +EDGE_RANGE_SE2_XY 1118 49 4.715838 +EDGE_RANGE_SE2_XY 1118 84 3.969183 +EDGE_RANGE_SE2_XY 1118 94 4.657418 +EDGE_RANGE_SE2_XY 1119 26 3.292514 +EDGE_RANGE_SE2_XY 1119 42 4.427423 +EDGE_RANGE_SE2_XY 1119 49 4.396051 +EDGE_RANGE_SE2_XY 1119 84 3.400651 +EDGE_RANGE_SE2_XY 1119 94 4.732958 +EDGE_RANGE_SE2_XY 1120 9 4.435312 +EDGE_RANGE_SE2_XY 1120 26 3.407978 +EDGE_RANGE_SE2_XY 1120 42 4.541725 +EDGE_RANGE_SE2_XY 1120 49 4.373240 +EDGE_RANGE_SE2_XY 1120 51 4.696709 +EDGE_RANGE_SE2_XY 1120 59 4.199036 +EDGE_RANGE_SE2_XY 1120 84 3.065915 +EDGE_RANGE_SE2_XY 1121 9 3.428774 +EDGE_RANGE_SE2_XY 1121 26 3.746073 +EDGE_RANGE_SE2_XY 1121 42 4.957848 +EDGE_RANGE_SE2_XY 1121 49 4.421961 +EDGE_RANGE_SE2_XY 1121 51 3.818177 +EDGE_RANGE_SE2_XY 1121 59 3.408329 +EDGE_RANGE_SE2_XY 1121 84 2.931211 +EDGE_RANGE_SE2_XY 1121 96 4.506834 +EDGE_RANGE_SE2_XY 1122 9 3.449694 +EDGE_RANGE_SE2_XY 1122 26 3.698763 +EDGE_RANGE_SE2_XY 1122 42 4.871737 +EDGE_RANGE_SE2_XY 1122 51 3.904941 +EDGE_RANGE_SE2_XY 1122 59 3.416027 +EDGE_RANGE_SE2_XY 1122 96 4.579109 +EDGE_RANGE_SE2_XY 1123 9 3.498844 +EDGE_RANGE_SE2_XY 1123 26 3.765815 +EDGE_RANGE_SE2_XY 1123 42 4.857185 +EDGE_RANGE_SE2_XY 1123 49 4.492475 +EDGE_RANGE_SE2_XY 1123 51 3.882022 +EDGE_RANGE_SE2_XY 1123 59 3.405451 +EDGE_RANGE_SE2_XY 1123 84 2.974378 +EDGE_RANGE_SE2_XY 1123 96 4.558613 +EDGE_RANGE_SE2_XY 1124 9 2.529643 +EDGE_RANGE_SE2_XY 1124 26 4.251020 +EDGE_RANGE_SE2_XY 1124 49 4.892912 +EDGE_RANGE_SE2_XY 1124 50 4.785058 +EDGE_RANGE_SE2_XY 1124 51 3.229781 +EDGE_RANGE_SE2_XY 1124 59 2.669398 +EDGE_RANGE_SE2_XY 1124 84 3.126282 +EDGE_RANGE_SE2_XY 1124 96 3.561004 +EDGE_RANGE_SE2_XY 1125 9 1.641236 +EDGE_RANGE_SE2_XY 1125 31 4.860697 +EDGE_RANGE_SE2_XY 1125 50 4.054025 +EDGE_RANGE_SE2_XY 1125 51 2.786815 +EDGE_RANGE_SE2_XY 1125 59 2.291844 +EDGE_RANGE_SE2_XY 1125 84 3.738854 +EDGE_RANGE_SE2_XY 1125 96 2.788069 +EDGE_RANGE_SE2_XY 1126 9 0.965726 +EDGE_RANGE_SE2_XY 1126 31 4.245325 +EDGE_RANGE_SE2_XY 1126 50 3.428439 +EDGE_RANGE_SE2_XY 1126 51 2.563741 +EDGE_RANGE_SE2_XY 1126 59 2.168664 +EDGE_RANGE_SE2_XY 1126 83 4.438871 +EDGE_RANGE_SE2_XY 1126 96 1.899084 +EDGE_RANGE_SE2_XY 1127 9 1.085014 +EDGE_RANGE_SE2_XY 1127 31 3.827799 +EDGE_RANGE_SE2_XY 1127 50 3.051109 +EDGE_RANGE_SE2_XY 1127 51 2.864002 +EDGE_RANGE_SE2_XY 1127 59 2.535069 +EDGE_RANGE_SE2_XY 1127 83 3.922304 +EDGE_RANGE_SE2_XY 1127 96 1.474645 +EDGE_RANGE_SE2_XY 1128 31 3.644557 +EDGE_RANGE_SE2_XY 1128 50 2.916753 +EDGE_RANGE_SE2_XY 1128 51 3.408432 +EDGE_RANGE_SE2_XY 1128 83 3.574629 +EDGE_RANGE_SE2_XY 1128 96 1.476983 +EDGE_RANGE_SE2_XY 1129 9 2.752545 +EDGE_RANGE_SE2_XY 1129 31 3.724532 +EDGE_RANGE_SE2_XY 1129 50 3.141963 +EDGE_RANGE_SE2_XY 1129 51 4.036135 +EDGE_RANGE_SE2_XY 1129 59 4.000901 +EDGE_RANGE_SE2_XY 1129 83 3.611570 +EDGE_RANGE_SE2_XY 1129 96 2.169308 +EDGE_RANGE_SE2_XY 1130 9 1.814115 +EDGE_RANGE_SE2_XY 1130 31 3.607467 +EDGE_RANGE_SE2_XY 1130 50 2.922949 +EDGE_RANGE_SE2_XY 1130 51 3.399054 +EDGE_RANGE_SE2_XY 1130 59 3.207300 +EDGE_RANGE_SE2_XY 1130 83 3.625030 +EDGE_RANGE_SE2_XY 1130 96 1.512374 +EDGE_RANGE_SE2_XY 1131 9 1.104486 +EDGE_RANGE_SE2_XY 1131 31 3.828282 +EDGE_RANGE_SE2_XY 1131 50 3.000797 +EDGE_RANGE_SE2_XY 1131 51 2.810661 +EDGE_RANGE_SE2_XY 1131 59 2.586489 +EDGE_RANGE_SE2_XY 1131 83 3.921271 +EDGE_RANGE_SE2_XY 1131 96 1.360578 +EDGE_RANGE_SE2_XY 1132 51 2.890546 +EDGE_RANGE_SE2_XY 1132 59 2.546455 +EDGE_RANGE_SE2_XY 1132 83 3.916376 +EDGE_RANGE_SE2_XY 1133 9 1.029858 +EDGE_RANGE_SE2_XY 1133 31 3.846970 +EDGE_RANGE_SE2_XY 1133 50 2.965401 +EDGE_RANGE_SE2_XY 1133 51 2.824649 +EDGE_RANGE_SE2_XY 1133 59 2.516625 +EDGE_RANGE_SE2_XY 1133 83 3.866627 +EDGE_RANGE_SE2_XY 1133 96 1.382779 +EDGE_RANGE_SE2_XY 1134 9 1.108836 +EDGE_RANGE_SE2_XY 1134 31 3.799130 +EDGE_RANGE_SE2_XY 1134 50 2.991836 +EDGE_RANGE_SE2_XY 1134 96 1.397300 +EDGE_RANGE_SE2_XY 1135 9 0.718404 +EDGE_RANGE_SE2_XY 1135 31 2.870101 +EDGE_RANGE_SE2_XY 1135 50 2.118459 +EDGE_RANGE_SE2_XY 1135 78 4.695297 +EDGE_RANGE_SE2_XY 1135 84 4.712406 +EDGE_RANGE_SE2_XY 1135 96 0.501521 +EDGE_RANGE_SE2_XY 1136 10 4.393214 +EDGE_RANGE_SE2_XY 1136 31 2.012592 +EDGE_RANGE_SE2_XY 1136 35 4.867267 +EDGE_RANGE_SE2_XY 1136 50 1.244902 +EDGE_RANGE_SE2_XY 1136 78 3.714795 +EDGE_RANGE_SE2_XY 1136 84 4.397568 +EDGE_RANGE_SE2_XY 1137 10 3.771284 +EDGE_RANGE_SE2_XY 1137 15 4.672272 +EDGE_RANGE_SE2_XY 1137 31 1.372858 +EDGE_RANGE_SE2_XY 1137 35 4.023838 +EDGE_RANGE_SE2_XY 1137 50 0.829919 +EDGE_RANGE_SE2_XY 1137 78 2.711711 +EDGE_RANGE_SE2_XY 1137 84 4.243039 +EDGE_RANGE_SE2_XY 1138 9 2.208323 +EDGE_RANGE_SE2_XY 1138 15 4.680234 +EDGE_RANGE_SE2_XY 1138 31 1.403417 +EDGE_RANGE_SE2_XY 1138 35 4.065029 +EDGE_RANGE_SE2_XY 1138 50 0.867667 +EDGE_RANGE_SE2_XY 1138 78 2.739092 +EDGE_RANGE_SE2_XY 1138 96 1.684189 +EDGE_RANGE_SE2_XY 1139 9 2.708356 +EDGE_RANGE_SE2_XY 1139 31 0.622755 +EDGE_RANGE_SE2_XY 1139 35 3.479483 +EDGE_RANGE_SE2_XY 1139 78 3.076849 +EDGE_RANGE_SE2_XY 1139 96 1.793293 +EDGE_RANGE_SE2_XY 1140 9 3.371697 +EDGE_RANGE_SE2_XY 1140 31 0.987703 +EDGE_RANGE_SE2_XY 1140 35 3.074232 +EDGE_RANGE_SE2_XY 1140 50 1.176540 +EDGE_RANGE_SE2_XY 1140 78 3.608612 +EDGE_RANGE_SE2_XY 1140 96 2.367549 +EDGE_RANGE_SE2_XY 1141 9 2.662227 +EDGE_RANGE_SE2_XY 1141 10 4.585851 +EDGE_RANGE_SE2_XY 1141 31 0.720629 +EDGE_RANGE_SE2_XY 1141 35 3.415268 +EDGE_RANGE_SE2_XY 1141 50 0.192666 +EDGE_RANGE_SE2_XY 1141 78 3.036988 +EDGE_RANGE_SE2_XY 1141 96 1.833927 +EDGE_RANGE_SE2_XY 1142 9 2.141088 +EDGE_RANGE_SE2_XY 1142 10 3.737737 +EDGE_RANGE_SE2_XY 1142 15 4.578466 +EDGE_RANGE_SE2_XY 1142 35 4.024537 +EDGE_RANGE_SE2_XY 1142 78 2.694706 +EDGE_RANGE_SE2_XY 1142 84 4.241145 +EDGE_RANGE_SE2_XY 1142 96 1.685785 +EDGE_RANGE_SE2_XY 1143 9 2.165132 +EDGE_RANGE_SE2_XY 1143 10 3.031200 +EDGE_RANGE_SE2_XY 1143 15 4.112574 +EDGE_RANGE_SE2_XY 1143 49 4.380352 +EDGE_RANGE_SE2_XY 1143 78 2.817606 +EDGE_RANGE_SE2_XY 1143 84 3.252707 +EDGE_RANGE_SE2_XY 1143 96 2.138593 +EDGE_RANGE_SE2_XY 1144 9 2.540852 +EDGE_RANGE_SE2_XY 1144 10 2.400824 +EDGE_RANGE_SE2_XY 1144 15 3.654784 +EDGE_RANGE_SE2_XY 1144 49 3.470880 +EDGE_RANGE_SE2_XY 1144 78 3.152965 +EDGE_RANGE_SE2_XY 1144 84 2.301278 +EDGE_RANGE_SE2_XY 1145 10 2.365861 +EDGE_RANGE_SE2_XY 1145 15 3.652475 +EDGE_RANGE_SE2_XY 1145 31 3.260819 +EDGE_RANGE_SE2_XY 1145 49 3.468493 +EDGE_RANGE_SE2_XY 1145 50 2.818954 +EDGE_RANGE_SE2_XY 1145 78 3.146034 +EDGE_RANGE_SE2_XY 1145 84 2.280165 +EDGE_RANGE_SE2_XY 1145 96 2.852876 +EDGE_RANGE_SE2_XY 1146 10 1.551385 +EDGE_RANGE_SE2_XY 1146 15 2.729804 +EDGE_RANGE_SE2_XY 1146 31 3.257711 +EDGE_RANGE_SE2_XY 1146 49 3.243273 +EDGE_RANGE_SE2_XY 1146 50 3.074635 +EDGE_RANGE_SE2_XY 1146 78 2.336028 +EDGE_RANGE_SE2_XY 1146 84 2.503435 +EDGE_RANGE_SE2_XY 1146 90 4.842586 +EDGE_RANGE_SE2_XY 1146 94 4.981118 +EDGE_RANGE_SE2_XY 1147 10 1.130520 +EDGE_RANGE_SE2_XY 1147 15 1.858229 +EDGE_RANGE_SE2_XY 1147 31 3.462025 +EDGE_RANGE_SE2_XY 1147 35 4.792484 +EDGE_RANGE_SE2_XY 1147 49 3.228763 +EDGE_RANGE_SE2_XY 1147 50 3.523212 +EDGE_RANGE_SE2_XY 1147 78 1.794387 +EDGE_RANGE_SE2_XY 1147 80 4.854891 +EDGE_RANGE_SE2_XY 1147 84 3.105113 +EDGE_RANGE_SE2_XY 1147 90 4.220353 +EDGE_RANGE_SE2_XY 1147 94 4.923640 +EDGE_RANGE_SE2_XY 1148 10 1.329604 +EDGE_RANGE_SE2_XY 1148 15 1.245594 +EDGE_RANGE_SE2_XY 1148 31 4.035555 +EDGE_RANGE_SE2_XY 1148 35 4.716281 +EDGE_RANGE_SE2_XY 1148 49 3.574864 +EDGE_RANGE_SE2_XY 1148 78 1.697030 +EDGE_RANGE_SE2_XY 1148 80 3.924920 +EDGE_RANGE_SE2_XY 1148 90 3.645927 +EDGE_RANGE_SE2_XY 1149 1 4.700579 +EDGE_RANGE_SE2_XY 1149 15 1.177994 +EDGE_RANGE_SE2_XY 1149 16 4.696956 +EDGE_RANGE_SE2_XY 1149 35 4.780949 +EDGE_RANGE_SE2_XY 1149 49 4.134323 +EDGE_RANGE_SE2_XY 1149 78 2.026213 +EDGE_RANGE_SE2_XY 1149 80 2.995918 +EDGE_RANGE_SE2_XY 1149 90 3.464907 +EDGE_RANGE_SE2_XY 1150 1 4.303406 +EDGE_RANGE_SE2_XY 1150 16 3.719962 +EDGE_RANGE_SE2_XY 1150 65 4.739115 +EDGE_RANGE_SE2_XY 1150 80 2.144930 +EDGE_RANGE_SE2_XY 1150 90 3.505612 +EDGE_RANGE_SE2_XY 1151 1 4.090926 +EDGE_RANGE_SE2_XY 1151 16 2.770987 +EDGE_RANGE_SE2_XY 1151 47 4.612518 +EDGE_RANGE_SE2_XY 1151 65 3.900869 +EDGE_RANGE_SE2_XY 1151 80 1.491481 +EDGE_RANGE_SE2_XY 1151 90 3.793238 +EDGE_RANGE_SE2_XY 1151 97 4.379800 +EDGE_RANGE_SE2_XY 1152 1 4.077544 +EDGE_RANGE_SE2_XY 1152 16 1.928800 +EDGE_RANGE_SE2_XY 1152 47 4.139836 +EDGE_RANGE_SE2_XY 1152 65 3.218176 +EDGE_RANGE_SE2_XY 1152 80 1.333170 +EDGE_RANGE_SE2_XY 1152 90 4.357314 +EDGE_RANGE_SE2_XY 1152 97 3.622714 +EDGE_RANGE_SE2_XY 1153 1 4.309016 +EDGE_RANGE_SE2_XY 1153 16 1.302146 +EDGE_RANGE_SE2_XY 1153 29 4.493651 +EDGE_RANGE_SE2_XY 1153 47 3.992160 +EDGE_RANGE_SE2_XY 1153 65 2.662072 +EDGE_RANGE_SE2_XY 1153 66 4.958630 +EDGE_RANGE_SE2_XY 1153 80 1.836005 +EDGE_RANGE_SE2_XY 1153 97 2.934722 +EDGE_RANGE_SE2_XY 1154 1 4.884813 +EDGE_RANGE_SE2_XY 1154 16 1.272676 +EDGE_RANGE_SE2_XY 1154 29 3.475539 +EDGE_RANGE_SE2_XY 1154 47 3.968795 +EDGE_RANGE_SE2_XY 1154 65 2.512987 +EDGE_RANGE_SE2_XY 1154 66 4.588508 +EDGE_RANGE_SE2_XY 1154 97 2.359686 +EDGE_RANGE_SE2_XY 1155 25 4.767542 +EDGE_RANGE_SE2_XY 1155 29 2.582628 +EDGE_RANGE_SE2_XY 1155 47 4.277022 +EDGE_RANGE_SE2_XY 1155 65 2.668336 +EDGE_RANGE_SE2_XY 1155 66 4.492124 +EDGE_RANGE_SE2_XY 1155 97 2.309841 +EDGE_RANGE_SE2_XY 1156 25 4.261085 +EDGE_RANGE_SE2_XY 1156 29 1.679784 +EDGE_RANGE_SE2_XY 1156 47 4.733718 +EDGE_RANGE_SE2_XY 1156 65 3.134927 +EDGE_RANGE_SE2_XY 1156 66 4.586531 +EDGE_RANGE_SE2_XY 1156 97 2.624530 +EDGE_RANGE_SE2_XY 1157 16 2.788430 +EDGE_RANGE_SE2_XY 1157 25 4.290231 +EDGE_RANGE_SE2_XY 1157 47 4.793170 +EDGE_RANGE_SE2_XY 1157 65 3.225613 +EDGE_RANGE_SE2_XY 1157 66 4.545295 +EDGE_RANGE_SE2_XY 1157 80 4.450166 +EDGE_RANGE_SE2_XY 1157 97 2.585873 +EDGE_RANGE_SE2_XY 1158 16 1.865981 +EDGE_RANGE_SE2_XY 1158 25 4.858096 +EDGE_RANGE_SE2_XY 1158 47 4.261815 +EDGE_RANGE_SE2_XY 1158 65 2.663355 +EDGE_RANGE_SE2_XY 1158 66 4.406640 +EDGE_RANGE_SE2_XY 1158 80 3.522427 +EDGE_RANGE_SE2_XY 1158 97 2.329454 +EDGE_RANGE_SE2_XY 1159 1 4.877457 +EDGE_RANGE_SE2_XY 1159 16 1.304748 +EDGE_RANGE_SE2_XY 1159 47 4.031715 +EDGE_RANGE_SE2_XY 1159 65 2.478132 +EDGE_RANGE_SE2_XY 1159 66 4.604447 +EDGE_RANGE_SE2_XY 1159 80 2.664641 +EDGE_RANGE_SE2_XY 1159 97 2.440537 +EDGE_RANGE_SE2_XY 1160 29 3.575054 +EDGE_RANGE_SE2_XY 1160 65 2.440079 +EDGE_RANGE_SE2_XY 1160 80 2.673150 +EDGE_RANGE_SE2_XY 1160 97 2.476352 +EDGE_RANGE_SE2_XY 1161 25 4.854983 +EDGE_RANGE_SE2_XY 1161 29 3.462423 +EDGE_RANGE_SE2_XY 1161 65 1.530333 +EDGE_RANGE_SE2_XY 1161 97 1.554614 +EDGE_RANGE_SE2_XY 1162 16 2.222088 +EDGE_RANGE_SE2_XY 1162 47 4.981496 +EDGE_RANGE_SE2_XY 1162 65 1.513367 +EDGE_RANGE_SE2_XY 1162 80 3.210010 +EDGE_RANGE_SE2_XY 1162 97 1.534476 +EDGE_RANGE_SE2_XY 1163 16 2.198868 +EDGE_RANGE_SE2_XY 1163 25 4.869166 +EDGE_RANGE_SE2_XY 1163 29 3.462140 +EDGE_RANGE_SE2_XY 1163 47 4.982515 +EDGE_RANGE_SE2_XY 1163 80 3.237660 +EDGE_RANGE_SE2_XY 1164 1 4.795743 +EDGE_RANGE_SE2_XY 1164 16 1.219286 +EDGE_RANGE_SE2_XY 1164 29 3.601961 +EDGE_RANGE_SE2_XY 1164 47 3.999037 +EDGE_RANGE_SE2_XY 1164 66 4.607729 +EDGE_RANGE_SE2_XY 1164 80 2.752029 +EDGE_RANGE_SE2_XY 1165 1 4.020410 +EDGE_RANGE_SE2_XY 1165 16 0.478609 +EDGE_RANGE_SE2_XY 1165 29 3.858515 +EDGE_RANGE_SE2_XY 1165 47 3.023760 +EDGE_RANGE_SE2_XY 1165 66 3.610648 +EDGE_RANGE_SE2_XY 1165 80 2.389709 +EDGE_RANGE_SE2_XY 1166 1 3.353562 +EDGE_RANGE_SE2_XY 1166 29 4.431941 +EDGE_RANGE_SE2_XY 1166 47 2.017845 +EDGE_RANGE_SE2_XY 1166 66 2.715548 +EDGE_RANGE_SE2_XY 1166 80 2.430321 +EDGE_RANGE_SE2_XY 1167 16 0.999937 +EDGE_RANGE_SE2_XY 1167 29 4.382108 +EDGE_RANGE_SE2_XY 1167 47 2.038770 +EDGE_RANGE_SE2_XY 1167 65 4.549515 +EDGE_RANGE_SE2_XY 1167 66 2.723001 +EDGE_RANGE_SE2_XY 1167 97 4.363190 +EDGE_RANGE_SE2_XY 1168 29 3.672282 +EDGE_RANGE_SE2_XY 1168 47 2.563235 +EDGE_RANGE_SE2_XY 1168 65 4.582283 +EDGE_RANGE_SE2_XY 1168 66 2.483766 +EDGE_RANGE_SE2_XY 1168 97 4.280925 +EDGE_RANGE_SE2_XY 1169 29 3.172586 +EDGE_RANGE_SE2_XY 1169 65 4.923564 +EDGE_RANGE_SE2_XY 1169 66 2.609205 +EDGE_RANGE_SE2_XY 1169 97 4.497770 +EDGE_RANGE_SE2_XY 1170 16 2.598201 +EDGE_RANGE_SE2_XY 1170 29 3.125969 +EDGE_RANGE_SE2_XY 1170 47 3.269382 +EDGE_RANGE_SE2_XY 1170 65 4.933013 +EDGE_RANGE_SE2_XY 1170 66 2.593892 +EDGE_RANGE_SE2_XY 1170 80 4.394753 +EDGE_RANGE_SE2_XY 1170 97 4.535325 +EDGE_RANGE_SE2_XY 1171 1 4.148532 +EDGE_RANGE_SE2_XY 1171 16 1.673786 +EDGE_RANGE_SE2_XY 1171 29 3.703739 +EDGE_RANGE_SE2_XY 1171 47 2.536660 +EDGE_RANGE_SE2_XY 1171 65 4.605101 +EDGE_RANGE_SE2_XY 1171 66 2.446587 +EDGE_RANGE_SE2_XY 1171 80 3.392022 +EDGE_RANGE_SE2_XY 1171 97 4.352014 +EDGE_RANGE_SE2_XY 1172 1 3.426765 +EDGE_RANGE_SE2_XY 1172 16 1.009684 +EDGE_RANGE_SE2_XY 1172 47 2.048337 +EDGE_RANGE_SE2_XY 1172 65 4.514483 +EDGE_RANGE_SE2_XY 1172 66 2.765336 +EDGE_RANGE_SE2_XY 1172 80 2.407441 +EDGE_RANGE_SE2_XY 1172 97 4.432687 +EDGE_RANGE_SE2_XY 1173 1 2.589445 +EDGE_RANGE_SE2_XY 1173 16 1.055351 +EDGE_RANGE_SE2_XY 1173 47 2.011266 +EDGE_RANGE_SE2_XY 1173 65 4.587919 +EDGE_RANGE_SE2_XY 1173 66 3.281745 +EDGE_RANGE_SE2_XY 1173 80 1.435058 +EDGE_RANGE_SE2_XY 1173 97 4.696270 +EDGE_RANGE_SE2_XY 1174 1 2.151050 +EDGE_RANGE_SE2_XY 1174 15 4.687283 +EDGE_RANGE_SE2_XY 1174 35 4.807009 +EDGE_RANGE_SE2_XY 1174 47 2.408032 +EDGE_RANGE_SE2_XY 1174 65 4.889724 +EDGE_RANGE_SE2_XY 1174 78 4.306198 +EDGE_RANGE_SE2_XY 1174 80 0.695258 +EDGE_RANGE_SE2_XY 1175 15 4.574224 +EDGE_RANGE_SE2_XY 1175 16 1.687543 +EDGE_RANGE_SE2_XY 1175 35 4.755338 +EDGE_RANGE_SE2_XY 1175 65 4.922041 +EDGE_RANGE_SE2_XY 1175 66 4.005861 +EDGE_RANGE_SE2_XY 1175 78 4.296639 +EDGE_RANGE_SE2_XY 1175 80 0.788367 +EDGE_RANGE_SE2_XY 1176 1 2.177345 +EDGE_RANGE_SE2_XY 1176 15 4.702453 +EDGE_RANGE_SE2_XY 1176 35 4.754957 +EDGE_RANGE_SE2_XY 1176 47 2.364127 +EDGE_RANGE_SE2_XY 1176 65 4.927586 +EDGE_RANGE_SE2_XY 1176 78 4.284921 +EDGE_RANGE_SE2_XY 1176 80 0.786461 +EDGE_RANGE_SE2_XY 1177 1 2.048740 +EDGE_RANGE_SE2_XY 1177 10 4.934034 +EDGE_RANGE_SE2_XY 1177 15 3.973749 +EDGE_RANGE_SE2_XY 1177 35 3.990033 +EDGE_RANGE_SE2_XY 1177 78 3.310759 +EDGE_RANGE_SE2_XY 1178 1 2.469010 +EDGE_RANGE_SE2_XY 1178 10 4.176141 +EDGE_RANGE_SE2_XY 1178 15 3.456755 +EDGE_RANGE_SE2_XY 1178 31 4.568072 +EDGE_RANGE_SE2_XY 1178 35 3.308961 +EDGE_RANGE_SE2_XY 1178 78 2.360775 +EDGE_RANGE_SE2_XY 1179 1 2.506316 +EDGE_RANGE_SE2_XY 1179 16 3.642095 +EDGE_RANGE_SE2_XY 1179 31 4.522855 +EDGE_RANGE_SE2_XY 1179 35 3.361805 +EDGE_RANGE_SE2_XY 1179 47 3.884441 +EDGE_RANGE_SE2_XY 1179 78 2.347048 +EDGE_RANGE_SE2_XY 1179 80 1.888614 +EDGE_RANGE_SE2_XY 1180 1 1.798030 +EDGE_RANGE_SE2_XY 1180 16 3.942264 +EDGE_RANGE_SE2_XY 1180 31 4.366865 +EDGE_RANGE_SE2_XY 1180 35 2.587503 +EDGE_RANGE_SE2_XY 1180 47 3.504823 +EDGE_RANGE_SE2_XY 1180 78 2.691418 +EDGE_RANGE_SE2_XY 1180 80 2.357345 +EDGE_RANGE_SE2_XY 1181 1 1.361379 +EDGE_RANGE_SE2_XY 1181 16 4.498936 +EDGE_RANGE_SE2_XY 1181 31 4.488777 +EDGE_RANGE_SE2_XY 1181 35 2.047911 +EDGE_RANGE_SE2_XY 1181 47 3.380098 +EDGE_RANGE_SE2_XY 1181 78 3.299718 +EDGE_RANGE_SE2_XY 1181 80 3.164674 +EDGE_RANGE_SE2_XY 1182 1 1.725614 +EDGE_RANGE_SE2_XY 1182 10 4.980229 +EDGE_RANGE_SE2_XY 1182 15 4.339524 +EDGE_RANGE_SE2_XY 1182 16 3.968929 +EDGE_RANGE_SE2_XY 1182 31 4.448985 +EDGE_RANGE_SE2_XY 1182 35 2.627655 +EDGE_RANGE_SE2_XY 1182 47 3.475686 +EDGE_RANGE_SE2_XY 1182 78 2.655191 +EDGE_RANGE_SE2_XY 1182 80 2.394601 +EDGE_RANGE_SE2_XY 1183 10 4.223932 +EDGE_RANGE_SE2_XY 1183 15 3.449554 +EDGE_RANGE_SE2_XY 1183 16 3.620267 +EDGE_RANGE_SE2_XY 1183 31 4.539252 +EDGE_RANGE_SE2_XY 1183 47 3.863987 +EDGE_RANGE_SE2_XY 1183 78 2.388948 +EDGE_RANGE_SE2_XY 1183 80 1.816922 +EDGE_RANGE_SE2_XY 1184 1 2.502003 +EDGE_RANGE_SE2_XY 1184 10 4.236620 +EDGE_RANGE_SE2_XY 1184 15 3.432912 +EDGE_RANGE_SE2_XY 1184 16 3.624569 +EDGE_RANGE_SE2_XY 1184 35 3.305621 +EDGE_RANGE_SE2_XY 1184 47 3.855162 +EDGE_RANGE_SE2_XY 1184 80 1.832514 +EDGE_RANGE_SE2_XY 1185 1 2.089569 +EDGE_RANGE_SE2_XY 1185 15 3.956948 +EDGE_RANGE_SE2_XY 1185 16 2.662002 +EDGE_RANGE_SE2_XY 1185 47 3.115248 +EDGE_RANGE_SE2_XY 1185 66 4.819181 +EDGE_RANGE_SE2_XY 1185 80 0.946817 +EDGE_RANGE_SE2_XY 1186 1 2.107665 +EDGE_RANGE_SE2_XY 1186 10 4.944048 +EDGE_RANGE_SE2_XY 1186 16 2.678224 +EDGE_RANGE_SE2_XY 1186 35 3.988387 +EDGE_RANGE_SE2_XY 1186 47 3.076053 +EDGE_RANGE_SE2_XY 1186 66 4.827344 +EDGE_RANGE_SE2_XY 1186 78 3.302367 +EDGE_RANGE_SE2_XY 1186 80 1.002975 +EDGE_RANGE_SE2_XY 1187 1 1.170034 +EDGE_RANGE_SE2_XY 1187 16 3.048679 +EDGE_RANGE_SE2_XY 1187 35 3.408842 +EDGE_RANGE_SE2_XY 1187 47 2.581752 +EDGE_RANGE_SE2_XY 1187 66 4.324636 +EDGE_RANGE_SE2_XY 1187 78 3.639306 +EDGE_RANGE_SE2_XY 1188 1 0.340246 +EDGE_RANGE_SE2_XY 1188 16 3.838670 +EDGE_RANGE_SE2_XY 1188 35 3.051018 +EDGE_RANGE_SE2_XY 1188 47 2.333342 +EDGE_RANGE_SE2_XY 1188 66 4.169105 +EDGE_RANGE_SE2_XY 1188 78 4.056196 +EDGE_RANGE_SE2_XY 1188 80 2.730367 +EDGE_RANGE_SE2_XY 1189 15 4.742387 +EDGE_RANGE_SE2_XY 1189 16 3.122202 +EDGE_RANGE_SE2_XY 1189 35 3.429597 +EDGE_RANGE_SE2_XY 1189 47 2.513488 +EDGE_RANGE_SE2_XY 1189 66 4.444488 +EDGE_RANGE_SE2_XY 1189 78 3.631189 +EDGE_RANGE_SE2_XY 1189 80 1.789555 +EDGE_RANGE_SE2_XY 1190 10 4.886740 +EDGE_RANGE_SE2_XY 1190 15 3.971558 +EDGE_RANGE_SE2_XY 1190 16 2.614404 +EDGE_RANGE_SE2_XY 1190 35 3.984046 +EDGE_RANGE_SE2_XY 1190 47 3.069546 +EDGE_RANGE_SE2_XY 1190 66 4.820887 +EDGE_RANGE_SE2_XY 1190 78 3.351778 +EDGE_RANGE_SE2_XY 1190 80 1.004693 +EDGE_RANGE_SE2_XY 1191 1 2.123200 +EDGE_RANGE_SE2_XY 1191 15 3.987192 +EDGE_RANGE_SE2_XY 1191 16 2.632612 +EDGE_RANGE_SE2_XY 1191 47 3.068079 +EDGE_RANGE_SE2_XY 1191 66 4.863784 +EDGE_RANGE_SE2_XY 1191 80 0.941562 +EDGE_RANGE_SE2_XY 1192 10 4.893439 +EDGE_RANGE_SE2_XY 1192 15 3.968018 +EDGE_RANGE_SE2_XY 1192 16 2.697036 +EDGE_RANGE_SE2_XY 1192 35 3.943686 +EDGE_RANGE_SE2_XY 1192 47 3.087854 +EDGE_RANGE_SE2_XY 1192 66 4.828451 +EDGE_RANGE_SE2_XY 1192 78 3.301073 +EDGE_RANGE_SE2_XY 1192 80 0.952622 +EDGE_RANGE_SE2_XY 1193 10 4.329564 +EDGE_RANGE_SE2_XY 1193 15 3.219333 +EDGE_RANGE_SE2_XY 1193 16 2.546244 +EDGE_RANGE_SE2_XY 1193 65 4.651653 +EDGE_RANGE_SE2_XY 1193 78 3.325221 +EDGE_RANGE_SE2_XY 1193 80 0.791087 +EDGE_RANGE_SE2_XY 1193 90 4.760429 +EDGE_RANGE_SE2_XY 1194 10 3.949832 +EDGE_RANGE_SE2_XY 1194 15 2.706968 +EDGE_RANGE_SE2_XY 1194 16 2.715280 +EDGE_RANGE_SE2_XY 1194 65 3.938081 +EDGE_RANGE_SE2_XY 1194 78 3.695611 +EDGE_RANGE_SE2_XY 1194 90 3.786680 +EDGE_RANGE_SE2_XY 1194 97 4.441485 +EDGE_RANGE_SE2_XY 1195 1 4.070442 +EDGE_RANGE_SE2_XY 1195 16 2.863135 +EDGE_RANGE_SE2_XY 1195 47 4.567223 +EDGE_RANGE_SE2_XY 1195 65 3.920206 +EDGE_RANGE_SE2_XY 1195 80 1.449495 +EDGE_RANGE_SE2_XY 1195 90 3.826172 +EDGE_RANGE_SE2_XY 1195 97 4.401054 +EDGE_RANGE_SE2_XY 1196 1 4.133477 +EDGE_RANGE_SE2_XY 1196 16 1.885302 +EDGE_RANGE_SE2_XY 1196 47 4.206361 +EDGE_RANGE_SE2_XY 1196 65 3.232485 +EDGE_RANGE_SE2_XY 1196 80 1.338347 +EDGE_RANGE_SE2_XY 1196 90 4.328686 +EDGE_RANGE_SE2_XY 1196 97 3.610394 +EDGE_RANGE_SE2_XY 1197 1 4.416918 +EDGE_RANGE_SE2_XY 1197 16 1.289153 +EDGE_RANGE_SE2_XY 1197 29 4.560841 +EDGE_RANGE_SE2_XY 1197 47 3.957951 +EDGE_RANGE_SE2_XY 1197 65 2.729209 +EDGE_RANGE_SE2_XY 1197 66 4.986463 +EDGE_RANGE_SE2_XY 1197 80 1.803454 +EDGE_RANGE_SE2_XY 1197 97 2.932736 +EDGE_RANGE_SE2_XY 1198 1 4.909354 +EDGE_RANGE_SE2_XY 1198 16 1.250421 +EDGE_RANGE_SE2_XY 1198 29 3.487527 +EDGE_RANGE_SE2_XY 1198 47 3.971228 +EDGE_RANGE_SE2_XY 1198 65 2.503570 +EDGE_RANGE_SE2_XY 1198 66 4.644293 +EDGE_RANGE_SE2_XY 1198 97 2.380034 +EDGE_RANGE_SE2_XY 1199 25 4.811476 +EDGE_RANGE_SE2_XY 1199 29 2.602070 +EDGE_RANGE_SE2_XY 1199 47 4.274801 +EDGE_RANGE_SE2_XY 1199 65 2.666547 +EDGE_RANGE_SE2_XY 1199 66 4.457827 +EDGE_RANGE_SE2_XY 1199 97 2.327553 +EDGE_RANGE_SE2_XY 1200 16 1.893688 +EDGE_RANGE_SE2_XY 1200 25 4.837983 +EDGE_RANGE_SE2_XY 1200 29 2.540046 +EDGE_RANGE_SE2_XY 1200 65 2.690557 +EDGE_RANGE_SE2_XY 1200 80 3.527857 +EDGE_RANGE_SE2_XY 1200 97 2.320451 +EDGE_RANGE_SE2_XY 1201 25 4.062562 +EDGE_RANGE_SE2_XY 1201 29 2.478835 +EDGE_RANGE_SE2_XY 1201 65 1.746844 +EDGE_RANGE_SE2_XY 1201 80 4.097271 +EDGE_RANGE_SE2_XY 1201 97 1.341309 +EDGE_RANGE_SE2_XY 1202 25 3.424665 +EDGE_RANGE_SE2_XY 1202 29 2.764506 +EDGE_RANGE_SE2_XY 1202 65 1.115291 +EDGE_RANGE_SE2_XY 1202 97 0.401839 +EDGE_RANGE_SE2_XY 1203 25 3.039439 +EDGE_RANGE_SE2_XY 1203 29 3.327397 +EDGE_RANGE_SE2_XY 1203 65 1.059490 +EDGE_RANGE_SE2_XY 1204 25 2.955107 +EDGE_RANGE_SE2_XY 1204 85 4.672656 +EDGE_RANGE_SE2_XY 1205 25 3.153098 +EDGE_RANGE_SE2_XY 1205 85 3.681370 +EDGE_RANGE_SE2_XY 1206 25 3.644466 +EDGE_RANGE_SE2_XY 1206 85 2.740042 +EDGE_RANGE_SE2_XY 1207 25 3.608870 +EDGE_RANGE_SE2_XY 1207 65 3.635359 +EDGE_RANGE_SE2_XY 1207 85 2.832692 +EDGE_RANGE_SE2_XY 1207 97 3.733134 +EDGE_RANGE_SE2_XY 1208 25 3.670818 +EDGE_RANGE_SE2_XY 1208 65 3.630327 +EDGE_RANGE_SE2_XY 1208 97 3.747595 +EDGE_RANGE_SE2_XY 1209 25 3.158081 +EDGE_RANGE_SE2_XY 1209 29 4.819441 +EDGE_RANGE_SE2_XY 1209 65 2.686371 +EDGE_RANGE_SE2_XY 1209 97 2.660065 +EDGE_RANGE_SE2_XY 1210 25 2.907611 +EDGE_RANGE_SE2_XY 1210 29 4.054449 +EDGE_RANGE_SE2_XY 1210 65 1.829921 +EDGE_RANGE_SE2_XY 1210 97 1.699815 +EDGE_RANGE_SE2_XY 1211 25 2.954148 +EDGE_RANGE_SE2_XY 1211 29 4.079020 +EDGE_RANGE_SE2_XY 1211 65 1.801341 +EDGE_RANGE_SE2_XY 1211 85 4.586944 +EDGE_RANGE_SE2_XY 1211 97 1.682302 +EDGE_RANGE_SE2_XY 1212 25 2.872034 +EDGE_RANGE_SE2_XY 1212 85 4.674533 +EDGE_RANGE_SE2_XY 1213 25 3.178980 +EDGE_RANGE_SE2_XY 1213 85 3.712502 +EDGE_RANGE_SE2_XY 1214 25 3.578454 +EDGE_RANGE_SE2_XY 1214 85 2.794567 +EDGE_RANGE_SE2_XY 1215 85 1.913891 +EDGE_RANGE_SE2_XY 1216 85 1.516091 +EDGE_RANGE_SE2_XY 1217 85 1.496699 +EDGE_RANGE_SE2_XY 1220 7 5.025832 +EDGE_RANGE_SE2_XY 1220 36 4.807054 +EDGE_RANGE_SE2_XY 1220 76 4.261249 +EDGE_RANGE_SE2_XY 1221 7 4.162080 +EDGE_RANGE_SE2_XY 1221 36 3.948160 +EDGE_RANGE_SE2_XY 1221 76 3.397153 +EDGE_RANGE_SE2_XY 1221 88 4.354935 +EDGE_RANGE_SE2_XY 1222 7 3.587738 +EDGE_RANGE_SE2_XY 1222 36 3.310180 +EDGE_RANGE_SE2_XY 1222 76 2.486001 +EDGE_RANGE_SE2_XY 1222 88 3.427855 +EDGE_RANGE_SE2_XY 1223 76 2.562533 +EDGE_RANGE_SE2_XY 1223 88 3.315923 +EDGE_RANGE_SE2_XY 1224 88 3.213683 +EDGE_RANGE_SE2_XY 1225 88 3.487200 +EDGE_RANGE_SE2_XY 1225 95 4.947531 +EDGE_RANGE_SE2_XY 1226 45 4.729564 +EDGE_RANGE_SE2_XY 1226 88 3.836709 +EDGE_RANGE_SE2_XY 1226 95 4.186590 +EDGE_RANGE_SE2_XY 1227 45 3.732015 +EDGE_RANGE_SE2_XY 1227 48 4.690890 +EDGE_RANGE_SE2_XY 1227 88 4.495451 +EDGE_RANGE_SE2_XY 1227 92 4.864575 +EDGE_RANGE_SE2_XY 1227 95 3.430961 +EDGE_RANGE_SE2_XY 1228 45 2.868818 +EDGE_RANGE_SE2_XY 1228 48 3.706979 +EDGE_RANGE_SE2_XY 1228 86 4.413380 +EDGE_RANGE_SE2_XY 1228 92 3.901915 +EDGE_RANGE_SE2_XY 1228 95 2.929153 +EDGE_RANGE_SE2_XY 1229 13 4.884696 +EDGE_RANGE_SE2_XY 1229 22 4.905469 +EDGE_RANGE_SE2_XY 1229 45 1.998537 +EDGE_RANGE_SE2_XY 1229 48 2.773156 +EDGE_RANGE_SE2_XY 1229 86 3.437633 +EDGE_RANGE_SE2_XY 1229 89 4.483337 +EDGE_RANGE_SE2_XY 1229 92 2.985930 +EDGE_RANGE_SE2_XY 1229 95 2.737702 +EDGE_RANGE_SE2_XY 1230 13 4.874541 +EDGE_RANGE_SE2_XY 1230 22 4.904797 +EDGE_RANGE_SE2_XY 1230 45 1.980051 +EDGE_RANGE_SE2_XY 1230 48 2.691680 +EDGE_RANGE_SE2_XY 1230 86 3.418111 +EDGE_RANGE_SE2_XY 1230 89 4.472245 +EDGE_RANGE_SE2_XY 1230 92 3.082565 +EDGE_RANGE_SE2_XY 1230 95 2.757656 +EDGE_RANGE_SE2_XY 1231 13 4.283046 +EDGE_RANGE_SE2_XY 1231 22 4.773159 +EDGE_RANGE_SE2_XY 1231 45 1.562323 +EDGE_RANGE_SE2_XY 1231 48 2.591490 +EDGE_RANGE_SE2_XY 1231 86 3.905893 +EDGE_RANGE_SE2_XY 1231 89 3.680481 +EDGE_RANGE_SE2_XY 1231 95 1.786610 +EDGE_RANGE_SE2_XY 1232 13 3.824515 +EDGE_RANGE_SE2_XY 1232 22 4.798024 +EDGE_RANGE_SE2_XY 1232 45 1.811695 +EDGE_RANGE_SE2_XY 1232 48 2.843236 +EDGE_RANGE_SE2_XY 1232 89 2.934137 +EDGE_RANGE_SE2_XY 1232 95 0.797827 +EDGE_RANGE_SE2_XY 1233 13 3.665537 +EDGE_RANGE_SE2_XY 1233 46 4.173350 +EDGE_RANGE_SE2_XY 1233 48 3.371316 +EDGE_RANGE_SE2_XY 1233 57 5.033949 +EDGE_RANGE_SE2_XY 1233 70 4.629676 +EDGE_RANGE_SE2_XY 1233 89 2.458587 +EDGE_RANGE_SE2_XY 1234 13 3.698568 +EDGE_RANGE_SE2_XY 1234 46 3.146642 +EDGE_RANGE_SE2_XY 1234 57 4.884318 +EDGE_RANGE_SE2_XY 1234 58 4.618880 +EDGE_RANGE_SE2_XY 1234 70 4.300247 +EDGE_RANGE_SE2_XY 1234 89 2.345803 +EDGE_RANGE_SE2_XY 1235 13 4.100670 +EDGE_RANGE_SE2_XY 1235 46 2.420150 +EDGE_RANGE_SE2_XY 1235 57 4.904865 +EDGE_RANGE_SE2_XY 1235 58 4.452771 +EDGE_RANGE_SE2_XY 1235 70 4.148658 +EDGE_RANGE_SE2_XY 1235 89 2.706360 +EDGE_RANGE_SE2_XY 1235 94 4.728010 +EDGE_RANGE_SE2_XY 1236 13 4.588444 +EDGE_RANGE_SE2_XY 1236 46 1.858859 +EDGE_RANGE_SE2_XY 1236 58 4.500299 +EDGE_RANGE_SE2_XY 1236 70 4.336632 +EDGE_RANGE_SE2_XY 1236 89 3.170372 +EDGE_RANGE_SE2_XY 1236 90 4.574416 +EDGE_RANGE_SE2_XY 1236 94 3.856795 +EDGE_RANGE_SE2_XY 1237 46 1.741251 +EDGE_RANGE_SE2_XY 1237 49 4.670148 +EDGE_RANGE_SE2_XY 1237 58 4.728350 +EDGE_RANGE_SE2_XY 1237 70 4.648247 +EDGE_RANGE_SE2_XY 1237 90 3.533917 +EDGE_RANGE_SE2_XY 1237 94 3.152951 +EDGE_RANGE_SE2_XY 1238 15 4.950128 +EDGE_RANGE_SE2_XY 1238 46 2.017402 +EDGE_RANGE_SE2_XY 1238 49 3.828888 +EDGE_RANGE_SE2_XY 1238 90 2.563085 +EDGE_RANGE_SE2_XY 1238 94 2.601087 +EDGE_RANGE_SE2_XY 1239 15 4.963691 +EDGE_RANGE_SE2_XY 1239 46 2.085862 +EDGE_RANGE_SE2_XY 1239 49 3.875075 +EDGE_RANGE_SE2_XY 1239 89 4.834595 +EDGE_RANGE_SE2_XY 1239 90 2.565275 +EDGE_RANGE_SE2_XY 1239 94 2.607385 +EDGE_RANGE_SE2_XY 1240 46 2.069027 +EDGE_RANGE_SE2_XY 1240 89 4.830231 +EDGE_RANGE_SE2_XY 1240 94 2.598213 +EDGE_RANGE_SE2_XY 1241 46 1.677517 +EDGE_RANGE_SE2_XY 1241 58 4.687600 +EDGE_RANGE_SE2_XY 1241 70 4.589563 +EDGE_RANGE_SE2_XY 1241 89 4.005086 +EDGE_RANGE_SE2_XY 1241 94 3.157980 +EDGE_RANGE_SE2_XY 1241 95 4.251354 +EDGE_RANGE_SE2_XY 1242 13 4.557106 +EDGE_RANGE_SE2_XY 1242 46 1.779386 +EDGE_RANGE_SE2_XY 1242 58 4.414014 +EDGE_RANGE_SE2_XY 1242 70 4.330822 +EDGE_RANGE_SE2_XY 1242 89 3.232256 +EDGE_RANGE_SE2_XY 1242 95 3.246384 +EDGE_RANGE_SE2_XY 1243 13 4.100092 +EDGE_RANGE_SE2_XY 1243 45 4.185016 +EDGE_RANGE_SE2_XY 1243 48 4.924093 +EDGE_RANGE_SE2_XY 1243 57 4.934821 +EDGE_RANGE_SE2_XY 1243 58 4.502068 +EDGE_RANGE_SE2_XY 1243 70 4.162285 +EDGE_RANGE_SE2_XY 1243 89 2.597506 +EDGE_RANGE_SE2_XY 1243 95 2.291012 +EDGE_RANGE_SE2_XY 1244 45 4.175544 +EDGE_RANGE_SE2_XY 1244 46 2.455749 +EDGE_RANGE_SE2_XY 1244 48 4.875079 +EDGE_RANGE_SE2_XY 1244 94 4.731783 +EDGE_RANGE_SE2_XY 1244 95 2.293464 +EDGE_RANGE_SE2_XY 1245 45 4.648957 +EDGE_RANGE_SE2_XY 1245 95 2.491083 +EDGE_RANGE_SE2_XY 1246 95 3.043062 +EDGE_RANGE_SE2_XY 1247 85 4.450371 +EDGE_RANGE_SE2_XY 1248 85 3.459402 +EDGE_RANGE_SE2_XY 1249 85 2.486152 +EDGE_RANGE_SE2_XY 1250 85 2.500222 +EDGE_RANGE_SE2_XY 1251 85 2.880987 +EDGE_RANGE_SE2_XY 1253 76 4.682937 +EDGE_RANGE_SE2_XY 1254 76 4.722052 +EDGE_RANGE_SE2_XY 1254 85 4.284673 +EDGE_RANGE_SE2_XY 1255 85 4.925454 +EDGE_RANGE_SE2_XY 1255 95 4.159936 +EDGE_RANGE_SE2_XY 1256 45 4.741565 +EDGE_RANGE_SE2_XY 1256 95 3.194540 +EDGE_RANGE_SE2_XY 1257 45 4.693971 +EDGE_RANGE_SE2_XY 1257 95 3.235635 +EDGE_RANGE_SE2_XY 1258 45 4.551213 +EDGE_RANGE_SE2_XY 1258 88 4.708445 +EDGE_RANGE_SE2_XY 1258 95 3.576131 +EDGE_RANGE_SE2_XY 1259 45 4.766895 +EDGE_RANGE_SE2_XY 1259 76 4.996521 +EDGE_RANGE_SE2_XY 1259 88 3.895599 +EDGE_RANGE_SE2_XY 1259 95 4.216114 +EDGE_RANGE_SE2_XY 1260 71 4.478186 +EDGE_RANGE_SE2_XY 1260 76 4.710070 +EDGE_RANGE_SE2_XY 1260 88 3.066984 +EDGE_RANGE_SE2_XY 1261 14 4.837468 +EDGE_RANGE_SE2_XY 1261 71 3.528099 +EDGE_RANGE_SE2_XY 1261 76 4.512326 +EDGE_RANGE_SE2_XY 1261 88 2.454725 +EDGE_RANGE_SE2_XY 1262 14 4.095101 +EDGE_RANGE_SE2_XY 1262 20 4.256187 +EDGE_RANGE_SE2_XY 1262 71 2.788134 +EDGE_RANGE_SE2_XY 1262 76 4.690158 +EDGE_RANGE_SE2_XY 1262 88 2.141852 +EDGE_RANGE_SE2_XY 1263 14 3.589026 +EDGE_RANGE_SE2_XY 1263 20 3.230367 +EDGE_RANGE_SE2_XY 1263 71 2.118562 +EDGE_RANGE_SE2_XY 1263 88 2.198045 +EDGE_RANGE_SE2_XY 1264 14 3.184778 +EDGE_RANGE_SE2_XY 1264 20 2.263384 +EDGE_RANGE_SE2_XY 1264 71 1.872364 +EDGE_RANGE_SE2_XY 1264 88 2.753385 +EDGE_RANGE_SE2_XY 1265 14 3.045889 +EDGE_RANGE_SE2_XY 1265 20 1.276676 +EDGE_RANGE_SE2_XY 1265 71 2.095155 +EDGE_RANGE_SE2_XY 1265 73 4.121732 +EDGE_RANGE_SE2_XY 1265 79 4.160250 +EDGE_RANGE_SE2_XY 1266 14 3.062959 +EDGE_RANGE_SE2_XY 1266 20 1.245096 +EDGE_RANGE_SE2_XY 1266 73 4.100068 +EDGE_RANGE_SE2_XY 1266 79 4.146829 +EDGE_RANGE_SE2_XY 1266 88 3.463712 +EDGE_RANGE_SE2_XY 1267 14 2.067031 +EDGE_RANGE_SE2_XY 1267 20 1.410491 +EDGE_RANGE_SE2_XY 1267 73 3.840888 +EDGE_RANGE_SE2_XY 1267 79 4.576199 +EDGE_RANGE_SE2_XY 1268 14 1.091351 +EDGE_RANGE_SE2_XY 1268 73 3.835747 +EDGE_RANGE_SE2_XY 1269 14 0.235072 +EDGE_RANGE_SE2_XY 1269 73 4.067198 +EDGE_RANGE_SE2_XY 1270 52 4.414945 +EDGE_RANGE_SE2_XY 1270 73 4.503675 +EDGE_RANGE_SE2_XY 1270 92 4.636388 +EDGE_RANGE_SE2_XY 1271 44 4.962265 +EDGE_RANGE_SE2_XY 1271 52 3.463221 +EDGE_RANGE_SE2_XY 1271 81 4.927370 +EDGE_RANGE_SE2_XY 1271 82 4.092316 +EDGE_RANGE_SE2_XY 1271 86 4.842935 +EDGE_RANGE_SE2_XY 1271 92 4.420958 +EDGE_RANGE_SE2_XY 1272 14 1.988432 +EDGE_RANGE_SE2_XY 1272 20 4.828816 +EDGE_RANGE_SE2_XY 1272 44 4.929056 +EDGE_RANGE_SE2_XY 1272 52 3.454819 +EDGE_RANGE_SE2_XY 1272 81 4.937037 +EDGE_RANGE_SE2_XY 1272 82 3.986897 +EDGE_RANGE_SE2_XY 1272 86 4.801727 +EDGE_RANGE_SE2_XY 1272 92 4.378054 +EDGE_RANGE_SE2_XY 1273 14 2.116795 +EDGE_RANGE_SE2_XY 1273 44 4.787627 +EDGE_RANGE_SE2_XY 1273 52 4.013688 +EDGE_RANGE_SE2_XY 1273 81 4.357543 +EDGE_RANGE_SE2_XY 1273 82 3.811295 +EDGE_RANGE_SE2_XY 1273 86 3.857038 +EDGE_RANGE_SE2_XY 1273 92 3.451116 +EDGE_RANGE_SE2_XY 1274 14 2.681443 +EDGE_RANGE_SE2_XY 1274 44 4.882887 +EDGE_RANGE_SE2_XY 1274 48 4.910631 +EDGE_RANGE_SE2_XY 1274 81 3.931309 +EDGE_RANGE_SE2_XY 1274 82 3.714208 +EDGE_RANGE_SE2_XY 1274 86 2.881065 +EDGE_RANGE_SE2_XY 1274 92 2.455685 +EDGE_RANGE_SE2_XY 1275 45 4.175326 +EDGE_RANGE_SE2_XY 1275 48 3.891521 +EDGE_RANGE_SE2_XY 1275 81 3.765544 +EDGE_RANGE_SE2_XY 1275 82 3.909520 +EDGE_RANGE_SE2_XY 1275 86 2.053101 +EDGE_RANGE_SE2_XY 1275 92 1.518415 +EDGE_RANGE_SE2_XY 1276 14 3.396183 +EDGE_RANGE_SE2_XY 1276 45 4.168524 +EDGE_RANGE_SE2_XY 1276 48 3.825816 +EDGE_RANGE_SE2_XY 1276 81 3.773525 +EDGE_RANGE_SE2_XY 1276 82 3.978836 +EDGE_RANGE_SE2_XY 1276 86 2.037015 +EDGE_RANGE_SE2_XY 1276 92 1.486834 +EDGE_RANGE_SE2_XY 1277 2 4.623981 +EDGE_RANGE_SE2_XY 1277 22 4.652136 +EDGE_RANGE_SE2_XY 1277 44 4.246896 +EDGE_RANGE_SE2_XY 1277 45 4.379695 +EDGE_RANGE_SE2_XY 1277 48 3.888707 +EDGE_RANGE_SE2_XY 1277 52 4.860047 +EDGE_RANGE_SE2_XY 1277 53 4.506790 +EDGE_RANGE_SE2_XY 1277 77 4.330529 +EDGE_RANGE_SE2_XY 1277 81 2.769729 +EDGE_RANGE_SE2_XY 1277 82 2.995590 +EDGE_RANGE_SE2_XY 1277 86 1.698151 +EDGE_RANGE_SE2_XY 1277 92 1.495560 +EDGE_RANGE_SE2_XY 1278 2 3.703716 +EDGE_RANGE_SE2_XY 1278 22 4.346654 +EDGE_RANGE_SE2_XY 1278 44 3.356126 +EDGE_RANGE_SE2_XY 1278 45 4.721130 +EDGE_RANGE_SE2_XY 1278 48 4.085425 +EDGE_RANGE_SE2_XY 1278 52 4.577173 +EDGE_RANGE_SE2_XY 1278 53 3.661755 +EDGE_RANGE_SE2_XY 1278 77 3.381674 +EDGE_RANGE_SE2_XY 1278 81 1.754797 +EDGE_RANGE_SE2_XY 1278 82 2.221140 +EDGE_RANGE_SE2_XY 1278 86 1.871838 +EDGE_RANGE_SE2_XY 1279 2 2.725430 +EDGE_RANGE_SE2_XY 1279 22 4.275036 +EDGE_RANGE_SE2_XY 1279 43 4.742250 +EDGE_RANGE_SE2_XY 1279 44 2.524849 +EDGE_RANGE_SE2_XY 1279 48 4.519649 +EDGE_RANGE_SE2_XY 1279 52 4.426156 +EDGE_RANGE_SE2_XY 1279 53 2.903794 +EDGE_RANGE_SE2_XY 1279 77 2.405473 +EDGE_RANGE_SE2_XY 1279 81 0.808210 +EDGE_RANGE_SE2_XY 1279 82 1.510961 +EDGE_RANGE_SE2_XY 1280 2 1.925936 +EDGE_RANGE_SE2_XY 1280 22 4.461893 +EDGE_RANGE_SE2_XY 1280 43 4.214063 +EDGE_RANGE_SE2_XY 1280 44 1.942191 +EDGE_RANGE_SE2_XY 1280 52 4.517238 +EDGE_RANGE_SE2_XY 1280 53 2.366075 +EDGE_RANGE_SE2_XY 1280 77 1.474101 +EDGE_RANGE_SE2_XY 1280 82 1.355377 +EDGE_RANGE_SE2_XY 1281 2 1.844271 +EDGE_RANGE_SE2_XY 1281 44 1.910390 +EDGE_RANGE_SE2_XY 1281 52 4.449889 +EDGE_RANGE_SE2_XY 1281 77 1.356354 +EDGE_RANGE_SE2_XY 1281 81 0.317423 +EDGE_RANGE_SE2_XY 1281 82 1.324630 +EDGE_RANGE_SE2_XY 1281 86 3.305991 +EDGE_RANGE_SE2_XY 1281 92 3.667947 +EDGE_RANGE_SE2_XY 1282 44 1.105743 +EDGE_RANGE_SE2_XY 1282 52 3.533202 +EDGE_RANGE_SE2_XY 1282 77 1.350927 +EDGE_RANGE_SE2_XY 1282 82 0.451458 +EDGE_RANGE_SE2_XY 1282 86 3.907387 +EDGE_RANGE_SE2_XY 1282 92 4.185877 +EDGE_RANGE_SE2_XY 1283 2 2.666971 +EDGE_RANGE_SE2_XY 1283 52 3.470431 +EDGE_RANGE_SE2_XY 1283 53 3.325599 +EDGE_RANGE_SE2_XY 1283 81 1.174150 +EDGE_RANGE_SE2_XY 1283 82 0.446313 +EDGE_RANGE_SE2_XY 1283 86 3.951945 +EDGE_RANGE_SE2_XY 1283 92 4.103931 +EDGE_RANGE_SE2_XY 1284 2 2.625995 +EDGE_RANGE_SE2_XY 1284 44 1.130278 +EDGE_RANGE_SE2_XY 1284 53 3.352898 +EDGE_RANGE_SE2_XY 1284 77 1.373262 +EDGE_RANGE_SE2_XY 1284 81 1.197537 +EDGE_RANGE_SE2_XY 1284 86 3.945248 +EDGE_RANGE_SE2_XY 1284 92 4.143425 +EDGE_RANGE_SE2_XY 1285 2 1.879499 +EDGE_RANGE_SE2_XY 1285 22 4.484983 +EDGE_RANGE_SE2_XY 1285 43 4.267837 +EDGE_RANGE_SE2_XY 1285 53 2.395062 +EDGE_RANGE_SE2_XY 1285 77 1.429183 +EDGE_RANGE_SE2_XY 1285 81 0.291862 +EDGE_RANGE_SE2_XY 1285 86 3.339092 +EDGE_RANGE_SE2_XY 1285 92 3.647848 +EDGE_RANGE_SE2_XY 1286 2 1.472806 +EDGE_RANGE_SE2_XY 1286 22 3.492610 +EDGE_RANGE_SE2_XY 1286 32 4.414517 +EDGE_RANGE_SE2_XY 1286 43 3.309260 +EDGE_RANGE_SE2_XY 1286 48 4.435993 +EDGE_RANGE_SE2_XY 1286 53 1.495044 +EDGE_RANGE_SE2_XY 1286 86 2.920705 +EDGE_RANGE_SE2_XY 1286 92 3.440778 +EDGE_RANGE_SE2_XY 1287 2 1.621166 +EDGE_RANGE_SE2_XY 1287 13 4.808545 +EDGE_RANGE_SE2_XY 1287 22 2.629627 +EDGE_RANGE_SE2_XY 1287 32 3.589715 +EDGE_RANGE_SE2_XY 1287 43 2.556977 +EDGE_RANGE_SE2_XY 1287 45 4.857075 +EDGE_RANGE_SE2_XY 1287 48 3.851681 +EDGE_RANGE_SE2_XY 1287 53 0.894320 +EDGE_RANGE_SE2_XY 1287 86 2.863668 +EDGE_RANGE_SE2_XY 1287 92 3.474394 +EDGE_RANGE_SE2_XY 1288 13 3.989193 +EDGE_RANGE_SE2_XY 1288 22 1.805312 +EDGE_RANGE_SE2_XY 1288 32 2.931509 +EDGE_RANGE_SE2_XY 1288 43 1.976415 +EDGE_RANGE_SE2_XY 1288 45 4.558154 +EDGE_RANGE_SE2_XY 1288 48 3.470809 +EDGE_RANGE_SE2_XY 1288 53 1.169658 +EDGE_RANGE_SE2_XY 1288 56 4.530705 +EDGE_RANGE_SE2_XY 1288 57 4.184733 +EDGE_RANGE_SE2_XY 1288 86 3.108068 +EDGE_RANGE_SE2_XY 1288 92 3.754182 +EDGE_RANGE_SE2_XY 1289 13 3.241487 +EDGE_RANGE_SE2_XY 1289 22 1.243058 +EDGE_RANGE_SE2_XY 1289 32 2.536938 +EDGE_RANGE_SE2_XY 1289 43 1.855549 +EDGE_RANGE_SE2_XY 1289 45 4.428318 +EDGE_RANGE_SE2_XY 1289 48 3.365773 +EDGE_RANGE_SE2_XY 1289 56 3.599799 +EDGE_RANGE_SE2_XY 1289 57 3.302304 +EDGE_RANGE_SE2_XY 1289 58 4.659555 +EDGE_RANGE_SE2_XY 1289 70 4.400884 +EDGE_RANGE_SE2_XY 1289 86 3.699348 +EDGE_RANGE_SE2_XY 1289 89 4.615387 +EDGE_RANGE_SE2_XY 1289 92 4.281365 +EDGE_RANGE_SE2_XY 1290 13 2.624643 +EDGE_RANGE_SE2_XY 1290 22 1.455756 +EDGE_RANGE_SE2_XY 1290 32 2.494457 +EDGE_RANGE_SE2_XY 1290 43 2.204883 +EDGE_RANGE_SE2_XY 1290 45 4.446543 +EDGE_RANGE_SE2_XY 1290 48 3.579561 +EDGE_RANGE_SE2_XY 1290 56 2.786621 +EDGE_RANGE_SE2_XY 1290 57 2.384745 +EDGE_RANGE_SE2_XY 1290 58 3.777514 +EDGE_RANGE_SE2_XY 1290 70 3.546602 +EDGE_RANGE_SE2_XY 1290 89 4.058115 +EDGE_RANGE_SE2_XY 1291 13 2.389766 +EDGE_RANGE_SE2_XY 1291 19 4.940563 +EDGE_RANGE_SE2_XY 1291 32 2.797034 +EDGE_RANGE_SE2_XY 1291 45 4.765905 +EDGE_RANGE_SE2_XY 1291 48 4.070783 +EDGE_RANGE_SE2_XY 1291 56 2.121230 +EDGE_RANGE_SE2_XY 1291 57 1.530099 +EDGE_RANGE_SE2_XY 1291 58 2.862678 +EDGE_RANGE_SE2_XY 1291 70 2.807323 +EDGE_RANGE_SE2_XY 1291 89 3.742873 +EDGE_RANGE_SE2_XY 1292 13 2.496375 +EDGE_RANGE_SE2_XY 1292 19 4.924565 +EDGE_RANGE_SE2_XY 1292 32 3.377225 +EDGE_RANGE_SE2_XY 1292 48 4.644819 +EDGE_RANGE_SE2_XY 1292 56 1.683986 +EDGE_RANGE_SE2_XY 1292 57 1.109628 +EDGE_RANGE_SE2_XY 1292 58 2.124230 +EDGE_RANGE_SE2_XY 1292 70 2.067546 +EDGE_RANGE_SE2_XY 1292 89 3.675254 +EDGE_RANGE_SE2_XY 1293 13 2.902459 +EDGE_RANGE_SE2_XY 1293 46 4.716153 +EDGE_RANGE_SE2_XY 1293 56 1.943696 +EDGE_RANGE_SE2_XY 1293 57 1.444226 +EDGE_RANGE_SE2_XY 1293 58 1.595566 +EDGE_RANGE_SE2_XY 1293 70 1.854717 +EDGE_RANGE_SE2_XY 1293 89 3.831137 +EDGE_RANGE_SE2_XY 1294 22 3.960571 +EDGE_RANGE_SE2_XY 1294 32 4.066581 +EDGE_RANGE_SE2_XY 1294 43 4.602679 +EDGE_RANGE_SE2_XY 1294 56 1.928226 +EDGE_RANGE_SE2_XY 1295 13 2.851424 +EDGE_RANGE_SE2_XY 1295 46 4.714164 +EDGE_RANGE_SE2_XY 1295 56 1.935007 +EDGE_RANGE_SE2_XY 1295 57 1.464385 +EDGE_RANGE_SE2_XY 1295 58 1.633014 +EDGE_RANGE_SE2_XY 1295 70 1.869437 +EDGE_RANGE_SE2_XY 1295 89 3.792808 +EDGE_RANGE_SE2_XY 1296 46 4.384748 +EDGE_RANGE_SE2_XY 1296 58 1.690269 +EDGE_RANGE_SE2_XY 1296 70 2.160697 +EDGE_RANGE_SE2_XY 1296 89 4.204460 +EDGE_RANGE_SE2_XY 1296 94 4.726742 +EDGE_RANGE_SE2_XY 1297 46 4.281354 +EDGE_RANGE_SE2_XY 1297 89 4.816233 +EDGE_RANGE_SE2_XY 1297 94 4.132851 +EDGE_RANGE_SE2_XY 1298 26 4.900856 +EDGE_RANGE_SE2_XY 1298 46 4.419546 +EDGE_RANGE_SE2_XY 1298 49 4.376752 +EDGE_RANGE_SE2_XY 1298 84 4.172923 +EDGE_RANGE_SE2_XY 1298 94 3.751827 +EDGE_RANGE_SE2_XY 1299 26 4.536593 +EDGE_RANGE_SE2_XY 1299 46 4.804809 +EDGE_RANGE_SE2_XY 1299 49 3.819084 +EDGE_RANGE_SE2_XY 1299 84 3.356955 +EDGE_RANGE_SE2_XY 1299 94 3.594022 +EDGE_RANGE_SE2_XY 1300 26 4.352760 +EDGE_RANGE_SE2_XY 1300 49 3.458195 +EDGE_RANGE_SE2_XY 1300 84 2.601248 +EDGE_RANGE_SE2_XY 1300 94 3.738140 +EDGE_RANGE_SE2_XY 1301 9 4.383572 +EDGE_RANGE_SE2_XY 1301 10 4.563404 +EDGE_RANGE_SE2_XY 1301 26 4.397839 +EDGE_RANGE_SE2_XY 1301 49 3.394041 +EDGE_RANGE_SE2_XY 1301 59 4.771256 +EDGE_RANGE_SE2_XY 1301 84 2.107430 +EDGE_RANGE_SE2_XY 1301 94 4.099481 +EDGE_RANGE_SE2_XY 1302 9 4.366461 +EDGE_RANGE_SE2_XY 1302 10 4.570484 +EDGE_RANGE_SE2_XY 1302 49 3.375475 +EDGE_RANGE_SE2_XY 1302 59 4.827922 +EDGE_RANGE_SE2_XY 1302 84 2.071011 +EDGE_RANGE_SE2_XY 1302 94 4.091899 +EDGE_RANGE_SE2_XY 1303 9 4.515332 +EDGE_RANGE_SE2_XY 1303 10 3.682531 +EDGE_RANGE_SE2_XY 1303 15 4.850322 +EDGE_RANGE_SE2_XY 1303 49 2.340735 +EDGE_RANGE_SE2_XY 1303 84 1.189454 +EDGE_RANGE_SE2_XY 1303 94 3.244082 +EDGE_RANGE_SE2_XY 1304 9 4.496173 +EDGE_RANGE_SE2_XY 1304 10 3.673187 +EDGE_RANGE_SE2_XY 1304 15 4.864539 +EDGE_RANGE_SE2_XY 1304 49 2.338773 +EDGE_RANGE_SE2_XY 1304 84 1.208701 +EDGE_RANGE_SE2_XY 1304 94 3.231548 +EDGE_RANGE_SE2_XY 1305 9 4.414827 +EDGE_RANGE_SE2_XY 1305 10 3.721318 +EDGE_RANGE_SE2_XY 1305 15 4.914226 +EDGE_RANGE_SE2_XY 1305 49 2.391348 +EDGE_RANGE_SE2_XY 1305 84 1.185354 +EDGE_RANGE_SE2_XY 1305 94 3.254959 +EDGE_RANGE_SE2_XY 1306 10 3.722926 +EDGE_RANGE_SE2_XY 1306 15 4.886584 +EDGE_RANGE_SE2_XY 1306 49 2.338735 +EDGE_RANGE_SE2_XY 1306 84 1.148940 +EDGE_RANGE_SE2_XY 1306 94 3.228555 +EDGE_RANGE_SE2_XY 1307 9 4.471809 +EDGE_RANGE_SE2_XY 1307 10 3.714716 +EDGE_RANGE_SE2_XY 1307 15 4.906841 +EDGE_RANGE_SE2_XY 1307 49 2.385740 +EDGE_RANGE_SE2_XY 1307 84 1.214837 +EDGE_RANGE_SE2_XY 1307 94 3.272828 +EDGE_RANGE_SE2_XY 1308 9 4.863626 +EDGE_RANGE_SE2_XY 1308 10 2.869972 +EDGE_RANGE_SE2_XY 1308 15 3.961584 +EDGE_RANGE_SE2_XY 1308 46 4.815195 +EDGE_RANGE_SE2_XY 1308 49 1.408692 +EDGE_RANGE_SE2_XY 1308 84 0.768081 +EDGE_RANGE_SE2_XY 1308 90 4.445417 +EDGE_RANGE_SE2_XY 1308 94 2.527471 +EDGE_RANGE_SE2_XY 1309 9 4.826135 +EDGE_RANGE_SE2_XY 1309 10 2.885173 +EDGE_RANGE_SE2_XY 1309 15 3.999062 +EDGE_RANGE_SE2_XY 1309 49 1.409538 +EDGE_RANGE_SE2_XY 1309 84 0.753935 +EDGE_RANGE_SE2_XY 1309 90 4.412177 +EDGE_RANGE_SE2_XY 1310 9 4.830314 +EDGE_RANGE_SE2_XY 1310 46 4.784649 +EDGE_RANGE_SE2_XY 1310 84 0.704061 +EDGE_RANGE_SE2_XY 1310 94 2.476936 +EDGE_RANGE_SE2_XY 1311 9 4.490580 +EDGE_RANGE_SE2_XY 1312 9 4.350014 +EDGE_RANGE_SE2_XY 1312 26 4.346948 +EDGE_RANGE_SE2_XY 1312 59 4.742408 +EDGE_RANGE_SE2_XY 1313 10 4.586518 +EDGE_RANGE_SE2_XY 1313 26 4.416232 +EDGE_RANGE_SE2_XY 1313 49 3.346049 +EDGE_RANGE_SE2_XY 1313 84 1.985025 +EDGE_RANGE_SE2_XY 1313 94 4.119307 +EDGE_RANGE_SE2_XY 1314 9 4.396376 +EDGE_RANGE_SE2_XY 1314 10 4.581796 +EDGE_RANGE_SE2_XY 1314 49 3.365585 +EDGE_RANGE_SE2_XY 1314 59 4.800259 +EDGE_RANGE_SE2_XY 1314 84 2.074071 +EDGE_RANGE_SE2_XY 1314 94 4.129650 +EDGE_RANGE_SE2_XY 1315 9 4.324960 +EDGE_RANGE_SE2_XY 1315 10 4.556697 +EDGE_RANGE_SE2_XY 1315 26 4.361030 +EDGE_RANGE_SE2_XY 1315 49 3.398626 +EDGE_RANGE_SE2_XY 1315 59 4.764822 +EDGE_RANGE_SE2_XY 1315 84 2.061233 +EDGE_RANGE_SE2_XY 1315 94 4.120594 +EDGE_RANGE_SE2_XY 1316 9 3.334851 +EDGE_RANGE_SE2_XY 1316 10 4.270855 +EDGE_RANGE_SE2_XY 1316 26 4.658510 +EDGE_RANGE_SE2_XY 1316 49 3.561589 +EDGE_RANGE_SE2_XY 1316 51 4.653717 +EDGE_RANGE_SE2_XY 1316 59 4.114061 +EDGE_RANGE_SE2_XY 1316 84 1.965389 +EDGE_RANGE_SE2_XY 1316 94 4.637638 +EDGE_RANGE_SE2_XY 1316 96 4.304451 +EDGE_RANGE_SE2_XY 1317 9 2.336492 +EDGE_RANGE_SE2_XY 1317 10 4.216541 +EDGE_RANGE_SE2_XY 1317 31 4.939956 +EDGE_RANGE_SE2_XY 1317 49 4.059980 +EDGE_RANGE_SE2_XY 1317 50 4.303540 +EDGE_RANGE_SE2_XY 1317 51 4.110375 +EDGE_RANGE_SE2_XY 1317 59 3.581715 +EDGE_RANGE_SE2_XY 1317 84 2.299668 +EDGE_RANGE_SE2_XY 1317 96 3.347648 +EDGE_RANGE_SE2_XY 1318 9 1.364889 +EDGE_RANGE_SE2_XY 1318 10 4.267624 +EDGE_RANGE_SE2_XY 1318 31 4.117879 +EDGE_RANGE_SE2_XY 1318 49 4.613379 +EDGE_RANGE_SE2_XY 1318 50 3.391876 +EDGE_RANGE_SE2_XY 1318 51 3.724207 +EDGE_RANGE_SE2_XY 1318 59 3.187021 +EDGE_RANGE_SE2_XY 1318 78 4.996566 +EDGE_RANGE_SE2_XY 1318 96 2.333294 +EDGE_RANGE_SE2_XY 1319 9 0.338949 +EDGE_RANGE_SE2_XY 1319 10 4.691087 +EDGE_RANGE_SE2_XY 1319 31 3.450318 +EDGE_RANGE_SE2_XY 1319 50 2.687108 +EDGE_RANGE_SE2_XY 1319 51 3.588311 +EDGE_RANGE_SE2_XY 1319 59 3.130531 +EDGE_RANGE_SE2_XY 1319 78 4.803011 +EDGE_RANGE_SE2_XY 1319 96 1.349979 +EDGE_RANGE_SE2_XY 1320 31 2.855156 +EDGE_RANGE_SE2_XY 1320 50 2.047356 +EDGE_RANGE_SE2_XY 1320 51 3.773578 +EDGE_RANGE_SE2_XY 1320 59 3.428495 +EDGE_RANGE_SE2_XY 1320 78 4.692631 +EDGE_RANGE_SE2_XY 1320 83 4.884891 +EDGE_RANGE_SE2_XY 1320 96 0.462274 +EDGE_RANGE_SE2_XY 1321 31 2.641873 +EDGE_RANGE_SE2_XY 1321 50 1.907999 +EDGE_RANGE_SE2_XY 1321 51 4.201361 +EDGE_RANGE_SE2_XY 1321 59 3.933613 +EDGE_RANGE_SE2_XY 1321 78 4.893728 +EDGE_RANGE_SE2_XY 1321 83 4.559607 +EDGE_RANGE_SE2_XY 1322 9 2.686006 +EDGE_RANGE_SE2_XY 1322 31 2.789072 +EDGE_RANGE_SE2_XY 1322 50 2.276729 +EDGE_RANGE_SE2_XY 1322 51 4.750058 +EDGE_RANGE_SE2_XY 1322 59 4.617884 +EDGE_RANGE_SE2_XY 1322 83 4.594979 +EDGE_RANGE_SE2_XY 1322 96 1.702682 +EDGE_RANGE_SE2_XY 1323 9 1.643811 +EDGE_RANGE_SE2_XY 1323 31 2.696296 +EDGE_RANGE_SE2_XY 1323 50 1.900392 +EDGE_RANGE_SE2_XY 1323 51 4.174018 +EDGE_RANGE_SE2_XY 1323 59 3.956789 +EDGE_RANGE_SE2_XY 1323 78 4.901255 +EDGE_RANGE_SE2_XY 1323 83 4.588878 +EDGE_RANGE_SE2_XY 1323 96 0.818561 +EDGE_RANGE_SE2_XY 1324 9 0.693152 +EDGE_RANGE_SE2_XY 1324 31 2.846821 +EDGE_RANGE_SE2_XY 1324 50 2.042286 +EDGE_RANGE_SE2_XY 1324 51 3.744549 +EDGE_RANGE_SE2_XY 1324 59 3.489403 +EDGE_RANGE_SE2_XY 1324 78 4.707126 +EDGE_RANGE_SE2_XY 1324 83 4.834197 +EDGE_RANGE_SE2_XY 1324 84 4.718835 +EDGE_RANGE_SE2_XY 1324 96 0.490146 +EDGE_RANGE_SE2_XY 1325 9 0.735768 +EDGE_RANGE_SE2_XY 1325 31 2.916759 +EDGE_RANGE_SE2_XY 1325 50 2.097159 +EDGE_RANGE_SE2_XY 1325 78 4.727067 +EDGE_RANGE_SE2_XY 1325 84 4.637786 +EDGE_RANGE_SE2_XY 1325 96 0.482140 +EDGE_RANGE_SE2_XY 1326 10 4.382307 +EDGE_RANGE_SE2_XY 1326 31 2.039593 +EDGE_RANGE_SE2_XY 1326 35 4.801250 +EDGE_RANGE_SE2_XY 1326 50 1.317585 +EDGE_RANGE_SE2_XY 1326 78 3.677293 +EDGE_RANGE_SE2_XY 1326 84 4.403040 +EDGE_RANGE_SE2_XY 1327 10 3.726408 +EDGE_RANGE_SE2_XY 1327 15 4.651796 +EDGE_RANGE_SE2_XY 1327 31 1.363600 +EDGE_RANGE_SE2_XY 1327 35 4.071566 +EDGE_RANGE_SE2_XY 1327 50 0.764624 +EDGE_RANGE_SE2_XY 1327 78 2.777668 +EDGE_RANGE_SE2_XY 1327 84 4.236059 +EDGE_RANGE_SE2_XY 1328 10 3.266707 +EDGE_RANGE_SE2_XY 1328 15 3.966440 +EDGE_RANGE_SE2_XY 1328 31 1.239508 +EDGE_RANGE_SE2_XY 1328 35 3.339891 +EDGE_RANGE_SE2_XY 1328 78 1.722278 +EDGE_RANGE_SE2_XY 1328 84 4.373435 +EDGE_RANGE_SE2_XY 1329 1 4.857089 +EDGE_RANGE_SE2_XY 1329 10 3.082365 +EDGE_RANGE_SE2_XY 1329 15 3.412508 +EDGE_RANGE_SE2_XY 1329 35 2.887182 +EDGE_RANGE_SE2_XY 1329 78 0.731531 +EDGE_RANGE_SE2_XY 1329 80 4.786360 +EDGE_RANGE_SE2_XY 1329 84 4.756380 +EDGE_RANGE_SE2_XY 1330 1 3.930274 +EDGE_RANGE_SE2_XY 1330 10 3.179603 +EDGE_RANGE_SE2_XY 1330 15 3.119878 +EDGE_RANGE_SE2_XY 1330 35 2.696723 +EDGE_RANGE_SE2_XY 1330 78 0.472705 +EDGE_RANGE_SE2_XY 1330 80 3.762533 +EDGE_RANGE_SE2_XY 1331 1 3.193595 +EDGE_RANGE_SE2_XY 1331 10 3.602300 +EDGE_RANGE_SE2_XY 1331 15 3.138672 +EDGE_RANGE_SE2_XY 1331 16 4.581880 +EDGE_RANGE_SE2_XY 1331 35 2.857320 +EDGE_RANGE_SE2_XY 1331 47 4.709894 +EDGE_RANGE_SE2_XY 1331 80 2.797682 +EDGE_RANGE_SE2_XY 1332 1 2.477752 +EDGE_RANGE_SE2_XY 1332 10 4.201915 +EDGE_RANGE_SE2_XY 1332 15 3.416803 +EDGE_RANGE_SE2_XY 1332 16 3.623625 +EDGE_RANGE_SE2_XY 1332 35 3.240164 +EDGE_RANGE_SE2_XY 1332 47 3.926398 +EDGE_RANGE_SE2_XY 1332 80 1.839594 +EDGE_RANGE_SE2_XY 1333 1 2.111500 +EDGE_RANGE_SE2_XY 1333 15 3.958009 +EDGE_RANGE_SE2_XY 1333 16 2.647397 +EDGE_RANGE_SE2_XY 1333 47 3.055708 +EDGE_RANGE_SE2_XY 1333 66 4.779509 +EDGE_RANGE_SE2_XY 1333 80 0.980256 +EDGE_RANGE_SE2_XY 1334 1 2.167013 +EDGE_RANGE_SE2_XY 1334 16 1.780753 +EDGE_RANGE_SE2_XY 1334 47 2.397760 +EDGE_RANGE_SE2_XY 1334 65 4.931424 +EDGE_RANGE_SE2_XY 1334 66 3.985168 +EDGE_RANGE_SE2_XY 1334 80 0.724967 +EDGE_RANGE_SE2_XY 1335 1 2.609227 +EDGE_RANGE_SE2_XY 1335 16 0.985547 +EDGE_RANGE_SE2_XY 1335 47 1.969476 +EDGE_RANGE_SE2_XY 1335 65 4.607382 +EDGE_RANGE_SE2_XY 1335 66 3.268911 +EDGE_RANGE_SE2_XY 1335 97 4.696691 +EDGE_RANGE_SE2_XY 1336 16 0.934458 +EDGE_RANGE_SE2_XY 1336 29 4.427099 +EDGE_RANGE_SE2_XY 1336 47 2.126840 +EDGE_RANGE_SE2_XY 1336 65 4.532947 +EDGE_RANGE_SE2_XY 1336 66 2.744377 +EDGE_RANGE_SE2_XY 1336 97 4.429963 +EDGE_RANGE_SE2_XY 1337 29 3.717733 +EDGE_RANGE_SE2_XY 1337 47 2.523124 +EDGE_RANGE_SE2_XY 1337 65 4.606941 +EDGE_RANGE_SE2_XY 1337 66 2.461384 +EDGE_RANGE_SE2_XY 1337 97 4.358465 +EDGE_RANGE_SE2_XY 1338 1 4.200360 +EDGE_RANGE_SE2_XY 1338 16 1.693329 +EDGE_RANGE_SE2_XY 1338 29 3.655275 +EDGE_RANGE_SE2_XY 1338 65 4.573998 +EDGE_RANGE_SE2_XY 1338 80 3.398462 +EDGE_RANGE_SE2_XY 1338 97 4.275359 +EDGE_RANGE_SE2_XY 1339 1 4.749187 +EDGE_RANGE_SE2_XY 1339 16 1.496289 +EDGE_RANGE_SE2_XY 1339 29 3.032828 +EDGE_RANGE_SE2_XY 1339 65 3.644016 +EDGE_RANGE_SE2_XY 1339 80 3.340824 +EDGE_RANGE_SE2_XY 1339 97 3.354871 +EDGE_RANGE_SE2_XY 1340 16 1.847517 +EDGE_RANGE_SE2_XY 1340 25 4.877191 +EDGE_RANGE_SE2_XY 1340 29 2.553053 +EDGE_RANGE_SE2_XY 1340 65 2.671614 +EDGE_RANGE_SE2_XY 1340 80 3.551347 +EDGE_RANGE_SE2_XY 1340 97 2.399654 +EDGE_RANGE_SE2_XY 1341 25 4.084240 +EDGE_RANGE_SE2_XY 1341 29 2.449121 +EDGE_RANGE_SE2_XY 1341 65 1.757213 +EDGE_RANGE_SE2_XY 1341 80 4.057183 +EDGE_RANGE_SE2_XY 1341 97 1.319348 +EDGE_RANGE_SE2_XY 1342 16 2.672827 +EDGE_RANGE_SE2_XY 1342 25 4.059641 +EDGE_RANGE_SE2_XY 1342 29 2.556585 +EDGE_RANGE_SE2_XY 1342 65 1.746948 +EDGE_RANGE_SE2_XY 1342 97 1.353580 +EDGE_RANGE_SE2_XY 1343 25 4.034602 +EDGE_RANGE_SE2_XY 1343 29 2.454697 +EDGE_RANGE_SE2_XY 1343 65 1.745343 +EDGE_RANGE_SE2_XY 1343 80 4.058935 +EDGE_RANGE_SE2_XY 1343 97 1.428100 +EDGE_RANGE_SE2_XY 1344 25 3.412954 +EDGE_RANGE_SE2_XY 1344 29 2.808827 +EDGE_RANGE_SE2_XY 1344 65 1.095652 +EDGE_RANGE_SE2_XY 1344 97 0.342025 +EDGE_RANGE_SE2_XY 1345 25 3.079802 +EDGE_RANGE_SE2_XY 1345 29 3.245204 +EDGE_RANGE_SE2_XY 1345 65 1.139171 +EDGE_RANGE_SE2_XY 1346 25 2.932933 +EDGE_RANGE_SE2_XY 1346 85 4.604348 +EDGE_RANGE_SE2_XY 1347 29 4.071790 +EDGE_RANGE_SE2_XY 1347 65 1.728125 +EDGE_RANGE_SE2_XY 1347 85 4.640534 +EDGE_RANGE_SE2_XY 1347 97 1.687093 +EDGE_RANGE_SE2_XY 1348 65 1.546169 +EDGE_RANGE_SE2_XY 1348 90 4.649750 +EDGE_RANGE_SE2_XY 1348 97 1.829555 +EDGE_RANGE_SE2_XY 1349 65 1.803035 +EDGE_RANGE_SE2_XY 1349 90 3.649408 +EDGE_RANGE_SE2_XY 1350 15 4.609724 +EDGE_RANGE_SE2_XY 1350 90 2.718690 +EDGE_RANGE_SE2_XY 1351 15 4.555639 +EDGE_RANGE_SE2_XY 1351 65 2.489262 +EDGE_RANGE_SE2_XY 1351 90 2.682685 +EDGE_RANGE_SE2_XY 1351 97 3.264832 +EDGE_RANGE_SE2_XY 1352 15 4.000885 +EDGE_RANGE_SE2_XY 1352 16 4.467877 +EDGE_RANGE_SE2_XY 1352 65 2.043105 +EDGE_RANGE_SE2_XY 1352 80 4.303348 +EDGE_RANGE_SE2_XY 1352 90 2.726582 +EDGE_RANGE_SE2_XY 1352 97 2.840721 +EDGE_RANGE_SE2_XY 1353 10 4.948487 +EDGE_RANGE_SE2_XY 1353 15 3.599795 +EDGE_RANGE_SE2_XY 1353 16 3.574354 +EDGE_RANGE_SE2_XY 1353 65 2.061990 +EDGE_RANGE_SE2_XY 1353 80 3.322781 +EDGE_RANGE_SE2_XY 1353 90 2.997433 +EDGE_RANGE_SE2_XY 1353 97 2.847851 +EDGE_RANGE_SE2_XY 1354 10 4.898578 +EDGE_RANGE_SE2_XY 1354 15 3.606691 +EDGE_RANGE_SE2_XY 1354 16 3.522111 +EDGE_RANGE_SE2_XY 1354 80 3.372243 +EDGE_RANGE_SE2_XY 1354 90 3.010177 +EDGE_RANGE_SE2_XY 1355 10 3.942320 +EDGE_RANGE_SE2_XY 1355 15 2.649168 +EDGE_RANGE_SE2_XY 1355 16 4.018532 +EDGE_RANGE_SE2_XY 1355 49 4.779926 +EDGE_RANGE_SE2_XY 1355 78 4.886214 +EDGE_RANGE_SE2_XY 1355 80 3.363783 +EDGE_RANGE_SE2_XY 1355 90 2.254187 +EDGE_RANGE_SE2_XY 1356 10 3.972717 +EDGE_RANGE_SE2_XY 1356 15 2.632941 +EDGE_RANGE_SE2_XY 1356 16 4.043918 +EDGE_RANGE_SE2_XY 1356 49 4.816956 +EDGE_RANGE_SE2_XY 1356 65 3.063433 +EDGE_RANGE_SE2_XY 1356 78 4.931605 +EDGE_RANGE_SE2_XY 1356 80 3.372789 +EDGE_RANGE_SE2_XY 1356 90 2.167781 +EDGE_RANGE_SE2_XY 1356 97 3.781812 +EDGE_RANGE_SE2_XY 1357 10 3.964178 +EDGE_RANGE_SE2_XY 1357 15 2.718064 +EDGE_RANGE_SE2_XY 1357 16 4.016297 +EDGE_RANGE_SE2_XY 1357 49 4.808647 +EDGE_RANGE_SE2_XY 1357 78 4.902641 +EDGE_RANGE_SE2_XY 1357 80 3.392429 +EDGE_RANGE_SE2_XY 1357 90 2.181649 +EDGE_RANGE_SE2_XY 1358 10 2.957251 +EDGE_RANGE_SE2_XY 1358 15 1.742184 +EDGE_RANGE_SE2_XY 1358 49 3.875357 +EDGE_RANGE_SE2_XY 1358 78 4.302516 +EDGE_RANGE_SE2_XY 1358 80 3.754249 +EDGE_RANGE_SE2_XY 1358 90 1.628989 +EDGE_RANGE_SE2_XY 1358 94 4.440784 +EDGE_RANGE_SE2_XY 1359 10 2.085710 +EDGE_RANGE_SE2_XY 1359 15 1.066483 +EDGE_RANGE_SE2_XY 1359 49 2.910015 +EDGE_RANGE_SE2_XY 1359 78 3.865689 +EDGE_RANGE_SE2_XY 1359 80 4.270140 +EDGE_RANGE_SE2_XY 1359 84 4.072615 +EDGE_RANGE_SE2_XY 1359 90 1.460415 +EDGE_RANGE_SE2_XY 1359 94 3.773133 +EDGE_RANGE_SE2_XY 1360 10 1.237812 +EDGE_RANGE_SE2_XY 1360 15 1.048828 +EDGE_RANGE_SE2_XY 1360 49 2.044883 +EDGE_RANGE_SE2_XY 1360 78 3.662762 +EDGE_RANGE_SE2_XY 1360 84 3.090259 +EDGE_RANGE_SE2_XY 1360 90 1.949964 +EDGE_RANGE_SE2_XY 1360 94 3.251638 +EDGE_RANGE_SE2_XY 1361 10 0.983106 +EDGE_RANGE_SE2_XY 1361 49 1.372085 +EDGE_RANGE_SE2_XY 1361 78 3.732033 +EDGE_RANGE_SE2_XY 1361 84 2.083371 +EDGE_RANGE_SE2_XY 1361 94 2.928544 +EDGE_RANGE_SE2_XY 1362 15 1.770330 +EDGE_RANGE_SE2_XY 1362 49 1.329447 +EDGE_RANGE_SE2_XY 1362 84 2.062741 +EDGE_RANGE_SE2_XY 1362 90 2.795144 +EDGE_RANGE_SE2_XY 1362 94 2.970880 +EDGE_RANGE_SE2_XY 1363 46 4.174225 +EDGE_RANGE_SE2_XY 1363 49 0.678812 +EDGE_RANGE_SE2_XY 1363 84 2.200221 +EDGE_RANGE_SE2_XY 1363 90 2.411322 +EDGE_RANGE_SE2_XY 1363 94 1.946718 +EDGE_RANGE_SE2_XY 1364 10 1.952734 +EDGE_RANGE_SE2_XY 1364 15 2.487303 +EDGE_RANGE_SE2_XY 1364 46 4.217262 +EDGE_RANGE_SE2_XY 1364 78 4.669685 +EDGE_RANGE_SE2_XY 1364 90 2.412675 +EDGE_RANGE_SE2_XY 1364 94 1.910240 +EDGE_RANGE_SE2_XY 1365 10 2.109893 +EDGE_RANGE_SE2_XY 1365 15 2.029562 +EDGE_RANGE_SE2_XY 1365 46 4.255456 +EDGE_RANGE_SE2_XY 1365 78 4.685046 +EDGE_RANGE_SE2_XY 1365 90 1.380978 +EDGE_RANGE_SE2_XY 1365 94 2.368749 +EDGE_RANGE_SE2_XY 1366 10 2.668657 +EDGE_RANGE_SE2_XY 1366 15 1.948528 +EDGE_RANGE_SE2_XY 1366 46 4.527511 +EDGE_RANGE_SE2_XY 1366 78 4.796299 +EDGE_RANGE_SE2_XY 1366 90 0.596671 +EDGE_RANGE_SE2_XY 1367 46 4.543098 +EDGE_RANGE_SE2_XY 1367 49 2.681213 +EDGE_RANGE_SE2_XY 1367 84 4.135763 +EDGE_RANGE_SE2_XY 1367 90 0.599362 +EDGE_RANGE_SE2_XY 1367 94 3.060569 +EDGE_RANGE_SE2_XY 1368 46 3.646936 +EDGE_RANGE_SE2_XY 1368 49 2.799532 +EDGE_RANGE_SE2_XY 1368 84 4.414422 +EDGE_RANGE_SE2_XY 1368 94 2.553201 +EDGE_RANGE_SE2_XY 1369 46 2.796971 +EDGE_RANGE_SE2_XY 1369 49 3.160349 +EDGE_RANGE_SE2_XY 1369 84 4.875968 +EDGE_RANGE_SE2_XY 1369 94 2.335935 +EDGE_RANGE_SE2_XY 1370 46 2.035401 +EDGE_RANGE_SE2_XY 1370 89 4.804087 +EDGE_RANGE_SE2_XY 1370 94 2.656819 +EDGE_RANGE_SE2_XY 1371 46 1.687738 +EDGE_RANGE_SE2_XY 1371 58 4.668054 +EDGE_RANGE_SE2_XY 1371 70 4.605942 +EDGE_RANGE_SE2_XY 1371 89 3.968371 +EDGE_RANGE_SE2_XY 1371 94 3.105973 +EDGE_RANGE_SE2_XY 1371 95 4.244433 +EDGE_RANGE_SE2_XY 1372 13 4.592349 +EDGE_RANGE_SE2_XY 1372 46 1.896162 +EDGE_RANGE_SE2_XY 1372 58 4.544023 +EDGE_RANGE_SE2_XY 1372 70 4.266893 +EDGE_RANGE_SE2_XY 1372 89 3.231734 +EDGE_RANGE_SE2_XY 1372 95 3.248003 +EDGE_RANGE_SE2_XY 1373 13 4.057195 +EDGE_RANGE_SE2_XY 1373 45 4.191862 +EDGE_RANGE_SE2_XY 1373 48 4.945683 +EDGE_RANGE_SE2_XY 1373 57 4.943160 +EDGE_RANGE_SE2_XY 1373 58 4.377364 +EDGE_RANGE_SE2_XY 1373 70 4.193707 +EDGE_RANGE_SE2_XY 1373 89 2.691704 +EDGE_RANGE_SE2_XY 1373 95 2.235713 +EDGE_RANGE_SE2_XY 1374 13 3.716875 +EDGE_RANGE_SE2_XY 1374 45 3.251690 +EDGE_RANGE_SE2_XY 1374 48 4.098178 +EDGE_RANGE_SE2_XY 1374 57 4.892008 +EDGE_RANGE_SE2_XY 1374 58 4.567664 +EDGE_RANGE_SE2_XY 1374 70 4.320005 +EDGE_RANGE_SE2_XY 1374 89 2.380732 +EDGE_RANGE_SE2_XY 1374 95 1.270554 +EDGE_RANGE_SE2_XY 1375 13 3.694200 +EDGE_RANGE_SE2_XY 1375 45 3.244103 +EDGE_RANGE_SE2_XY 1375 46 3.266506 +EDGE_RANGE_SE2_XY 1375 48 4.103353 +EDGE_RANGE_SE2_XY 1375 57 4.907065 +EDGE_RANGE_SE2_XY 1375 58 4.633657 +EDGE_RANGE_SE2_XY 1375 70 4.237048 +EDGE_RANGE_SE2_XY 1375 89 2.349426 +EDGE_RANGE_SE2_XY 1375 95 1.237825 +EDGE_RANGE_SE2_XY 1376 13 2.808372 +EDGE_RANGE_SE2_XY 1376 22 4.616708 +EDGE_RANGE_SE2_XY 1376 45 2.943319 +EDGE_RANGE_SE2_XY 1376 46 2.820006 +EDGE_RANGE_SE2_XY 1376 48 3.553011 +EDGE_RANGE_SE2_XY 1376 57 3.941669 +EDGE_RANGE_SE2_XY 1376 58 3.732885 +EDGE_RANGE_SE2_XY 1376 70 3.322513 +EDGE_RANGE_SE2_XY 1376 89 1.329525 +EDGE_RANGE_SE2_XY 1376 95 1.555888 +EDGE_RANGE_SE2_XY 1377 13 2.815194 +EDGE_RANGE_SE2_XY 1377 22 4.696165 +EDGE_RANGE_SE2_XY 1377 45 2.894795 +EDGE_RANGE_SE2_XY 1377 48 3.532175 +EDGE_RANGE_SE2_XY 1377 57 3.891660 +EDGE_RANGE_SE2_XY 1377 58 3.686718 +EDGE_RANGE_SE2_XY 1377 70 3.357645 +EDGE_RANGE_SE2_XY 1377 89 1.366141 +EDGE_RANGE_SE2_XY 1377 95 1.522455 +EDGE_RANGE_SE2_XY 1378 13 2.819689 +EDGE_RANGE_SE2_XY 1378 22 4.664477 +EDGE_RANGE_SE2_XY 1378 45 2.953564 +EDGE_RANGE_SE2_XY 1378 46 2.859975 +EDGE_RANGE_SE2_XY 1378 48 3.500173 +EDGE_RANGE_SE2_XY 1378 57 3.865852 +EDGE_RANGE_SE2_XY 1378 58 3.736254 +EDGE_RANGE_SE2_XY 1378 70 3.303872 +EDGE_RANGE_SE2_XY 1378 89 1.374429 +EDGE_RANGE_SE2_XY 1378 95 1.540802 +EDGE_RANGE_SE2_XY 1379 13 1.847208 +EDGE_RANGE_SE2_XY 1379 22 3.894242 +EDGE_RANGE_SE2_XY 1379 45 2.913096 +EDGE_RANGE_SE2_XY 1379 46 2.849935 +EDGE_RANGE_SE2_XY 1379 48 3.271577 +EDGE_RANGE_SE2_XY 1379 57 2.912287 +EDGE_RANGE_SE2_XY 1379 58 2.832345 +EDGE_RANGE_SE2_XY 1379 70 2.469029 +EDGE_RANGE_SE2_XY 1379 89 0.417632 +EDGE_RANGE_SE2_XY 1380 13 1.037138 +EDGE_RANGE_SE2_XY 1380 22 3.291561 +EDGE_RANGE_SE2_XY 1380 45 3.157722 +EDGE_RANGE_SE2_XY 1380 46 3.094880 +EDGE_RANGE_SE2_XY 1380 48 3.177119 +EDGE_RANGE_SE2_XY 1380 56 4.716572 +EDGE_RANGE_SE2_XY 1380 57 1.836589 +EDGE_RANGE_SE2_XY 1380 58 2.020146 +EDGE_RANGE_SE2_XY 1380 70 1.548348 +EDGE_RANGE_SE2_XY 1381 13 0.809685 +EDGE_RANGE_SE2_XY 1381 22 2.856074 +EDGE_RANGE_SE2_XY 1381 32 4.941014 +EDGE_RANGE_SE2_XY 1381 45 3.747877 +EDGE_RANGE_SE2_XY 1381 46 3.650757 +EDGE_RANGE_SE2_XY 1381 48 3.480027 +EDGE_RANGE_SE2_XY 1381 56 3.723543 +EDGE_RANGE_SE2_XY 1381 57 0.866828 +EDGE_RANGE_SE2_XY 1381 58 1.462096 +EDGE_RANGE_SE2_XY 1381 70 1.079571 +EDGE_RANGE_SE2_XY 1382 22 2.689251 +EDGE_RANGE_SE2_XY 1382 32 4.130553 +EDGE_RANGE_SE2_XY 1382 43 4.340263 +EDGE_RANGE_SE2_XY 1382 48 3.966366 +EDGE_RANGE_SE2_XY 1382 56 2.741614 +EDGE_RANGE_SE2_XY 1382 58 1.492160 +EDGE_RANGE_SE2_XY 1382 70 1.291041 +EDGE_RANGE_SE2_XY 1383 19 4.913324 +EDGE_RANGE_SE2_XY 1383 22 3.064006 +EDGE_RANGE_SE2_XY 1383 32 3.272725 +EDGE_RANGE_SE2_XY 1383 43 3.761352 +EDGE_RANGE_SE2_XY 1383 53 4.890964 +EDGE_RANGE_SE2_XY 1383 56 1.761020 +EDGE_RANGE_SE2_XY 1384 13 2.426031 +EDGE_RANGE_SE2_XY 1384 19 4.906882 +EDGE_RANGE_SE2_XY 1384 22 2.996916 +EDGE_RANGE_SE2_XY 1384 32 3.334292 +EDGE_RANGE_SE2_XY 1384 43 3.752447 +EDGE_RANGE_SE2_XY 1384 48 4.598472 +EDGE_RANGE_SE2_XY 1384 53 4.880146 +EDGE_RANGE_SE2_XY 1384 56 1.717764 +EDGE_RANGE_SE2_XY 1384 57 1.159164 +EDGE_RANGE_SE2_XY 1384 58 2.091874 +EDGE_RANGE_SE2_XY 1384 70 2.085685 +EDGE_RANGE_SE2_XY 1384 89 3.653386 +EDGE_RANGE_SE2_XY 1385 2 5.016015 +EDGE_RANGE_SE2_XY 1385 13 2.276796 +EDGE_RANGE_SE2_XY 1385 19 4.915156 +EDGE_RANGE_SE2_XY 1385 22 2.150653 +EDGE_RANGE_SE2_XY 1385 32 2.764067 +EDGE_RANGE_SE2_XY 1385 43 2.868866 +EDGE_RANGE_SE2_XY 1385 45 4.756360 +EDGE_RANGE_SE2_XY 1385 48 3.991789 +EDGE_RANGE_SE2_XY 1385 53 3.900859 +EDGE_RANGE_SE2_XY 1385 56 2.128867 +EDGE_RANGE_SE2_XY 1385 57 1.578685 +EDGE_RANGE_SE2_XY 1385 89 3.735164 +EDGE_RANGE_SE2_XY 1386 2 4.026168 +EDGE_RANGE_SE2_XY 1386 13 2.628876 +EDGE_RANGE_SE2_XY 1386 22 1.480637 +EDGE_RANGE_SE2_XY 1386 32 2.461866 +EDGE_RANGE_SE2_XY 1386 43 2.214441 +EDGE_RANGE_SE2_XY 1386 45 4.482753 +EDGE_RANGE_SE2_XY 1386 48 3.588628 +EDGE_RANGE_SE2_XY 1386 53 2.901227 +EDGE_RANGE_SE2_XY 1386 81 4.833115 +EDGE_RANGE_SE2_XY 1386 86 4.383662 +EDGE_RANGE_SE2_XY 1386 89 4.082088 +EDGE_RANGE_SE2_XY 1386 92 4.976972 +EDGE_RANGE_SE2_XY 1387 2 3.954849 +EDGE_RANGE_SE2_XY 1387 13 2.688291 +EDGE_RANGE_SE2_XY 1387 22 1.484809 +EDGE_RANGE_SE2_XY 1387 45 4.487653 +EDGE_RANGE_SE2_XY 1387 48 3.572379 +EDGE_RANGE_SE2_XY 1387 53 2.941519 +EDGE_RANGE_SE2_XY 1387 56 2.762483 +EDGE_RANGE_SE2_XY 1387 57 2.380357 +EDGE_RANGE_SE2_XY 1387 58 3.743315 +EDGE_RANGE_SE2_XY 1387 70 3.613687 +EDGE_RANGE_SE2_XY 1387 81 4.857331 +EDGE_RANGE_SE2_XY 1387 86 4.380806 +EDGE_RANGE_SE2_XY 1387 89 4.040381 +EDGE_RANGE_SE2_XY 1387 92 4.991979 +EDGE_RANGE_SE2_XY 1388 2 4.523111 +EDGE_RANGE_SE2_XY 1388 13 1.836420 +EDGE_RANGE_SE2_XY 1388 22 0.794541 +EDGE_RANGE_SE2_XY 1388 45 3.543186 +EDGE_RANGE_SE2_XY 1388 48 2.670529 +EDGE_RANGE_SE2_XY 1388 53 3.413888 +EDGE_RANGE_SE2_XY 1388 57 2.103458 +EDGE_RANGE_SE2_XY 1388 58 3.347430 +EDGE_RANGE_SE2_XY 1388 70 3.107432 +EDGE_RANGE_SE2_XY 1388 81 4.878707 +EDGE_RANGE_SE2_XY 1388 86 3.791420 +EDGE_RANGE_SE2_XY 1388 89 3.240185 +EDGE_RANGE_SE2_XY 1388 92 4.346393 +EDGE_RANGE_SE2_XY 1388 95 5.000533 +EDGE_RANGE_SE2_XY 1389 13 1.297774 +EDGE_RANGE_SE2_XY 1389 45 2.606249 +EDGE_RANGE_SE2_XY 1389 48 1.786112 +EDGE_RANGE_SE2_XY 1389 57 2.353216 +EDGE_RANGE_SE2_XY 1389 58 3.433081 +EDGE_RANGE_SE2_XY 1389 70 3.000678 +EDGE_RANGE_SE2_XY 1389 86 3.398353 +EDGE_RANGE_SE2_XY 1389 89 2.427415 +EDGE_RANGE_SE2_XY 1389 92 3.855912 +EDGE_RANGE_SE2_XY 1389 95 3.920745 +EDGE_RANGE_SE2_XY 1390 13 1.331042 +EDGE_RANGE_SE2_XY 1390 22 1.082932 +EDGE_RANGE_SE2_XY 1390 32 4.459106 +EDGE_RANGE_SE2_XY 1390 43 4.060653 +EDGE_RANGE_SE2_XY 1390 45 2.534467 +EDGE_RANGE_SE2_XY 1390 48 1.799172 +EDGE_RANGE_SE2_XY 1390 53 4.029391 +EDGE_RANGE_SE2_XY 1390 56 4.317862 +EDGE_RANGE_SE2_XY 1390 57 2.296033 +EDGE_RANGE_SE2_XY 1390 58 3.366784 +EDGE_RANGE_SE2_XY 1390 70 3.022431 +EDGE_RANGE_SE2_XY 1390 89 2.487879 +EDGE_RANGE_SE2_XY 1390 95 3.991291 +EDGE_RANGE_SE2_XY 1391 13 0.370762 +EDGE_RANGE_SE2_XY 1391 32 4.641467 +EDGE_RANGE_SE2_XY 1391 43 4.490879 +EDGE_RANGE_SE2_XY 1391 45 3.066710 +EDGE_RANGE_SE2_XY 1391 46 4.369944 +EDGE_RANGE_SE2_XY 1391 56 3.959121 +EDGE_RANGE_SE2_XY 1391 57 1.378124 +EDGE_RANGE_SE2_XY 1391 58 2.404784 +EDGE_RANGE_SE2_XY 1391 70 2.059496 +EDGE_RANGE_SE2_XY 1391 89 1.828759 +EDGE_RANGE_SE2_XY 1391 95 3.897963 +EDGE_RANGE_SE2_XY 1392 32 5.021301 +EDGE_RANGE_SE2_XY 1392 46 3.586325 +EDGE_RANGE_SE2_XY 1392 56 3.750666 +EDGE_RANGE_SE2_XY 1392 57 0.886645 +EDGE_RANGE_SE2_XY 1392 58 1.492320 +EDGE_RANGE_SE2_XY 1392 70 1.001937 +EDGE_RANGE_SE2_XY 1392 89 1.614526 +EDGE_RANGE_SE2_XY 1392 95 4.064508 +EDGE_RANGE_SE2_XY 1393 46 2.914115 +EDGE_RANGE_SE2_XY 1393 56 3.804979 +EDGE_RANGE_SE2_XY 1393 58 0.574100 +EDGE_RANGE_SE2_XY 1393 70 0.135985 +EDGE_RANGE_SE2_XY 1393 89 2.083559 +EDGE_RANGE_SE2_XY 1393 94 4.319978 +EDGE_RANGE_SE2_XY 1393 95 4.477080 +EDGE_RANGE_SE2_XY 1394 46 2.428082 +EDGE_RANGE_SE2_XY 1394 49 4.990984 +EDGE_RANGE_SE2_XY 1394 56 4.213011 +EDGE_RANGE_SE2_XY 1394 94 3.513243 +EDGE_RANGE_SE2_XY 1395 46 2.312226 +EDGE_RANGE_SE2_XY 1395 49 4.082538 +EDGE_RANGE_SE2_XY 1395 56 4.715526 +EDGE_RANGE_SE2_XY 1395 84 4.683636 +EDGE_RANGE_SE2_XY 1395 94 2.645193 +EDGE_RANGE_SE2_XY 1396 46 2.607986 +EDGE_RANGE_SE2_XY 1396 49 3.087157 +EDGE_RANGE_SE2_XY 1396 84 3.732940 +EDGE_RANGE_SE2_XY 1396 94 1.890706 +EDGE_RANGE_SE2_XY 1397 10 4.471345 +EDGE_RANGE_SE2_XY 1397 46 3.189215 +EDGE_RANGE_SE2_XY 1397 49 2.253090 +EDGE_RANGE_SE2_XY 1397 84 2.745449 +EDGE_RANGE_SE2_XY 1397 90 4.590416 +EDGE_RANGE_SE2_XY 1397 94 1.619757 +EDGE_RANGE_SE2_XY 1398 10 4.444648 +EDGE_RANGE_SE2_XY 1398 46 3.233763 +EDGE_RANGE_SE2_XY 1398 49 2.217796 +EDGE_RANGE_SE2_XY 1398 57 4.957315 +EDGE_RANGE_SE2_XY 1398 58 3.649264 +EDGE_RANGE_SE2_XY 1398 70 3.948844 +EDGE_RANGE_SE2_XY 1398 84 2.730233 +EDGE_RANGE_SE2_XY 1398 90 4.637887 +EDGE_RANGE_SE2_XY 1398 94 1.626878 +EDGE_RANGE_SE2_XY 1399 10 4.087325 +EDGE_RANGE_SE2_XY 1399 15 4.701102 +EDGE_RANGE_SE2_XY 1399 46 2.575736 +EDGE_RANGE_SE2_XY 1399 49 1.838579 +EDGE_RANGE_SE2_XY 1399 58 3.914756 +EDGE_RANGE_SE2_XY 1399 70 4.151095 +EDGE_RANGE_SE2_XY 1399 84 2.909338 +EDGE_RANGE_SE2_XY 1399 90 3.675554 +EDGE_RANGE_SE2_XY 1399 94 0.549531 +EDGE_RANGE_SE2_XY 1400 10 3.890546 +EDGE_RANGE_SE2_XY 1400 15 4.139046 +EDGE_RANGE_SE2_XY 1400 46 2.216355 +EDGE_RANGE_SE2_XY 1400 49 1.933057 +EDGE_RANGE_SE2_XY 1400 58 4.325068 +EDGE_RANGE_SE2_XY 1400 70 4.497607 +EDGE_RANGE_SE2_XY 1400 84 3.429599 +EDGE_RANGE_SE2_XY 1400 90 2.823162 diff --git a/landmark_plot.png b/landmark_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..533157b3ac909fc77f4815a239cb7c8cd60f549a GIT binary patch literal 29519 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/main.m b/main.m new file mode 100644 index 0000000..5375881 --- /dev/null +++ b/main.m @@ -0,0 +1,76 @@ +close all +clear +clc +clf + +addpath 'tools/g2o_wrapper' +addpath 'tools/visualization' +addpath 'tools/my_visualization' +addpath 'tools/algorithms' +source 'tools/algorithms/initGuess.m' +source 'tools/algorithms/leastSquares.m' +source 'tools/algorithms/LeastSquaresUtils.m' +source 'tools/algorithms/evaluate.m' +source 'tools/algorithms/tuning.m' +source 'tools/my_visualization/myPlot.m' + +#get data +data_path="data"; +dataset_gt="slam2d_range_only_ground_truth.g2o"; +dataset_ig="slam2d_range_only_initial_guess.g2o"; + +printf("\n\nLoading Data...\n") +[gt_landmarks, gt_poses, gt_transitions, gt_observations] = loadG2o(fullfile(data_path, dataset_gt)); +[~,poses,transitions,observations] = loadG2o(fullfile(data_path, dataset_ig)); + +num_landmarks=length(gt_landmarks); +num_poses=length(poses); +num_transitions=length(transitions); +num_observations=length(observations); +printf("number of landmarks: %d\nnumber of poses: %d\nnumber of measurements: %d\n",num_landmarks,num_poses,num_observations) + + +#Set some parameters +first_pose_id=poses(1).id; +params.first_pose_id=first_pose_id; + +params.kernel_threshold=2.0; +params.num_iterations=25; +params.damping=0.1; +printf("parameters:\n") +params + +#----INITIAL GUESS---- +printf("\n Initial Guess...\n") +[landmark_positions,robot_poses,land_observations,land_id_to_idx]=initGuess(observations,poses,transitions,params); +init_guess=land_observations; +printf("Error in landmark position using initial guess is %f\n",evaluate(gt_landmarks,land_observations,land_id_to_idx)); + + +#---LEAST SQUARE OPTIMIZATION------- +printf("\n Least squares using %d iterations...\n",params.num_iterations) +[XR,XL]=leastSquares(land_observations,robot_poses,landmark_positions,poses,gt_landmarks,params,land_id_to_idx); + +printf("error in landmark position after least square is %f\n",evaluate(gt_landmarks,XL,land_id_to_idx)); + +#tuning parameters +#this function was used to test if changing parameters of LS (kernel_threshold, damping) had some effect +#[XR,XL]=tuning(land_observations,robot_poses,landmark_positions,poses,gt_landmarks,params,land_id_to_idx); + + +#----PLotting---- +printf("\nPlotting...\n") + +#to plot estimated landmarks and ground truth with labels +#this functions however don't use traditional octave plot so the legend of the other plot will be wrong +#drawLandmarkWithLabel(XL,gt_landmarks,radius=0.1) + +#get ground truth poses in matrix form, so it's easier to plot and legend work +gt_matrix_poses=zeros(3, 3, length(gt_poses)); +for i=1:length(gt_poses) + gt_matrix_poses(:,:,i)=v2t([gt_poses(i).x gt_poses(i).y gt_poses(i).theta]); +endfor + +#plot trajectory and landmarks +myPlot(robot_poses,XR,gt_matrix_poses,init_guess,XL,gt_landmarks) + diff --git a/tools/algorithms/LeastSquaresUtils.m b/tools/algorithms/LeastSquaresUtils.m new file mode 100644 index 0000000..a9dd545 --- /dev/null +++ b/tools/algorithms/LeastSquaresUtils.m @@ -0,0 +1,100 @@ +#size of pose and landmarks +global pose_dim=3; +global landmark_dim=2; + +#matrix of measurements +#row:poses; columns:landmarks; +#so A(pose,landmark) correspond to the measure +#used also to test if a different order of the measurements change the Least squares results +function A=get_association_matrix(land_observations,num_poses,params) + landmark_num=length(land_observations); + A = ones(num_poses,landmark_num)*-1; + first_pose_id=params.first_pose_id; + + #for each landmark + for l_idx=1:length(land_observations) + land_obs=land_observations(l_idx); + #for each measure from the poses + for m=1:length(land_obs.measurements) + measurement=land_obs.measurements(m); + pose_id=measurement.obs_pose_id; + pose_idx=pose_id-first_pose_id+1; + z=measurement.obs_range; + A(pose_idx,l_idx)=z; + endfor + endfor +endfunction + +#retrieve index from H matrix +function v_idx=poseMatrixIndex(pose_index, num_poses, num_landmarks) + global pose_dim; + global landmark_dim; + + if (pose_index>num_poses) + printf("error matrix index: pose idx > num_poses\n") + v_idx=-1; + return; + endif; + v_idx=1+(pose_index-1)*pose_dim; +endfunction; + +function v_idx=landmarkMatrixIndex(landmark_index, num_poses, num_landmarks) + global pose_dim; + global landmark_dim; + if (landmark_index>num_landmarks) + printf("error matrix index: land idx > num_landmark\n") + v_idx=-1; + return; + endif; + v_idx=1 + (num_poses)*pose_dim + (landmark_index-1) * landmark_dim; +endfunction; + +#boxplus operator to add perturbation in manifold space +function [XR, XL]=boxPlus(XR, XL, num_poses, num_landmarks, dx) + global pose_dim; + global landmark_dim; + for(pose_index=1:num_poses) + pose_matrix_index=poseMatrixIndex(pose_index, num_poses, num_landmarks); + dxr=dx(pose_matrix_index:pose_matrix_index+pose_dim-1); + #for poses we can't do simple addition, here is why boxplus is needed + XR(:,:,pose_index)=v2t(dxr)*XR(:,:,pose_index); + + endfor; + for(landmark_index=1:num_landmarks) + #this is needed because some landmarks were not considered + if landmark_index<=length(XL) && XL(landmark_index).pos + landmark_matrix_index=landmarkMatrixIndex(landmark_index, num_poses, num_landmarks); + dxl=dx(landmark_matrix_index:landmark_matrix_index+landmark_dim-1,:); + #nothing special needed for landmark + XL(landmark_index).pos+=dxl; + endif + endfor; +endfunction; + + +function [e, Jr, Jl] = errorAndJacobian(Xr, Xl, z) + R = Xr(1:2,1:2); + t = Xr(1:2,3); + + z_hat = norm( R' * (Xl-t)); + #error + #estimated measurement - actual measurement + e = z_hat - z; + + #computing jacobian + p=R' * (Xl-t); + c=Xr(1,1); s=Xr(2,1); + x=Xr(1,3); y=Xr(2,3); + xl=Xl(1); yl=Xl(2); + + #derivative of error with respect to state + f1=(c*x-c*xl+s*y-s*yl); #recurrent term + f2=(-s*x+s*xl+c*y-c*yl); #other recurrent term + #Jr(3) is 0, error do not depends from angle! + #could have done with syms variables, but with this is faster and I forgot to use it before computing everything by hand + + Jr=(1/norm(p)) * [f1*c+f2*-s, f1*s+f2*c, f1*( (-x*s)+(xl*s)+(y*c)+(-yl*c)) + f2*( (-x*c)+(xl*c)+(-y*s)+(yl*s)) ]; + Jl=(1/norm(p)) * [f1*-c+f2*s f1*-s+f2*-c]; + + +endfunction diff --git a/tools/algorithms/estimateLandmarkPosition.m b/tools/algorithms/estimateLandmarkPosition.m new file mode 100644 index 0000000..60c8f2f --- /dev/null +++ b/tools/algorithms/estimateLandmarkPosition.m @@ -0,0 +1,38 @@ + +#lateration algorithm to estimate position fo landmark +#is a range based triangulation algorithm +#different implementation possible, +#an implementation can be found here http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.933&rep=rep1&type=pdf +#at page 504 + +function [p1,p2]=estimateLandmarkPosition(measurements,poses) + + num_measure=length(measurements); + + obs_pose_id=measurements(num_measure).obs_pose_id; + last_pose=poseFromId(obs_pose_id,poses); + last_x = last_pose.x; + last_y = last_pose.y; + last_r = measurements(num_measure).obs_range; + + A = zeros(num_measure-1, 2); + b = zeros(num_measure-1, 1); + + for k=1:num_measure-1 + + obs_pose_id=measurements(k).obs_pose_id; + pose=poseFromId(obs_pose_id,poses); + x = pose.x; + y = pose.y; + r = measurements(k).obs_range; + + A(k,:) = 2 * [(x - last_x) (y - last_y)]; + b(k,:) = [x^2-last_x^2 + y^2-last_y^2 + last_r^2-r^2]; + endfor + + landmark_position = (A'*A) \ A'*b; + + p1=landmark_position(1); + p2=landmark_position(2); + +end diff --git a/tools/algorithms/evaluate.m b/tools/algorithms/evaluate.m new file mode 100644 index 0000000..95d730c --- /dev/null +++ b/tools/algorithms/evaluate.m @@ -0,0 +1,24 @@ +1; +function err=evaluate(gt_landmarks, est_landmarks,land_id_to_idx) + # error is computed as simply the distance between the correct + # landmark and the estimated position + err=0; + for i=1:length(gt_landmarks) + #for each landmark retrieving original index and compute error + gt_id=gt_landmarks(i).id; + est_idx=land_id_to_idx(gt_id); + if gt_id==est_landmarks(est_idx).l_id + gt_pos=[ gt_landmarks(i).x_pose; gt_landmarks(i).y_pose]; + est_pos=est_landmarks(est_idx).pos; + if est_pos + err+=norm(gt_pos -est_pos); + endif + else + #should not happen + printf("ERROR! indices do not correspond") + printf(" %d %d\n",gt_id,est_landmarks(est_idx).l_id) + endif + endfor + #computing final error + err=err/length(est_landmarks); +endfunction \ No newline at end of file diff --git a/tools/algorithms/initGuess.m b/tools/algorithms/initGuess.m new file mode 100644 index 0000000..f1d6d00 --- /dev/null +++ b/tools/algorithms/initGuess.m @@ -0,0 +1,86 @@ +source 'tools/utilities/geometry_helpers_2d.m' + +function [landmark_positions,robot_poses,land_observations,l_id_to_idx] = initGuess(observations,poses,transitions,params) + #array of landmark_observations + #each landmark_observations is an array fo measures (pose,range) + + first_pose_id=params.first_pose_id; + + land_observations=[]; + + #used to transform landmark id into indeces 1...n + l_id_to_idx = ones(10000, 1)*-1; + + #index for the landmarks + l_idx=1; + + #building a structure that contains for each landmark all the measurement related to it. + for i=1:length(observations) + pose_id=observations(i).pose_id; + landmarks_observed=observations(i).observation; + for j=1:length(landmarks_observed) + observation=landmarks_observed(j); + + #pose can be retrieved by the poses array, index is pose_id-first_pose_id+1 + #obs_pose=poses(pose_id-first_pose_id+1); + + #i want the landmarks to be stored independently from id but accessed fast + l_id=observation.id; + if l_id_to_idx(l_id)==-1 + l_id_to_idx(l_id)=l_idx; + land_observations(l_id_to_idx(l_id)).l_id=l_id; + l_idx=l_idx+1; + endif + + #adding this measurement + land_observations(l_id_to_idx(l_id)).measurements(end+1).obs_pose_id=pose_id; + land_observations(l_id_to_idx(l_id)).measurements(end).obs_range=observation.range; + endfor + endfor + + + + #for each landmark with 3 or more measurements estimate position + for i=1:length(land_observations) + measurements=land_observations(i).measurements; + + if length(measurements)>=3 + [px py]=estimateLandmarkPosition(measurements,poses); + land_observations(i).pos=[px; py]; + landmark_positions(end+1).id=i; + landmark_positions(end).pos=[px; py]; + endif + + endfor + + #get poses in matrix form + + # no real difference in using simply the poses or computing the trajectory using the transitions + #{ + #compute trajectory using poses + robot_poses=zeros(3, 3, length(poses)); + for i=1:length(poses) + robot_poses(:,:,i)=v2t([poses(i).x poses(i).y poses(i).theta]); + endfor + #} + + #compute trajectory using transitions + robot_poses=zeros(3, 3, length(poses)); + robot_poses(:,:,1)=v2t([poses(1).x poses(1).y poses(1).theta]); + prev_pose=robot_poses(:,:,1); + for i=1:length(transitions) + v=transitions(i).v; + displacement=v2t([v(1) v(2) v(3)]); + next_pose=prev_pose*displacement; + prev_pose=next_pose; + robot_poses(:,:,i+1)=next_pose; + endfor + + + +endfunction + + + + + diff --git a/tools/algorithms/leastSquares.m b/tools/algorithms/leastSquares.m new file mode 100644 index 0000000..41af961 --- /dev/null +++ b/tools/algorithms/leastSquares.m @@ -0,0 +1,117 @@ +global pose_dim = 3; +global landmark_dim = 2; + +function [XR,XL]=leastSquares(land_observations,robot_poses,landmark_positions,poses,gt_landmarks,params,land_id_to_idx) + global pose_dim; + global landmark_dim; + #parameters + kernel_threshold=params.kernel_threshold; + num_iterations=params.num_iterations; + damping=params.damping; + + #system parameters + num_landmarks=length(land_observations); + num_poses=length(robot_poses); + system_size=pose_dim*num_poses+landmark_dim*num_landmarks; + + chi_stats = zeros(1, num_iterations); + num_inliers = zeros(1, num_iterations); + + + XR=robot_poses; + XL=land_observations; + first_pose_id=params.first_pose_id; + #I tried to use an association matrix only to check if the order of the measurements + #changed something + #A=get_association_matrix(land_observations,num_poses,params); + #to be used using: + #{ + # for each measurement + for p_idx=1:length(A) + for l_obs=1:length(land_observations) + Xr=XR(:,:,p_idx); + Xl=XL(l_obs).pos; + z=A(p_idx,l_obs); + #} + # + + for iteration=1:num_iterations + H=zeros(system_size, system_size); + b=zeros(system_size,1); + chi_stats(iteration) = 0; + + #this two loops iterate through all the measurements + for l_obs=1:length(land_observations) + land_obs=land_observations(l_obs); + if l_obs<=length(XL) + for m=1:length(land_obs.measurements) + + #get needed data for this measurement + measurement=land_obs.measurements(m); + + #pose data + pose_id=measurement.obs_pose_id; + p_idx=pose_id-first_pose_id+1; + Xr=XR(:,:,p_idx); + + #landmark data + l_idx=land_id_to_idx(land_obs.l_id); + Xl=XL(l_idx).pos; + + #range measured + z=measurement.obs_range; + + if Xl && z>0 + #compute error and jacobian + [e,Jr,Jl] = errorAndJacobian(Xr, Xl, z); + chi=e'*e; + if (chi>kernel_threshold) + e*=sqrt(kernel_threshold/chi); + chi=kernel_threshold; + else + num_inliers(iteration)++; + endif + chi_stats(iteration) += chi; + + #Update H and B + pose_matrix_idx=poseMatrixIndex(p_idx, num_poses, num_landmarks); + landmark_matrix_idx=landmarkMatrixIndex(l_idx, num_poses, num_landmarks); + + H(pose_matrix_idx:pose_matrix_idx+pose_dim-1, + pose_matrix_idx:pose_matrix_idx+pose_dim-1) += (Jr'*Jr); + + H(pose_matrix_idx:pose_matrix_idx+pose_dim-1, + landmark_matrix_idx:landmark_matrix_idx+landmark_dim-1) += (Jr'*Jl); + + H(landmark_matrix_idx:landmark_matrix_idx+landmark_dim-1, + landmark_matrix_idx:landmark_matrix_idx+landmark_dim-1) += (Jl'*Jl); + + H(landmark_matrix_idx:landmark_matrix_idx+landmark_dim-1, + pose_matrix_idx:pose_matrix_idx+pose_dim-1) += (Jr'*Jl)'; + + b(pose_matrix_idx:pose_matrix_idx+pose_dim-1) += (Jr'*e); + b(landmark_matrix_idx:landmark_matrix_idx+landmark_dim-1) += (Jl'*e); + endif + endfor + endif + endfor + + + + H += eye(system_size)*damping; + dx = zeros(system_size, 1); + + #solve linear system + dx(pose_dim+1:end) = -(H(pose_dim+1:end, pose_dim+1:end) \ b(pose_dim+1:end, 1)); + #apply found perturbation + [XR, XL] = boxPlus(XR, XL, num_poses, num_landmarks, dx); + + #print error update + if mod(iteration,5)==0 + printf("error in landmark position after %d iterations is %f\n",iteration,evaluate(gt_landmarks,XL,land_id_to_idx)); + endif + + endfor + +endfunction + diff --git a/tools/algorithms/poseFromId.m b/tools/algorithms/poseFromId.m new file mode 100644 index 0000000..94bdd41 --- /dev/null +++ b/tools/algorithms/poseFromId.m @@ -0,0 +1,16 @@ +function pose=poseFromId(id,poses) + #cost O(1) + #this work because each pose has id = 1 + previous index + first_id=poses(1).id; + pose=poses(id-first_id+1); + + #{ + #real loop used to check for real if they correspond, now not needed + #it will be needed if the pose has not id=previous_id+1 + for i=1:length(poses) + if poses(i).id==id + pose=poses(i); + endif + endfor + #} +endfunction diff --git a/tools/algorithms/tuning.m b/tools/algorithms/tuning.m new file mode 100644 index 0000000..077014e --- /dev/null +++ b/tools/algorithms/tuning.m @@ -0,0 +1,25 @@ +1; +function kernel_threshold=tuning(land_observations,robot_poses,landmark_positions,poses,gt_landmarks,params) + #greedy parameter tuning + #choose parameter p and increment + #if new parameter improve result use it and test p+increment + #otherwise reduce increment and p=p-increment + params.damping=0.05; + best_err=100000; + incr=0.5; + iterations=3; + for i=1:iterations + printf("trying damp=%f\n",params.damping) + [XR,XL]=leastSquares(land_observations,robot_poses,landmark_positions,poses,gt_landmarks,params); + err=evaluate(gt_landmarks,XL) + if err. +% +% http://www.petercorke.com + +function q = Quaternion(a1, a2) + + + if nargin == 0, + q.s = 1; + q.v = [0 0 0]; + q = class (q, 'Quaternion'); + + elseif nargin == 1 + if isa(a1, 'Quaternion') + q = a1; + q = class(q, 'Quaternion'); + elseif isreal (a1) && size(a1) == 1 + q.s = a1(1); + q.v = [0,0,0]; + q = class(q, 'Quaternion'); + elseif isreal (a1) && all (size (a1) == [1 3]) # Quaternion (vector part) + q.s = 0; + q.v = a1(1:3); + q = class(q, 'Quaternion'); + elseif all(size(a1) == [3 3]) + q = Quaternion( tr2q(a1) ); + elseif all(size(a1) == [4 4]) + q = Quaternion( tr2q(a1(1:3,1:3)) ); + elseif all(size(a1) == [1 4]) + q.s = a1(1); + q.v = a1(2:4); + q = class(q, 'Quaternion'); + else + error('unknown dimension of input'); + end + elseif nargin == 2 + if isscalar(a1) && isvector(a2) + q.s = cos(a1/2); + q.v = (sin(a1/2)*unit(a2(:)')); + q = class(q, 'Quaternion'); + end + end +endfunction +%TR2Q Convert homogeneous transform to a unit-quaternion +% +% Q = tr2q(T) +% +% Return a unit quaternion corresponding to the rotational part of the +% homogeneous transform T. +% +% See also Q2TR + + +% Ryan Steidnl based on Robotics Toolbox for MATLAB (v6 and v9) +% + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function q = tr2q(t) + qs = sqrt(trace(t)+1)/2.0; + kx = t(3,2) - t(2,3); % Oz - Ay + ky = t(1,3) - t(3,1); % Ax - Nz + kz = t(2,1) - t(1,2); % Ny - Ox + + if (t(1,1) >= t(2,2)) & (t(1,1) >= t(3,3)) + kx1 = t(1,1) - t(2,2) - t(3,3) + 1; % Nx - Oy - Az + 1 + ky1 = t(2,1) + t(1,2); % Ny + Ox + kz1 = t(3,1) + t(1,3); % Nz + Ax + add = (kx >= 0); + elseif (t(2,2) >= t(3,3)) + kx1 = t(2,1) + t(1,2); % Ny + Ox + ky1 = t(2,2) - t(1,1) - t(3,3) + 1; % Oy - Nx - Az + 1 + kz1 = t(3,2) + t(2,3); % Oz + Ay + add = (ky >= 0); + else + kx1 = t(3,1) + t(1,3); % Nz + Ax + ky1 = t(3,2) + t(2,3); % Oz + Ay + kz1 = t(3,3) - t(1,1) - t(2,2) + 1; % Az - Nx - Oy + 1 + add = (kz >= 0); + end + + if add + kx = kx + kx1; + ky = ky + ky1; + kz = kz + kz1; + else + kx = kx - kx1; + ky = ky - ky1; + kz = kz - kz1; + end + nm = norm([kx ky kz]); + if nm == 0, + q = Quaternion([1 0 0 0]); + else + s = sqrt(1 - qs^2) / nm; + qv = s*[kx ky kz]; + + q = Quaternion([qs qv]); + + end +endfunction + diff --git a/tools/g2o_wrapper/@Quaternion/char.m b/tools/g2o_wrapper/@Quaternion/char.m new file mode 100644 index 0000000..be02908 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/char.m @@ -0,0 +1,27 @@ +%CHAR create string representation of quaternion object + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com + +% Copright (C) Peter Corke 1999 +function s = char(q) + + s = [num2str(q.s), ' <' num2str(q.v(1)) ', ' num2str(q.v(2)) ', ' num2str(q.v(3)) '>']; diff --git a/tools/g2o_wrapper/@Quaternion/display.m b/tools/g2o_wrapper/@Quaternion/display.m new file mode 100644 index 0000000..800eeb1 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/display.m @@ -0,0 +1,31 @@ +%DISPLAY display the value of a quaternion object + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com + +% Copright (C) Peter Corke 1999 +function display(q) + + disp(' '); + disp([inputname(1), ' = ']) + disp(' '); + disp([' ' char(q)]) + disp(' '); diff --git a/tools/g2o_wrapper/@Quaternion/dot.m b/tools/g2o_wrapper/@Quaternion/dot.m new file mode 100644 index 0000000..55091c7 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/dot.m @@ -0,0 +1,25 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qd = dot(q, omega) + E = q.s*eye(3,3) - skew(q.v); + omega = omega(:); + qd = Quaternion(-0.5*q.v*omega, 0.5*E*omega); +end diff --git a/tools/g2o_wrapper/@Quaternion/double.m b/tools/g2o_wrapper/@Quaternion/double.m new file mode 100644 index 0000000..d0b463e --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/double.m @@ -0,0 +1,29 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function v = double(q) +%Quaternion.double Convert a quaternion object to a 4-element vector +% +% V = Q.double() is a 4-vector comprising the quaternion +% elements [s vx vy vz]. + + v = [q.s q.v]; +endfunction + diff --git a/tools/g2o_wrapper/@Quaternion/interp.m b/tools/g2o_wrapper/@Quaternion/interp.m new file mode 100644 index 0000000..9ad34d0 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/interp.m @@ -0,0 +1,63 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function q = interp(Q1, Q2, r) +%Quaternion.interp Interpolate rotations expressed by quaternion objects +% +% QI = Q1.interp(Q2, R) is a unit-quaternion that interpolates between Q1 for R=0 +% to Q2 for R=1. This is a spherical linear interpolation (slerp) that can be +% interpretted as interpolation along a great circle arc on a sphere. +% +% If R is a vector QI is a vector of quaternions, each element +% corresponding to sequential elements of R. +% +% Notes: +% - the value of r is clipped to the interval 0 to 1 +% +% See also ctraj, Quaternion.scale. + + q1 = double(Q1); + q2 = double(Q2); + + theta = acos(q1*q2'); + count = 1; + + % clip values of r + r(r<0) = 0; + r(r>1) = 1; + + if length(r) == 1 + if theta == 0 + q = Q1; + else + q = Quaternion( (sin((1-r)*theta) * q1 + sin(r*theta) * q2) / sin(theta) ); + end + else + for R=r(:)' + if theta == 0 + qq = Q1; + else + qq = Quaternion( (sin((1-R)*theta) * q1 + sin(R*theta) * q2) / sin(theta) ); + end + q(count) = qq; + count = count + 1; + end + end +end diff --git a/tools/g2o_wrapper/@Quaternion/inv.m b/tools/g2o_wrapper/@Quaternion/inv.m new file mode 100644 index 0000000..5f9343d --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/inv.m @@ -0,0 +1,27 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qi = inv(q) +%Quaternion.inv Invert a unit-quaternion +% +% QI = Q.inv() is a quaternion object representing the inverse of Q. + + qi = Quaternion([q.s -q.v]); +endfunction diff --git a/tools/g2o_wrapper/@Quaternion/minus.m b/tools/g2o_wrapper/@Quaternion/minus.m new file mode 100644 index 0000000..8b0182d --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/minus.m @@ -0,0 +1,30 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qp = minus(q1, q2) +%Quaternion.minus Subtract two quaternion objects +% +% Q1-Q2 is the element-wise difference of quaternion elements. + + if isa(q1, 'Quaternion') & isa(q2, 'Quaternion') + + qp = Quaternion(double(q1) - double(q2)); + end +end diff --git a/tools/g2o_wrapper/@Quaternion/mpower.m b/tools/g2o_wrapper/@Quaternion/mpower.m new file mode 100644 index 0000000..92be847 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/mpower.m @@ -0,0 +1,42 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qp = mpower(q, p) +%Quaternion.mpower Raise quaternion to integer power +% +% Q^N is quaternion Q raised to the integer power N, and computed by repeated multiplication. + + % check that exponent is an integer + if (p - floor(p)) ~= 0 + error('quaternion exponent must be integer'); + end + + qp = q; + + % multiply by itself so many times + for i = 2:abs(p) + qp = qp * q; + end + + % if exponent was negative, invert it + if p<0 + qp = inv(qp); + end +end diff --git a/tools/g2o_wrapper/@Quaternion/mrdivide.m b/tools/g2o_wrapper/@Quaternion/mrdivide.m new file mode 100644 index 0000000..82a544a --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/mrdivide.m @@ -0,0 +1,35 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qq = mrdivide(q1, q2) +%Quaternion.mrdivide Compute quaternion quotient. +% +% Q1/Q2 is a quaternion formed by Hamilton product of Q1 and inv(Q2) +% Q/S is the element-wise division of quaternion elements by by the scalar S + + if isa(q2, 'Quaternion') + % qq = q1 / q2 + % = q1 * qinv(q2) + + qq = q1 * inv(q2); + elseif isa(q2, 'double') + qq = Quaternion( double(q1) / q2 ); + end +end diff --git a/tools/g2o_wrapper/@Quaternion/mtimes.m b/tools/g2o_wrapper/@Quaternion/mtimes.m new file mode 100644 index 0000000..13f3364 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/mtimes.m @@ -0,0 +1,74 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qp = mtimes(q1, q2) +%Quaternion.mtimes Multiply a quaternion object +% +% Q1*Q2 is a quaternion formed by Hamilton product of two quaternions. +% Q*V is the vector V rotated by the quaternion Q +% Q*S is the element-wise multiplication of quaternion elements by by the scalar S + + if isa(q1, 'Quaternion') & isa(q2, 'Quaternion') + %QQMUL Multiply unit-quaternion by unit-quaternion + % + % QQ = qqmul(Q1, Q2) + % + % Return a product of unit-quaternions. + % + % See also: TR2Q + + + % decompose into scalar and vector components + s1 = q1.s; v1 = q1.v; + s2 = q2.s; v2 = q2.v; + + % form the product + qp = Quaternion([s1*s2-v1*v2' s1*v2+s2*v1+cross(v1,v2)]); + + elseif isa(q1, 'Quaternion') & isa(q2, 'double') + + %QVMUL Multiply vector by unit-quaternion + % + % VT = qvmul(Q, V) + % + % Rotate the vector V by the unit-quaternion Q. + % + % See also: QQMUL, QINV + + if length(q2) == 3 + qp = q1 * Quaternion([0 q2(:)']) * inv(q1); + qp = qp.v(:); + elseif length(q2) == 1 + qp = Quaternion(double(q1)*q2); + else + error('quaternion-vector product: must be a 3-vector or scalar'); + end + + elseif isa(q2, 'Quaternion') & isa(q1, 'double') + if length(q1) == 3 + qp = q2 * Quaternion([0 q1(:)']) * inv(q2); + qp = qp.v; + elseif length(q1) == 1 + qp = Quaternion(double(q2)*q1); + else + error('quaternion-vector product: must be a 3-vector or scalar'); + end + end +end diff --git a/tools/g2o_wrapper/@Quaternion/norm.m b/tools/g2o_wrapper/@Quaternion/norm.m new file mode 100644 index 0000000..56c1d40 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/norm.m @@ -0,0 +1,27 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function n = norm(q) +%Quaternion.norm Compute the norm of a quaternion +% +% QN = Q.norm(Q) is the scalar norm or magnitude of the quaternion Q. + + n = norm(double(q)); +end diff --git a/tools/g2o_wrapper/@Quaternion/plotQuat.m b/tools/g2o_wrapper/@Quaternion/plotQuat.m new file mode 100644 index 0000000..4728270 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/plotQuat.m @@ -0,0 +1,43 @@ +%PLOT plot a quaternion object as a rotated coordinate frame + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com + +% Copright (C) Peter Corke 1999 +function plotQuat(Q) + axis([-1 1 -1 1 -1 1]) + + x1 = Q*[1 0 0]'; + y1 = Q*[0 1 0]'; + z1 = Q*[0 0 1]'; + + hold on + plot3([0;x1(1)], [0; x1(2)], [0; x1(3)]) + text(x1(1), x1(2), x1(3), 'X') + plot3([0;y1(1)], [0; y1(2)], [0; y1(3)]) + text(y1(1), y1(2), y1(3), 'Y') + plot3([0;z1(1)], [0; z1(2)], [0; z1(3)]) + text(z1(1), z1(2), z1(3), 'Z') + grid on + xlabel('X') + ylabel('Y') + zlabel('Z') + hold off diff --git a/tools/g2o_wrapper/@Quaternion/plus.m b/tools/g2o_wrapper/@Quaternion/plus.m new file mode 100644 index 0000000..1904801 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/plus.m @@ -0,0 +1,30 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qp = plus(q1, q2) +%PLUS Add two quaternion objects +% +% Q1+Q2 is the element-wise sum of quaternion elements. + + if isa(q1, 'Quaternion') & isa(q2, 'Quaternion') + + qp = Quaternion(double(q1) + double(q2)); + end +end diff --git a/tools/g2o_wrapper/@Quaternion/q2tr.m b/tools/g2o_wrapper/@Quaternion/q2tr.m new file mode 100644 index 0000000..e0c38a4 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/q2tr.m @@ -0,0 +1,35 @@ +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function t = q2tr(q) + + q = double(q); + s = q(1); + x = q(2); + y = q(3); + z = q(4); + + r = [ 1-2*(y^2+z^2) 2*(x*y-s*z) 2*(x*z+s*y) + 2*(x*y+s*z) 1-2*(x^2+z^2) 2*(y*z-s*x) + 2*(x*z-s*y) 2*(y*z+s*x) 1-2*(x^2+y^2) ]; + t = eye(4,4); + t(1:3,1:3) = r; + t(4,4) = 1; +endfunction diff --git a/tools/g2o_wrapper/@Quaternion/qinterp.m b/tools/g2o_wrapper/@Quaternion/qinterp.m new file mode 100644 index 0000000..9ecf04b --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/qinterp.m @@ -0,0 +1,60 @@ +%QINTERP Interpolate rotations expressed by quaternion objects +% +% QI = qinterp(Q1, Q2, R) +% +% Return a unit-quaternion that interpolates between Q1 and Q2 as R moves +% from 0 to 1. This is a spherical linear interpolation (slerp) that can +% be interpretted as interpolation along a great circle arc on a sphere. +% +% If r is a vector, QI, is a cell array of quaternions. +% +% See also TR2Q + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com + +% MOD HISTORY +% 2/99 convert to use of objects + +% Copright (C) Peter Corke 1999 +function q = qinterp(Q1, Q2, r) + + + q1 = double(Q1); + q2 = double(Q2); + + if (r<0) | (r>1), + error('R out of range'); + end + + theta = acos(q1*q2'); + q = {}; + count = 1; + + if length(r) == 1, + q = quaternion( (sin((1-r)*theta) * q1 + sin(r*theta) * q2) / sin(theta) ); + else + for R=r(:)', + qq = quaternion( (sin((1-R)*theta) * q1 + sin(R*theta) * q2) / sin(theta) ); + q{count} = qq; + count = count + 1; + end + end diff --git a/tools/g2o_wrapper/@Quaternion/scale.m b/tools/g2o_wrapper/@Quaternion/scale.m new file mode 100644 index 0000000..a1efcc6 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/scale.m @@ -0,0 +1,61 @@ + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function q = scale(Q, r) +%Quaternion.scale Interpolate rotations expressed by quaternion objects +% +% QI = Q.scale(R) is a unit-quaternion that interpolates between identity for R=0 +% to Q for R=1. This is a spherical linear interpolation (slerp) that can +% be interpretted as interpolation along a great circle arc on a sphere. +% +% If R is a vector QI is a cell array of quaternions, each element +% corresponding to sequential elements of R. +% +% See also ctraj, Quaternion.interp. + + + q2 = double(Q); + + if any(r<0) || (r>1) + error('r out of range'); + end + q1 = [1 0 0 0]; % identity quaternion + theta = acos(q1*q2'); + + if length(r) == 1 + if theta == 0 + q = Q; + else + q = unit(Quaternion( (sin((1-r)*theta) * q1 + sin(r*theta) * q2) / sin(theta) )); + end + else + count = 1; + for R=r(:)' + if theta == 0 + qq = Q; + else + qq = Quaternion( (sin((1-r)*theta) * q1 + sin(r*theta) * q2) / sin(theta) ).unit; + end + q(count) = qq; + count = count + 1; + end + end +end diff --git a/tools/g2o_wrapper/@Quaternion/subsref.m b/tools/g2o_wrapper/@Quaternion/subsref.m new file mode 100644 index 0000000..17042b5 --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/subsref.m @@ -0,0 +1,81 @@ + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function v = subsref(q, s) + if (length (s)<2) + if s(1).type == '.' + + % NOTE WELL: the following code can't use getfield() since + % getfield() uses this, and Matlab will crash!! + + el = char(s(1).subs); + switch el + case 'd' + v = double(q); + case 's' + v = q.s; + case 'v' + v = q.v; + case 'T' + v = q2tr(q); + case 'R' + v = q2tr(q); + v = v(1:3,1:3); + case 'inv' + v = inv(q); + case 'norm' + v = norm(q); + case 'unit' + v = unit(q); + case 'double' + v = double(q); + case 'plot' + v = plot(q); + end + else + error('only .field supported') + end + + elseif (length(s) == 2 ) + if s(1).type == '.' + + % NOTE WELL: the following code can't use getfield() since + % getfield() uses this, and Matlab will crash!! + + el = char(s(1).subs); + args = s(2).subs; + switch el + case 'interp' + v = interp(q,args{:}); + case 'scale' + v = scale(q,args{:}); + case 'dot' + v = dot(q,args{:}); + end + else + error('only .field supported') + end + else + error('only .field supported') + end +endfunction + + diff --git a/tools/g2o_wrapper/@Quaternion/unit.m b/tools/g2o_wrapper/@Quaternion/unit.m new file mode 100644 index 0000000..0d3dc1f --- /dev/null +++ b/tools/g2o_wrapper/@Quaternion/unit.m @@ -0,0 +1,28 @@ + +% Ryan Steindl based on Robotics Toolbox for MATLAB (v6 and v9) +% +% Copyright (C) 1993-2011, by Peter I. Corke +% +% This file is part of The Robotics Toolbox for MATLAB (RTB). +% +% RTB is free software: you can redistribute it and/or modify +% it under the terms of the GNU Lesser General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% RTB is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU Lesser General Public License for more details. +% +% You should have received a copy of the GNU Leser General Public License +% along with RTB. If not, see . +% +% http://www.petercorke.com +function qu = unit(q) +%Quaternion.unit Unitize a quaternion +% +% QU = Q.unit() is a quaternion which is a unitized version of Q + + qu = q / norm(q); +end diff --git a/tools/g2o_wrapper/README b/tools/g2o_wrapper/README new file mode 100644 index 0000000..a6cf1cf --- /dev/null +++ b/tools/g2o_wrapper/README @@ -0,0 +1,30 @@ +G2oWrapper for Octave + +-- it runs on Octave. I've said octave, not Matlab. + +--IMPLEMENTED: +- loader for *.g2o file (loadG2o.m). It returns 4 Struct-Array(Landmark, Poses, Transitions, Observations) +they can be accessed by classical octave indexing, e.g.: + +[land, pose, trans, obs] = loadG2o('file.g2o'); +land(i) + +moreover, you can access the single fields of the struct, e.g.: + +land(i).x + +will return you the x-coord of the i-th landmark. +In case you want to search for a particular index in poses or landmarks vector, +you can use the function 'searchById', e.g.: + +l_index = 12; +desired_landmark = searchById(landmarks, l_index); + +--TODO: +- ...ideas for other utilities + +-------------------------------- +Bartolomeo Della Corte +'Research Assistant' +Sapienza, University of Rome +-------------------------------- diff --git a/tools/g2o_wrapper/addLandmark.m b/tools/g2o_wrapper/addLandmark.m new file mode 100644 index 0000000..35dcc9b --- /dev/null +++ b/tools/g2o_wrapper/addLandmark.m @@ -0,0 +1,48 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # +% +% addLandmark to a map + +function [map] = addLandmark(map, id, x, y) + +map_dim = length(map); + +if( map_dim == 0 ) + map = landmark(id, [x, y]); +else + map(end+1) = landmark(id, [x, y]); +endif + +end diff --git a/tools/g2o_wrapper/graphics/draw_EDGE_SE2.m b/tools/g2o_wrapper/graphics/draw_EDGE_SE2.m new file mode 100644 index 0000000..df864f5 --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_EDGE_SE2.m @@ -0,0 +1,17 @@ +function out = draw_EDGE_SE2(data_edge, data_vertex); + num_edges = size(data_edge, 2); + + for e = 1:num_edges + index_from = find([data_vertex.id] == data_edge(e).id_from); + index_to = find([data_vertex.id] == data_edge(e).id_to); + if index_from && index_to + hold on; + plot([data_vertex(index_from).x; data_vertex(index_to).x], ... + [data_vertex(index_from).y; data_vertex(index_to).y], ... + "color", "b"); + else + error('draw_EDGE_SE2| Edge_SE2 pointing to non-existing Vertex'); + end + end + +end diff --git a/tools/g2o_wrapper/graphics/draw_EDGE_SE2_XY.m b/tools/g2o_wrapper/graphics/draw_EDGE_SE2_XY.m new file mode 100644 index 0000000..9fd444b --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_EDGE_SE2_XY.m @@ -0,0 +1,17 @@ +function out = draw_EDGE_SE2_XY(data_edge_se2_xy, data_vertex_se2, data_vertex_xy) + num_edges = size(data_edge_se2_xy, 2); + + for e = 1:num_edges + index_from = find([data_vertex_se2.id] == data_edge_se2_xy(e).id_from); + index_to = find([data_vertex_xy.id] == data_edge_se2_xy(e).id_to); + if index_from && index_to + hold on; + plot([data_vertex_se2(index_from).x; data_vertex_xy(index_to).x], ... + [data_vertex_se2(index_from).y; data_vertex_xy(index_to).y], ... + "color", "m"); + else + error('draw_EDGE_SE2_XY| Edge_SE2 pointing to non-existing Vertex'); + end + end + +end diff --git a/tools/g2o_wrapper/graphics/draw_EDGE_SE3_QUAT.m b/tools/g2o_wrapper/graphics/draw_EDGE_SE3_QUAT.m new file mode 100644 index 0000000..9dbae4a --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_EDGE_SE3_QUAT.m @@ -0,0 +1,18 @@ +function out = draw_EDGE_SE3_QUAT(data_edge, data_vertex); + num_edges = size(data_edge, 2); + + for e = 1:num_edges + index_from = find([data_vertex.id] == data_edge(e).id_from); + index_to = find([data_vertex.id] == data_edge(e).id_to); + if index_from && index_to + hold on; + plot3([data_vertex(index_from).x; data_vertex(index_to).x], ... + [data_vertex(index_from).y; data_vertex(index_to).y], ... + [data_vertex(index_from).z; data_vertex(index_to).z], ... + "color", "b"); + else + error('draw_EDGE_SE3_QUAT| Edge_SE3_QUAT pointing to non-existing Vertex'); + end + end + +end diff --git a/tools/g2o_wrapper/graphics/draw_SE3_frame.m b/tools/g2o_wrapper/graphics/draw_SE3_frame.m new file mode 100644 index 0000000..f087c1e --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_SE3_frame.m @@ -0,0 +1,13 @@ +function out = draw_SE3_frame(x,y,z,q) + % set arrow length + l = 0.5; + + hold on; + plot([x; x + l*cos(theta)], [y; y + l*sin(theta)], ... + "color", "r", ... + "linewidth", 2); + hold on; + plot([x; x + l*cos(theta+pi/2)], [y; y + l*sin(theta+pi/2)], ... + "color", "g", ... + "linewidth", 2); +end diff --git a/tools/g2o_wrapper/graphics/draw_VERTEX_SE3_QUAT.m b/tools/g2o_wrapper/graphics/draw_VERTEX_SE3_QUAT.m new file mode 100644 index 0000000..4fde1f4 --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_VERTEX_SE3_QUAT.m @@ -0,0 +1,31 @@ +function draw_VERTEX_SE3_QUAT(data, draw_axes = false) + % keep on drawing on the same canvas + hold on; + plot3([data(:).x], [data(:).y], [data(:).z], 'o', "markerfacecolor", "m"); + + if draw_axes + axes_length = 1.5; + % TODO vectorize + for v = 1:size(data,2) + x1 = data(v).quat * [axes_length 0 0]'; + y1 = data(v).quat * [0 axes_length 0]'; + z1 = data(v).quat * [0 0 axes_length]'; + hold on + plot3([data(v).x ;data(v).x + x1(1)], + [data(v).y; data(v).y + x1(2)], + [data(v).z; data(v).z + x1(3)], + "color", "r", ... + "linewidth", 2); + plot3([data(v).x; data(v).x + y1(1)], + [data(v).y; data(v).y + y1(2)], + [data(v).z; data(v).z + y1(3)], + "color", "g", ... + "linewidth", 2); + plot3([data(v).x; data(v).x + z1(1)], + [data(v).y; data(v).y + z1(2)], + [data(v).z; data(v).z + z1(3)], + "color", "b", ... + "linewidth", 2); + end %for + end %if +end diff --git a/tools/g2o_wrapper/graphics/draw_VERTEX_TRACKXYZ.m b/tools/g2o_wrapper/graphics/draw_VERTEX_TRACKXYZ.m new file mode 100644 index 0000000..5b1211b --- /dev/null +++ b/tools/g2o_wrapper/graphics/draw_VERTEX_TRACKXYZ.m @@ -0,0 +1,5 @@ +function out = draw_VERTEX_TRACKXYZ(data) + % keep on drawing on the same canvas + hold on; + plot3([data(:).x], [data(:).y], [data(:).z], "*b"); +end diff --git a/tools/g2o_wrapper/graphics/linear_solver.cc b/tools/g2o_wrapper/graphics/linear_solver.cc new file mode 100644 index 0000000..b770dfd --- /dev/null +++ b/tools/g2o_wrapper/graphics/linear_solver.cc @@ -0,0 +1,32 @@ +#include +#include + +DEFUN_DLD (linear_solver, args, nargout, + "Hello World Help String") +{ + octave_stdout << "Linear Solver called\n"; + octave_stdout << args.length () << " input arguments and " + << nargout << " output arguments.\n"; + + Matrix H = args(0).array_value(); + octave_stdout << "Read H\n"; + Matrix b = args(1).array_value(); + octave_stdout << "Read b\n"; + // cholmod_sparse *H ; + // cholmod_dense *x, *b; + // cholmod_factor *L ; + // cholmod_common c; + // + // cholmod_start (&c); + // + // // populate H + // + // // populate b + // + // // solve + // L = cholmod_analyze (H, &c) ; /* analyze */ + // cholmod_factorize (H, L, &c) ; /* factorize */ + // x = cholmod_solve (CHOLMOD_A, L, b, &c) ; /* solve Ax=b */ + + return octave_value (H.solve(-b)); +} diff --git a/tools/g2o_wrapper/landmark.m b/tools/g2o_wrapper/landmark.m new file mode 100644 index 0000000..f6cbec2 --- /dev/null +++ b/tools/g2o_wrapper/landmark.m @@ -0,0 +1,54 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # + +function out = landmark(varargin) + %There is always an id + out.id = varargin{1}; %id + Nvarargin = length(varargin); + %if we call the fx with 3 argument, we are populating + %the landmark absolute position structures. + if(Nvarargin == 2) + var2 = varargin{2}; + if(length(var2) == 1) + #out.bearing = var2; %bearing only + out.range=var2; #I have range, not bearing + end + if(length(var2) == 2) + out.x_pose = var2(1); %x-pose + out.y_pose = var2(2); %y-pose + end + end + +end diff --git a/tools/g2o_wrapper/loadG2o.m b/tools/g2o_wrapper/loadG2o.m new file mode 100644 index 0000000..552c182 --- /dev/null +++ b/tools/g2o_wrapper/loadG2o.m @@ -0,0 +1,183 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # +% +% # load a file.g2o file and returns the four structs of landmark, poses, transitions, observations + +function [landmarks, poses, transitions, observations] = loadG2o(filepath) + + + + %%-----G2O specification--- + VERTEX_XY = 'VERTEX_XY'; + VERTEX_SE2 = 'VERTEX_SE2'; + ROBOTLASER1 = 'ROBOTLASER1'; + EDGE_SE2 = 'EDGE_SE2'; + EDGE_BEARING_SE2_XY = 'EDGE_BEARING_SE2_XY'; + EDGE_SE2_XY = 'EDGE_SE2_XY'; + EDGE_RANGE_SE2_XY="EDGE_RANGE_SE2_XY"; + %%------------------------- + + %open the file + fid = fopen(filepath, 'r'); + + + %debug stuff + i_vert_xy = 0; + i_vert_se2 = 0; + i_robotlaser = 0; + i_edge_se2 = 0; + i_edge_se2_xy = 0; + i_edge_bearing_se2_xy=0; + i_edge_range_se2_xy = 0; + + % + curr_id = -1; + + while true + %get current line + c_line = fgetl(fid); + + %stop if EOF + if c_line == -1 + break; + end + + %Split the line using space as separator + elements = strsplit(c_line,' '); + + switch(elements{1}) + case VERTEX_XY + landmarks(end+1) = extractLandmark(elements); + i_vert_xy = i_vert_xy + 1; %do not use pre/post increment. Keep the Matlab compatibility + case VERTEX_SE2 + poses(end+1) = extractPose(elements); + i_vert_se2 = i_vert_se2 + 1; + case ROBOTLASER1 + %TODO + i_robotlaser = i_robotlaser + 1; + case EDGE_SE2 + transitions(end+1) = extractTransition(elements); + i_edge_se2 = i_edge_se2 + 1; + + case EDGE_BEARING_SE2_XY + current_obs = extractBearing(elements); + if current_obs.pose_id == curr_id + observations(end).observation(end+1) = current_obs.observation; + else + observations(end+1) = current_obs; + curr_id = observations(end).pose_id; + i_edge_bearing_se2_xy = i_edge_bearing_se2_xy + 1; + end + + case EDGE_RANGE_SE2_XY + #adding this case + current_obs = extractRange(elements); + if current_obs.pose_id == curr_id + observations(end).observation(end+1) = current_obs.observation; + else + observations(end+1) = current_obs; + curr_id = observations(end).pose_id; + i_edge_range_se2_xy = i_edge_range_se2_xy + 1; + end + + case EDGE_SE2_XY + current_obs = extractPoint(elements); + if current_obs.pose_id == curr_id + observations(end).observation(end+1) = current_obs.observation; + else + observations(end+1) = current_obs; + curr_id = observations(end).pose_id; + i_edge_se2_xy = i_edge_se2_xy + 1; + end + + otherwise + disp('Error in reading first element'); + end + end + + + + printf('[G2oWrapper] loading file...\n#landmarks: %d \n#poses: %d \n',i_vert_xy, i_vert_se2); + printf('#transitions: %d \n#observation(range-only): %d \n',i_edge_se2, i_edge_range_se2_xy); + printf('#observation(point): %d \n#laser-scan: %d \n',i_edge_se2_xy, i_robotlaser); + fflush(stdout); + +end + +function out = extractLandmark(elements) + id = str2double(elements{2}); + x_pose = str2double(elements{3}); + y_pose = str2double(elements{4}); + out = landmark(id,[x_pose,y_pose]); +end + +function out = extractPose(elements) + id = str2double(elements{2}); + x_pose = str2double(elements{3}); + y_pose = str2double(elements{4}); + th_pose = str2double(elements{5}); + out = pose(id,x_pose, y_pose, th_pose); +end + +function out = extractTransition(elements) + from_id = str2double(elements{2}); + to_id = str2double(elements{3}); + x_t = str2double(elements{4}); + y_t = str2double(elements{5}); + th_t = str2double(elements{6}); + out = transition(from_id,to_id, [x_t;y_t;th_t]); +end + +function out = extractBearing(elements) + from_id = str2double(elements{2}); + land_id = str2double(elements{3}); + bearing = str2double(elements{4}); + out = observation(from_id,land_id, bearing); +end + +function out = extractPoint(elements) + from_id = str2double(elements{2}); + land_id = str2double(elements{3}); + x_p = str2double(elements{4}); + y_p = str2double(elements{5}); + out = observation(from_id,land_id, [x_p; y_p]); +end + +function out = extractRange(elements) + from_id = str2double(elements{2}); + land_id = str2double(elements{3}); + range_ = str2double(elements{4}); + out = observation(from_id, land_id, range_); +end \ No newline at end of file diff --git a/tools/g2o_wrapper/observation.m b/tools/g2o_wrapper/observation.m new file mode 100644 index 0000000..38a0cfc --- /dev/null +++ b/tools/g2o_wrapper/observation.m @@ -0,0 +1,39 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # + +function out = observation(from_id, land_id, obs) + out.pose_id = from_id; + out.observation = landmark(land_id, obs); +end diff --git a/tools/g2o_wrapper/pose.m b/tools/g2o_wrapper/pose.m new file mode 100644 index 0000000..6f8067a --- /dev/null +++ b/tools/g2o_wrapper/pose.m @@ -0,0 +1,41 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # + +function out = pose(id, x, y, theta) + out.id = id; + out.x = x; + out.y = y; + out.theta = theta; +end diff --git a/tools/g2o_wrapper/searchById.m b/tools/g2o_wrapper/searchById.m new file mode 100644 index 0000000..5344b07 --- /dev/null +++ b/tools/g2o_wrapper/searchById.m @@ -0,0 +1,48 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # + +% Find in a Struct-Array the elements whose id +% is 'id'. Return the desired structure +% +% This function works for landmarks and poses +% +function out = searchById(vector, id) + index = find([vector.id] == id); + if(index) + out = vector(index); + else + out = -1; + end +end diff --git a/tools/g2o_wrapper/transition.m b/tools/g2o_wrapper/transition.m new file mode 100644 index 0000000..3aff722 --- /dev/null +++ b/tools/g2o_wrapper/transition.m @@ -0,0 +1,40 @@ +% # This source code is part of the localization and SLAM package +% # deveoped for the lectures of probabilistic robotics at +% # Sapienza, University of Rome. +% # +% # Copyright (c) 2016 Bartolomeo Della Corte, Giorgio Grisetti +% # +% # It is licences under the Common Creative License, +% # Attribution-NonCommercial-ShareAlike 3.0 +% # +% # You are free: +% # - to Share - to copy, distribute and transmit the work +% # - to Remix - to adapt the work +% # +% # Under the following conditions: +% # +% # - Attribution. You must attribute the work in the manner specified +% # by the author or licensor (but not in any way that suggests that +% # they endorse you or your use of the work). +% # +% # - Noncommercial. You may not use this work for commercial purposes. +% # +% # - Share Alike. If you alter, transform, or build upon this work, +% # you may distribute the resulting work only under the same or +% # similar license to this one. +% # +% # Any of the above conditions can be waived if you get permission +% # from the copyright holder. Nothing in this license impairs or +% # restricts the author's moral rights. +% # +% # This software is distributed in the hope that it will be useful, +% # but WITHOUT ANY WARRANTY; without even the implied +% # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +% # PURPOSE. +% # + +function out = transition(id_from, id_to, v) + out.id_from = id_from; + out.id_to = id_to; + out.v = v; +end diff --git a/tools/my_visualization/myPlot.m b/tools/my_visualization/myPlot.m new file mode 100644 index 0000000..86afcf3 --- /dev/null +++ b/tools/my_visualization/myPlot.m @@ -0,0 +1,99 @@ +1; +function myPlot(init_poses,optim_poses,gt_poses,init_land,optim_land,gt_land) + myDrawLandmarks(init_land,optim_land,gt_land,false); + myDrawTrajectory(init_poses,optim_poses,gt_poses); + +endfunction + +% Plots the trajectories IG/OPT/GT +function myDrawTrajectory(init,optim,gt,poses_num) + poses_num=length(gt); + figure(); + hold on; + title("Robot trajectory "); + + plot(reshape(init(1,3,:), 1, poses_num), reshape(init(2,3,:), 1, poses_num), 'b', 'linewidth', 2); + plot(reshape(optim(1,3,:), 1, poses_num), reshape(optim(2,3,:), 1, poses_num), 'g', 'linewidth', 2); + plot(reshape(gt(1,3,:), 1, poses_num), reshape(gt(2,3,:), 1, poses_num), 'k', 'linewidth', 1); + legend("Initial guess","after Least Squares","Ground Truth"); + print(fullfile("trajectory_plot.png")); + hold off; +end + +function done = myDrawLandmarks(init,optim,truth,draw_labels=false) + #first put all landmarks in a format to plot in one line + # in this way I can plot also a legend + + # I use 3 loops to avoid any cases of errors with different sizes of the landamrks. + # it could happen if for example I have one landmark that has not been observed by any pose + init_land=zeros(2,length(init)); + valid_index=1; + for l=1:length(init) + if init(l).pos + init_land(:,end+1)=init(l).pos; + valid_index=l; + else + #this landamrk position has not been estimated, use random one for plot + init_land(:,end+1)=init(valid_index).pos; + printf("init invalid landmark\n") + endif + endfor + + optim_land=zeros(2,length(optim)); + for l=1:length(optim) + if optim(l).pos + optim_land(:,end+1)=optim(l).pos; + valid_index=l; + else + optim_land(:,end+1)=optim(valid_index).pos; + printf("optim invalid landmark\n"); + endif + endfor + + truth_land=zeros(2,length(truth)); + for l=1:length(truth) + truth_land(:,end+1)=[truth(l).x_pose; truth(l).y_pose]; + endfor + + if(nargin == 2) + color = 'r'; + mode = 'fill'; + end + hold on; + + title("Landmark positions"); + scale=20; + color="k"; + scatter(truth_land(1,:),truth_land(2,:),scale,color,"filled"); + color="b"; + scatter(init_land(1,:),init_land(2,:),scale,color,"filled"); + color="g"; + scatter(optim_land(1,:),optim_land(2,:),scale,color,"filled"); + legend("Ground Truth", "initial Guess (with outliers)", "Least Square optimization") + hold off; + print(fullfile("landmark_plot.png")); + + +end + + + +function drawLandmarkWithLabel(land,truth,radius=0.3) + hold on; + + color="g"; + for i=1:length(land) + if land(i).pos + drawShape('circle', [land(i).pos(1) land(i).pos(2), radius], 'fill', color); + drawLabels(land(i).pos(1), land(i).pos(2), land(i).l_id, '%d'); + endif + endfor + color="k"; + for i=1:length(truth) + drawShape('circle', [truth(i).x_pose truth(i).y_pose, radius], 'fill', color); + drawLabels(truth(i).x_pose, truth(i).y_pose, truth(i).id, '%d'); + endfor + print(fullfile("landmark_plot_labels.png")); + hold off; +endfunction + diff --git a/tools/utilities/geometry_helpers_2d.m b/tools/utilities/geometry_helpers_2d.m new file mode 100644 index 0000000..416fc87 --- /dev/null +++ b/tools/utilities/geometry_helpers_2d.m @@ -0,0 +1,32 @@ +% computes the pose 2d pose vector v from an homogeneous transform A +% A:[ R t ] 3x3 homogeneous transformation matrix, r translation vector +% v: [x,y,theta] 2D pose vector +function v=t2v(A) + v(1:2, 1)=A(1:2,3); + v(3,1)=atan2(A(2,1),A(1,1)); +end + +% computes the homogeneous transform matrix A of the pose vector v +% A:[ R t ] 3x3 homogeneous transformation matrix, r translation vector +% v: [x,y,theta] 2D pose vector +function A=v2t(v) + c=cos(v(3)); + s=sin(v(3)); + A=[c, -s, v(1) ; + s, c, v(2) ; + 0 0 1 ]; +end + + +% normalizes and angle between -pi and pi +% th: input angle +% o: output angle +function o = normalizeAngle(th) + o = atan2(sin(th),cos(th)); +end + +#computes the derivative of atan2(p.y/p.x); +function J = J_atan2(p) + n2=p'*p; + J= 1./n2 * [-p(2) p(1)]; +endfunction diff --git a/tools/visualization/circleAsPolygon.m b/tools/visualization/circleAsPolygon.m new file mode 100644 index 0000000..b2f7cc2 --- /dev/null +++ b/tools/visualization/circleAsPolygon.m @@ -0,0 +1,66 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{P} = } circleAsPolygon (@var{circle}, @var{N}) +## Convert a circle into a series of points +## +## P = circleAsPolygon(CIRCLE, N); +## convert circle given as [x0 y0 r], where x0 and y0 are coordinate of +## center, and r is the radius, into an array of [(N+1)x2] double, +## containing x and y values of points. +## The polygon is closed +## +## P = circleAsPolygon(CIRCLE); +## uses a default value of N=64 points +## +## Example +## circle = circleAsPolygon([10 0 5], 16); +## figure; +## drawPolygon(circle); +## +## @seealso{circles2d, polygons2d, createCircle} +## @end deftypefn + +function varargout = circleAsPolygon(circle, varargin) + # determines number of points + N = 64; + if ~isempty(varargin) + N = varargin{1}; + end + + # create circle + t = linspace(0, 2*pi, N+1)'; + x = circle(1) + circle(3)*cos(t); + y = circle(2) + circle(3)*sin(t); + + if nargout==1 + varargout{1}=[x y]; + elseif nargout==2 + varargout{1}=x; + varargout{2}=y; + end + +endfunction diff --git a/tools/visualization/clearObservations.m b/tools/visualization/clearObservations.m new file mode 100644 index 0000000..330b5f4 --- /dev/null +++ b/tools/visualization/clearObservations.m @@ -0,0 +1,37 @@ +function clearObservations(observations_, row_, col_, map_) + map_rows = rows(map_); + hold on; + + #check the observation array + if (observations_(1)) #UP + if (map_(row_-1, col_)) + rectangle("Position", [col_-1 map_rows-row_+1 1 1], "FaceColor", "black"); + else + rectangle("Position", [col_-1 map_rows-row_+1 1 1], "FaceColor", "white"); + endif + endif + if (observations_(2)) #DOWN + if (map_(row_+1, col_)) + rectangle("Position", [col_-1 map_rows-row_-1 1 1], "FaceColor", "black"); + else + rectangle("Position", [col_-1 map_rows-row_-1 1 1], "FaceColor", "white"); + endif + endif + if (observations_(3)) #LEFT + if (map_(row_, col_-1)) + rectangle("Position", [col_-2 map_rows-row_ 1 1], "FaceColor", "black"); + else + rectangle("Position", [col_-2 map_rows-row_ 1 1], "FaceColor", "white"); + endif + endif + if (observations_(4)) #RIGHT + if (map_(row_, col_+1)) + rectangle("Position", [col_ map_rows-row_ 1 1], "FaceColor", "black"); + else + rectangle("Position", [col_ map_rows-row_ 1 1], "FaceColor", "white"); + endif + endif + + hold off; +endfunction + diff --git a/tools/visualization/drawArrow.m b/tools/visualization/drawArrow.m new file mode 100644 index 0000000..5e5aad4 --- /dev/null +++ b/tools/visualization/drawArrow.m @@ -0,0 +1,177 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{h} = } drawArrow (@var{x1}, @var{y1}, @var{x2}, @var{y2}) +## @deftypefnx {Function File} {@var{h} = } drawArrow ([@var{ @var{x1}} @var{ @var{y1}} @var{x2} @var{y2}]) +## @deftypefnx {Function File} {@var{h} = } drawArrow (@dots{}, @var{L}, @var{W},@var{R},@var{TYPE}) +## Draw an arrow on the current axis. +## +## Draw an arrow between the points (@var{x1} @var{y1}) and (@var{x2} @var{y2}). +## The points can be given as a single array. @var{L}, @var{W} specify length +## and width of the arrow. +## +## The length wings of the arrow can be modified with @var{R}. By default +## @var{R} is 0.1, giving a wing legnth of 0.1*@var{L}. +## +## Also specify arrow type. @var{TYPE} can be one of the following : +## 0: draw only two strokes +## 1: fill a triangle +## .5: draw a half arrow (try it to see ...) +## +## Arguments can be single values or array of size [N*1]. In this case, +## the function draws multiple arrows. +## +## @end deftypefn + +function varargout = drawArrow(varargin) + + if isempty(varargin) + error('should specify at least one argument'); + end + + # parse arrow coordinate + if size(varargin{1}, 2)==4 + x1 = varargin{1}(:,1); + y1 = varargin{1}(:,2); + x2 = varargin{1}(:,3); + y2 = varargin{1}(:,4); + varargin = varargin(2:end); + elseif length(varargin)>3 + x1 = varargin{1}; + y1 = varargin{2}; + x2 = varargin{3}; + y2 = varargin{4}; + varargin = varargin(5:end); + else + error('wrong number of arguments, please read the doc'); + end + + l = 10*size(size(x1)); + w = 5*ones(size(x1)); + h = zeros(size(x1)); + + # exctract length of arrow + if ~isempty(varargin) + l = varargin{1}; + if length(x1)>length(l) + l = l(1)*ones(size(x1)); + end + end + + # extract width of arrow + if length(varargin)>1 + w = varargin{2}; + if length(x1)>length(w) + w = w(1)*ones(size(x1)); + end + end + + # extract 'ratio' of arrow + r = 0.1; + if length(varargin)>2 + r = varargin{3}; + if length(x1)>length(r) + r = r(1)*ones(size(x1)); + end + end + + # extract 'type' of arrow + if length(varargin)>3 + h = varargin{4}; + if length(x1)>length(h) + h = h(1)*ones(size(x1)); + end + end + + old_hold = ishold (gca); + if ~old_hold + hold on; + end + axis equal; + + # angle of the edge + theta = atan2(y2-y1, x2-x1); + + # point on the 'left' + xa1 = x2 - r.*l.*cos(theta) - w.*sin(theta)/2; + ya1 = y2 - r.*l.*sin(theta) + w.*cos(theta)/2; + # point on the 'right' + xa2 = x2 - r.*l.*cos(theta) + w.*sin(theta)/2; + ya2 = y2 - r.*l.*sin(theta) - w.*cos(theta)/2; + # point on the middle of the arrow + xa3 = x2 - l.*cos(theta).*h; + ya3 = y2 - l.*sin(theta).*h; + + # draw main edge + tmp = line([x1'; x2'], [y1'; y2'], 'color', [0 0 1]); + handle.body = tmp; + + # draw only 2 wings + ind = find(h==0); + if !isempty (ind) + tmp = line([xa1(ind)'; x2(ind)'], [ya1(ind)'; y2(ind)'], 'color', [0 0 1]); + handle.wing(:,1) = tmp; + + tmp = line([xa2(ind)'; x2(ind)'], [ya2(ind)'; y2(ind)'], 'color', [0 0 1]); + handle.wing(:,2) = tmp; + end + + + # draw a full arrow + ind = find(h~=0); + if !isempty (ind) + tmp = patch([x2(ind) xa1(ind) xa3(ind) xa2(ind) x2(ind)]', ... + [y2(ind) ya1(ind) ya3(ind) ya2(ind) y2(ind)]', [0 0 1]); + handle.head = tmp; + end + + if nargout>0 + varargout{1} = handle; + end + + if ~old_hold + hold off + end + +endfunction + +%!demo +%! # Orthogonal projection respect to vector b +%! dim = 2; +%! b = 2*rand(dim,1); +%! P = eye(dim) - (b*b')/(b'*b); +%! v = 2*rand(dim,1)-1; +%! Pv = P*v; +%! +%! # Draw the vectors +%! clf; +%! h = drawArrow ([zeros(3,dim) [b'; v'; Pv']],1,0.1); +%! +%! # Color them +%! arrayfun(@(x,y)set(x,'color',y), [h.body; h.wing(:)],repmat(['rgb']',3,1)); +%! # Name them +%! legend (h.body, {'b','v','Pv'},'location','northoutside','orientation','horizontal'); + diff --git a/tools/visualization/drawBelief.m b/tools/visualization/drawBelief.m new file mode 100644 index 0000000..74a4c14 --- /dev/null +++ b/tools/visualization/drawBelief.m @@ -0,0 +1,12 @@ +function drawBelief(state_belief_, map_) + + #invert belief value for plotting (0:black: 100% confidence, 1:white: 0% confidence) + plotted_state_belief_ = flipud(ones(size(state_belief_)) - state_belief_); + + #plot a colormap with the respective belief values + colormap(gray(64)); + hold on; + image([0.5, columns(map_)-0.5], [0.5, rows(map_)-0.5], plotted_state_belief_*64); + hold off; +endfunction + diff --git a/tools/visualization/drawCircle.m b/tools/visualization/drawCircle.m new file mode 100644 index 0000000..c1ad2ae --- /dev/null +++ b/tools/visualization/drawCircle.m @@ -0,0 +1,124 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{h} = } drawCircle (@var{x0}, @var{y0}, @var{r}) +## @deftypefnx {Function File} {@var{h} = } drawCircle (@var{circle}) +## @deftypefnx {Function File} {@var{h} = } drawCircle (@var{center}, @var{radius}) +## @deftypefnx {Function File} {@var{h} = } drawCircle (@dots{}, @var{nstep}) +## @deftypefnx {Function File} {@var{h} = } drawCircle (@dots{}, @var{name}, @var{value}) +## Draw a circle on the current axis +## +## drawCircle(X0, Y0, R); +## Draw the circle with center (X0,Y0) and the radius R. If X0, Y0 and R +## are column vectors of the same length, draw each circle successively. +## +## drawCircle(CIRCLE); +## Concatenate all parameters in a Nx3 array, where N is the number of +## circles to draw. +## +## drawCircle(CENTER, RADIUS); +## Specify CENTER as Nx2 array, and radius as a Nx1 array. +## +## drawCircle(..., NSTEP); +## Specify the number of edges that will be used to draw the circle. +## Default value is 72, creating an approximation of one point for each 5 +## degrees. +## +## drawCircle(..., NAME, VALUE); +## Specifies plotting options as pair of parameters name/value. See plot +## documentation for details. +## +## +## H = drawCircle(...); +## return handles to each created curve. +## +## @seealso{circles2d, drawCircleArc, drawEllipse} +## @end deftypefn + +function varargout = drawCircle(varargin) + + # process input parameters + var = varargin{1}; + if size(var, 2) == 1 + x0 = varargin{1}; + y0 = varargin{2}; + r = varargin{3}; + varargin(1:3) = []; + + elseif size(var, 2) == 2 + x0 = var(:,1); + y0 = var(:,2); + r = varargin{2}; + varargin(1:2) = []; + + elseif size(var, 2) == 3 + x0 = var(:,1); + y0 = var(:,2); + r = var(:,3); + varargin(1) = []; + else + error('bad format for input in drawCircle'); + end + + # ensure each parameter is column vector + x0 = x0(:); + y0 = y0(:); + r = r(:); + + # default number of discretization steps + N = 72; + + # check if discretization step is specified + if ~isempty(varargin) + var = varargin{1}; + if length(var)==1 && isnumeric(var) + N = round(var); + varargin(1) = []; + end + end + + # parametrization variable for circle (use N+1 as first point counts twice) + t = linspace(0, 2*pi, N+1); + cot = cos(t); + sit = sin(t); + + # empty array for graphic handles + h = zeros(size(x0)); + + # compute discretization of each circle + for i = 1:length(x0) + xt = x0(i) + r(i) * cot; + yt = y0(i) + r(i) * sit; + + h(i) = plot(xt, yt, varargin{:}); + end + + if nargout > 0 + varargout = {h}; + end + +endfunction + diff --git a/tools/visualization/drawLabels.m b/tools/visualization/drawLabels.m new file mode 100644 index 0000000..afa6914 --- /dev/null +++ b/tools/visualization/drawLabels.m @@ -0,0 +1,100 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} drawLabels (@var{x}, @var{y}, @var{lbl}) +## @deftypefnx {Function File} drawLabels (@var{pos}, @var{lbl}) +## @deftypefnx {Function File} drawLabels (@dots{}, @var{numbers}, @var{format}) +## Draw labels at specified positions. +## +## DRAWLABELS(X, Y, LBL) draw labels LBL at position X and Y. +## LBL can be either a string array, or a number array. In this case, +## string are created by using sprintf function, with '#.2f' mask. +## +## DRAWLABELS(POS, LBL) draw labels LBL at position specified by POS, +## where POS is a N*2 int array. +## +## DRAWLABELS(..., NUMBERS, FORMAT) create labels using sprintf function, +## with the mask given by FORMAT (e. g. '#03d' or '5.3f'), and the +## corresponding values. +## @end deftypefn + +function varargout = drawLabels(varargin) + + # check if enough inputs are given + if isempty(varargin) + error('wrong number of arguments in drawLabels'); + end + + # process input parameters + var = varargin{1}; + if size(var, 2)==1 + if length(varargin)<3 + error('wrong number of arguments in drawLabels'); + end + px = var; + py = varargin{2}; + lbl = varargin{3}; + varargin(1:3) = []; + else + if length(varargin)<2 + error('wrong number of arguments in drawLabels'); + end + px = var(:,1); + py = var(:,2); + lbl = varargin{2}; + varargin(1:2) = []; + end + + format = '%.2f'; + if ~isempty(varargin) + format = varargin{1}; + end + if size(format, 1)==1 && size(px, 1)>1 + format = repmat(format, size(px, 1), 1); + end + + labels = cell(length(px), 1); + if isnumeric(lbl) + for i=1:length(px) + labels{i} = sprintf(format(i,:), lbl(i)); + end + elseif ischar(lbl) + for i=1:length(px) + labels{i} = lbl(i,:); + end + elseif iscell(lbl) + labels = lbl; + end + labels = char(labels); + + h = text(px+0.15, py, labels); + + if nargout>0 + varargout{1}=h; + end + +endfunction + diff --git a/tools/visualization/drawLandmarks.m b/tools/visualization/drawLandmarks.m new file mode 100644 index 0000000..2c229a7 --- /dev/null +++ b/tools/visualization/drawLandmarks.m @@ -0,0 +1,20 @@ +function done = drawLandmarks(land,draw_labels=false,color, mode) + + if(nargin == 2) + color = 'r'; + mode = 'fill'; + end + + N = length(land); + radius = 0.1; + for i=1:N + drawShape('circle', [land(i).x_pose, land(i).y_pose, radius], mode, color); + hold on; + if(draw_labels) + drawLabels(land(i).x_pose, land(i).y_pose, land(i).id, '%d'); + hold on; + end + end +end + + diff --git a/tools/visualization/drawLandmarks_slam.m b/tools/visualization/drawLandmarks_slam.m new file mode 100644 index 0000000..d99c847 --- /dev/null +++ b/tools/visualization/drawLandmarks_slam.m @@ -0,0 +1,22 @@ +function done = drawLandmarks_slam(mean, state_to_id_map) + + color = 'r'; + mode = 'fill'; + + + N = size(mean,1)/2; + radius = 0.1; + for i=1:2:2*N + + land_id = state_to_id_map((i+1)/2); % recover the id of the landmark + land_x = mean(i,1); + land_y = mean(i+1,1); + + drawShape('circle', [land_x, land_y, radius], mode, color) + hold on; + drawLabels(land_x, land_y, land_id, '%d'); + hold on; + end + + +end diff --git a/tools/visualization/drawLine.m b/tools/visualization/drawLine.m new file mode 100644 index 0000000..fe06bdc --- /dev/null +++ b/tools/visualization/drawLine.m @@ -0,0 +1,210 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{h} =} drawLine (@var{line}) +## @deftypefnx {Function File} {@var{h} =} drawLine (@var{line}, @var{param},@var{value}) +## Draw the line on the current axis. +## +## Draws the line LINE on the current axis, by using current axis to clip +## the line. Extra @var{param},@var{value} pairs are passed to the @code{line} function. +## Returns a handle to the created line object. If clipped line is not +## contained in the axis, the function returns -1. +## +## Example +## +## @example +## figure; hold on; axis equal; +## axis([0 100 0 100]); +## drawLine([30 40 10 20]); +## drawLine([30 40 20 -10], 'color', 'm', 'linewidth', 2); +## @end example +## +## @seealso{lines2d, createLine, drawEdge} +## @end deftypefn + +function varargout = drawLine(lin, varargin) + + # default style for drawing lines + varargin = [{'color', 'b'}, varargin]; + + # extract bounding box of the current axis + xlim = get(gca, 'xlim'); + ylim = get(gca, 'ylim'); + + # clip lines with current axis box + clip = clipLine(lin, [xlim ylim]); + ok = isfinite(clip(:,1)); + + # initialize result array to invalide handles + h = -1*ones(size(lin, 1), 1); + + # draw valid lines + h(ok) = line(clip(ok, [1 3])', clip(ok, [2 4])', varargin{:}); + + # return line handle if needed + if nargout>0 + varargout{1}=h; + end + +endfunction + +%!demo +%! figure; hold on; axis equal; +%! axis([0 100 0 100]); +%! drawLine([30 40 10 20]); +%! drawLine([30 40 20 -10], 'color', 'm', 'linewidth', 2); + +%!shared privpath +%! privpath = [fileparts(which('geom2d_Contents')) filesep() 'private']; + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [30 40 10 0]; +%! edge = [0 40 100 40]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [30 40 -10 0]; +%! edge = [100 40 0 40]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [30 140 10 0]; +%! hl = drawLine(line); +%! assertEqual(-1, hl); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [30 40 0 10]; +%! edge = [30 0 30 100]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [30 40 0 -10]; +%! edge = [30 100 30 0]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [140 30 0 10]; +%! hl = drawLine(line); +%! assertEqual(-1, hl); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [80 30 10 10]; +%! edge = [50 0 100 50]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [20 70 10 10]; +%! edge = [0 50 50 100]; +%! hl = drawLine(line); +%! assertElementsAlmostEqual(edge([1 3]), get(hl, 'xdata')); +%! assertElementsAlmostEqual(edge([2 4]), get(hl, 'ydata')); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [140 -30 10 10]; +%! hl = drawLine(line); +%! assertEqual(-1, hl); +%! line = [-40 130 10 10]; +%! hl = drawLine(line); +%! assertEqual(-1, hl); +%! rmpath (privpath); + +%!test +%! addpath (privpath,'-end') +%! box = [0 100 0 100]; +%! hf = figure('visible','off'); +%! axis(box); +%! line = [... +%! 80 30 10 10; ... +%! 20 70 10 10; ... +%! 140 -30 10 10; ... +%! -40 130 10 10]; +%! edge = [... +%! 50 0 100 50; ... +%! 0 50 50 100]; +%! hl = drawLine(line); +%! assertEqual(4, length(hl)); +%! assertElementsAlmostEqual(edge(1, [1 3]), get(hl(1), 'xdata')); +%! assertElementsAlmostEqual(edge(1, [2 4]), get(hl(1), 'ydata')); +%! assertElementsAlmostEqual(edge(2, [1 3]), get(hl(2), 'xdata')); +%! assertElementsAlmostEqual(edge(2, [2 4]), get(hl(2), 'ydata')); +%! assertEqual(-1, hl(3)); +%! assertEqual(-1, hl(4)); +%! rmpath (privpath); + diff --git a/tools/visualization/drawMap.m b/tools/visualization/drawMap.m new file mode 100644 index 0000000..f5e3b7b --- /dev/null +++ b/tools/visualization/drawMap.m @@ -0,0 +1,19 @@ +function drawMap(map_) + hold on; + map_rows = rows(map_); + map_cols = columns(map_); + for row = 1:map_rows + for col = 1:map_cols + + #draw a black block if the map element is occupied (e.g. wall) + #since the plotting command does not reason in matrix rows we have to shift them + if(map_(row, col) == 1) + rectangle("Position", [col-1 map_rows-row 1 1], "FaceColor", "black"); + else + rectangle("Position", [col-1 map_rows-row 1 1], "FaceColor", "white"); + endif + endfor + endfor + hold off; +endfunction + diff --git a/tools/visualization/drawObservations.m b/tools/visualization/drawObservations.m new file mode 100644 index 0000000..7984d1c --- /dev/null +++ b/tools/visualization/drawObservations.m @@ -0,0 +1,43 @@ +function out = drawObservations(pose, observations) + + N = length(observations.observation); + l = 1.5; + + if N > 0 + + #determine highlight mode + mode = 'points'; + if isfield(observations.observation(1),'bearing') + mode = 'bearing'; + end + + hold on; + + #for each observation + for i=1:N + current_observation = observations.observation(i); + + #default: points + if strcmp(mode, 'points') + + #draw points - with pointers towards them + land_obs = [current_observation.x_pose; current_observation.y_pose; 0]; + land_abs_pose = t2v(v2t(pose)*v2t(land_obs)); + current_observation.x_pose = land_abs_pose(1); + current_observation.y_pose = land_abs_pose(2); + drawShape('circle', [land_abs_pose(1), land_abs_pose(2), 0.2], 'fill', 'b'); + + else + + #draw measured bearing + land_obs = current_observation.bearing; + incr_y = sin(land_obs)*l; + incr_x = cos(land_obs)*l; + ray_x = pose(1) + incr_x*cos(pose(3)) - incr_y*sin(pose(3)); + ray_y = pose(2) + incr_y*cos(pose(3)) + incr_x*sin(pose(3)); + plot([pose(1) ray_x] , [pose(2) ray_y], 'b', 'linewidth', 1.5); + endif + endfor + endif +endfunction + diff --git a/tools/visualization/drawObservationsBayes.m b/tools/visualization/drawObservationsBayes.m new file mode 100644 index 0000000..de8dded --- /dev/null +++ b/tools/visualization/drawObservationsBayes.m @@ -0,0 +1,21 @@ +function drawObservations(map_, observations_, row_, col_) + map_rows = rows(map_); + hold on; + + #check the observation array + if (observations_(1)) #UP + rectangle("Position", [col_-1 map_rows-row_+1 1 0.5], "FaceColor", "blue", "EdgeColor", "none"); + endif + if (observations_(2)) #DOWN + rectangle("Position", [col_-1 map_rows-row_-0.5 1 0.5], "FaceColor", "blue", "EdgeColor", "none"); + endif + if (observations_(3)) #LEFT + rectangle("Position", [col_-1.5 map_rows-row_ 0.5 1], "FaceColor", "blue", "EdgeColor", "none"); + endif + if (observations_(4)) #RIGHT + rectangle("Position", [col_ map_rows-row_ 0.5 1], "FaceColor", "blue", "EdgeColor", "none"); + endif + + hold off; +endfunction + diff --git a/tools/visualization/drawParticles.m b/tools/visualization/drawParticles.m new file mode 100644 index 0000000..923f37d --- /dev/null +++ b/tools/visualization/drawParticles.m @@ -0,0 +1,20 @@ +function out = drawParticles(samples, weights, best_particle, gt_pose) + + dim_particles = size(samples,2); + + hold on; + plot(samples(1,:), samples(2,:), 'b.'); + + hold on; + plot(gt_pose.x, gt_pose.y, 'c.'); + hold on; + drawCircle(gt_pose.x, gt_pose.y, 0.5); + + if best_particle > 0 + hold on; + drawCircle(samples(1,best_particle), samples(2,best_particle), 0.5); + hold on; + drawRobot(samples(:,best_particle)); + endif + +endfunction diff --git a/tools/visualization/drawPolygon.m b/tools/visualization/drawPolygon.m new file mode 100644 index 0000000..b5cf668 --- /dev/null +++ b/tools/visualization/drawPolygon.m @@ -0,0 +1,145 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{h} = } drawPolygon (@var{coord}) +## @deftypefnx {Function File} {@var{h} = } drawPolygon (@var{px}, @var{py}) +## @deftypefnx {Function File} {@var{h} = } drawPolygon (@var{polys}) +## Draw a polygon specified by a list of points. +## +## drawPolygon(COORD); +## Packs coordinates in a single [N*2] array. +## +## drawPolygon(PX, PY); +## Specifies coordinates in separate arrays. +## +## drawPolygon(POLYS) +## Packs coordinate of several polygons in a cell array. Each element of +## the array is a Ni*2 double array. +## +## H = drawPolygon(...); +## Also return a handle to the list of line objects. +## +## +## @seealso{polygons2d, drawCurve} +## @end deftypefn + +function varargout = drawPolygon(varargin) + + # check input + if isempty(varargin) + error('need to specify a polygon'); + end + + var = varargin{1}; + + state = ishold(gca); + hold on; + + ## Manage cell arrays of polygons + + # case of a set of polygons stored in a cell array + if iscell(var) + N = length(var); + h = zeros(N, 1); + for i = 1:N + # check for empty polygons + if ~isempty(var{i}) + h(i) = drawPolygon(var{i}, varargin{2:end}); + end + end + + if nargout > 0 + varargout = {h}; + end + + if ~state + hold off + end + + return; + end + + + ## Parse coordinates and options + + # Extract coordinates of polygon vertices + if size(var, 2) > 1 + # first argument is a polygon array + px = var(:, 1); + py = var(:, 2); + varargin(1) = []; + else + # arguments 1 and 2 correspond to x and y coordinate respectively + if length(varargin) < 2 + error('Should specify either a N-by-2 array, or 2 N-by-1 vectors'); + end + + px = varargin{1}; + py = varargin{2}; + varargin(1:2) = []; + end + + # set default line format + if isempty(varargin) + varargin = {'b-'}; + end + + # check case of polygons with holes + if sum(isnan(px(:))) > 0 + polygons = splitPolygons([px py]); + h = drawPolygon(polygons); + + if nargout > 0 + varargout = {h}; + end + + if ~state + hold off + end + + return; + end + + + ## Draw the polygon + + # ensure last point is the same as the first one + px(size(px, 1)+1, :) = px(1,:); + py(size(py, 1)+1, :) = py(1,:); + + # draw the polygon outline + h = plot(px, py, varargin{:}); + + if ~state + hold off + end + + # format output arg + if nargout > 0 + varargout = {h}; + end + +endfunction diff --git a/tools/visualization/drawRect.m b/tools/visualization/drawRect.m new file mode 100644 index 0000000..4169f52 --- /dev/null +++ b/tools/visualization/drawRect.m @@ -0,0 +1,96 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{r} = } drawRect (@var{x}, @var{y}, @var{w}, @var{h}) +## @deftypefnx {Function File} {@var{r} = } drawRect (@var{x}, @var{y}, @var{w}, @var{h}, @var{theta}) +## @deftypefnx {Function File} {@var{r} = } drawRect (@var{coord}) +## Draw rectangle on the current axis. +## +## r = DRAWRECT(x, y, w, h) draw rectangle with width W and height H, at +## position (X, Y). +## the four corners of rectangle are then : +## (X, Y), (X+W, Y), (X, Y+H), (X+W, Y+H). +## +## r = DRAWRECT(x, y, w, h, theta) also specifies orientation for +## rectangle. Theta is given in degrees. +## +## r = DRAWRECT(coord) is the same as DRAWRECT(X,Y,W,H), but all +## parameters are packed into one array, whose dimensions is 4*1 or 5*1. +## +## +## @seealso{drawBox, drawOrientedBox} +## @end deftypefn + +function varargout = drawRect(varargin) + + # default values + theta = 0; + + # get entered values + if length(varargin) > 3 + x = varargin{1}; + y = varargin{2}; + w = varargin{3}; + h = varargin{4}; + if length(varargin)> 4 + theta = varargin{5} * pi / 180; + end + + else + coord = varargin{1}; + x = coord(1); + y = coord(2); + w = coord(3); + h = coord(4); + if length(coord) > 4 + theta = coord(5) * pi / 180; + end + end + + r = zeros(size(x)); + for i = 1:length(x) + tx = zeros(5, 1); + ty = zeros(5, 1); + tx(1) = x(i); + ty(1) = y(i); + tx(2) = x(i) + w(i) * cos(theta(i)); + ty(2) = y(i) + w(i) * sin(theta(i)); + tx(3) = x(i) + w(i) * cos(theta(i)) - h(i) * sin(theta(i)); + ty(3) = y(i) + w(i) * sin(theta(i)) + h(i) * cos(theta(i)); + tx(4) = x(i) - h(i) * sin(theta(i)); + ty(4) = y(i) + h(i) * cos(theta(i)); + tx(5) = x(i); + ty(5) = y(i); + + r(i) = line(tx, ty); + end + + if nargout > 0 + varargout{1} = r; + end + +endfunction + diff --git a/tools/visualization/drawRectangle.m b/tools/visualization/drawRectangle.m new file mode 100644 index 0000000..83147ff --- /dev/null +++ b/tools/visualization/drawRectangle.m @@ -0,0 +1,6 @@ +function drawRectangleInMap(map_, row_, col_, color_code_) + hold on; + rectangle("Position", [col_-1 rows(map_)-row_ 1 1], "FaceColor", color_code_); + hold off; +endfunction + diff --git a/tools/visualization/drawRobot.m b/tools/visualization/drawRobot.m new file mode 100644 index 0000000..7a7efae --- /dev/null +++ b/tools/visualization/drawRobot.m @@ -0,0 +1,9 @@ +function out = drawRobot(pose, covariance) + + hold on; + dim = 0.25; + arr_len = 0.5; + + drawShape('rect', [pose(1), pose(2), dim, dim, pose(3)], 'fill','g'); + +end diff --git a/tools/visualization/drawShape.m b/tools/visualization/drawShape.m new file mode 100644 index 0000000..4242898 --- /dev/null +++ b/tools/visualization/drawShape.m @@ -0,0 +1,111 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} drawShape (@var{type}, @var{param}) +## @deftypefnx {Function File} drawShape (@dots{}, @var{option}) +## Draw various types of shapes (circles, polygons...). +## +## drawShape(TYPE, PARAM) +## Draw the shape of type TYPE, specified by given parameter PARAM. TYPE +## can be one of 'circle', 'ellipse', 'rect', 'polygon', 'curve' +## PARAM depend on the type. For example, if TYPE is 'circle', PARAM will +## contain [x0 y0 R]. +## +## Examples : +## @example +## drawShape('circle', [20 10 30]); +## Draw circle centered on [20 10] with radius 10. +## drawShape('rect', [20 20 40 10 pi/3]); +## Draw rectangle centered on [20 20] with length 40 and width 10, and +## oriented pi/3 wrt axis Ox. +## @end example +## +## drawShape(..., OPTION) +## also specifies drawing options. OPTION can be 'draw' (default) or +## 'fill'. +## @end deftypefn +function varargout = drawShape(type, param, varargin) + + if ~iscell(type) + type = {type}; + end + if ~iscell(param) + tmp = cell(1, size(param, 1)); + for i=1:size(param, 1) + tmp{i} = param(i,:); + end + param = tmp; + end + + option = 'draw'; + if ~isempty(varargin) + var = varargin{1}; + if strcmpi(var, 'fill') + option = 'fill'; + end + end + %BART MOD +color = varargin{2}; + + # transform each shape into a polygon + shape = cell(1,length(type)); + for i=1:length(type) + if strcmpi(type{i}, 'circle') + shape{i} = circleAsPolygon(param{i}, 128); + elseif strcmpi(type{i}, 'rect') + shape{i} = rectAsPolygon(param{i}); + elseif strcmpi(type{i}, 'polygon') + shape{i} = param{i}; + end + end + + + holded = false; + if ~ishold(gca) + %hold on; %BART MOD + holded = true; + end + + h = zeros(length(shape), 1); + if strcmp(option, 'draw') + for i=1:length(shape) + h(i) = drawPolygon(shape{i}); + end + else + for i=1:length(shape) + h(i) = fillPolygon(shape{i},color); + end + end + + if holded + hold off + end + + if nargout>0 + varargout{1}=h; + end + +endfunction diff --git a/tools/visualization/drawTrajectoryXY.m b/tools/visualization/drawTrajectoryXY.m new file mode 100644 index 0000000..2d38ecb --- /dev/null +++ b/tools/visualization/drawTrajectoryXY.m @@ -0,0 +1,15 @@ +function drawTrajectoryXY(trajectory_) + + #for each position in the trajectory + for u = 1:rows(trajectory_)-1 + + #draw line from begin to end + x_begin = trajectory_(u, 1); + y_begin = trajectory_(u, 2); + x_end = trajectory_(u+1, 1); + y_end = trajectory_(u+1, 2); + plot([x_begin x_end], [y_begin y_end], "k", "linewidth", 2); + hold on; + endfor +endfunction + diff --git a/tools/visualization/fillPolygon.m b/tools/visualization/fillPolygon.m new file mode 100644 index 0000000..0393f36 --- /dev/null +++ b/tools/visualization/fillPolygon.m @@ -0,0 +1,106 @@ +## Copyright (C) 2003-2011 David Legland +## Copyright (C) 2016 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## The views and conclusions contained in the software and documentation are +## those of the authors and should not be interpreted as representing official +## policies, either expressed or implied, of the copyright holders. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{h} =} fillPolygon (@var{p}) +## @deftypefnx {Function File} {@var{h} =} fillPolygon (@var{px},@var{py}) +## Fill a polygon specified by a list of points +## +## @var{p} is a single [N*2] array. +## With one input argument, it fills the interior of the polygon specified +## by @var{p}. The boundary of the polygon is not drawn, use 'drawPolygon' +## to do it. +## +## If @var{p} contains NaN-couples, each portion between the [NaN;NaN] will +## be filled separately. +## +## Two input arguments specify coordinates of the polygon in separate arrays. +## +## Also returns a handle to the created patch. +## +## @seealso{polygons2d, drawCurve, drawPolygon} +## @end deftypefn + +function h = fillPolygon (varargin) + + # check input + if isempty (varargin) + error ('need to specify a polygon'); + end + + # case of a set of polygons stored in a cell array + var = varargin{1}; + if iscell (var) + N = length (var); + h = zeros (N, 1); + for i = 1:N + # check for empty polygons + if ~isempty (var{i}) + h(i) = fillPolygon (var{i}, varargin{2:end}); + end + end + + return; + end + + # Extract coordinates of polygon vertices + if size (var, 2) > 1 + # first argument is a polygon array + px = var(:, 1); + py = var(:, 2); + varargin(1) = []; + else + # arguments 1 and 2 correspond to x and y coordinate respectively + if length (varargin) < 2 + error ('should specify either a N*2 array, or 2 N*1 vectors'); + end + + px = varargin{1}; + py = varargin{2}; + varargin(1:2) = []; + end + + # Find position of breaks, and copies first point of each loop at the + # end + inds = find (isnan (px(:))); + i1 = [inds ; length(px)+1]; + i0 = [1 ; inds+1]; + + px(i1, :) = px(i0, :); + py(i1, :) = py(i0, :); + + # set default line format + if isempty (varargin) + varargin = {'b'}; + end + + # fill the polygon with desired style + h = fill (px, py, varargin{:});%, 'lineStyle', 'none'); + +endfunction + diff --git a/tools/visualization/plotState.m b/tools/visualization/plotState.m new file mode 100644 index 0000000..255a347 --- /dev/null +++ b/tools/visualization/plotState.m @@ -0,0 +1,50 @@ +function out = plotState(varargin) + landmarks = varargin{1}; + pose = varargin{2}; + if (nargin > 2) + covariance = varargin{3}; + observations = varargin{4}; + endif + + #check if we have additional input + if (nargin > 4) + trajectory = varargin{5}; + endif + + robot_pose = pose(1:3); + state_dim = size(pose,1); + map_size = (state_dim - 3)/2; #number of landmarks in the state (if any) + + if(nargin == 2) %init step + hold off; + drawLandmarks(landmarks); + drawRobot(robot_pose, zeros(3)); + else + hold off; + + #draw robot trajectory + if (nargin > 4) + drawTrajectoryXY(trajectory); + endif + + #highlight current observations + drawObservations(robot_pose, observations); + + #draw landmarks + drawLandmarks(landmarks); + + #plot robot covariance + plotcov2d(robot_pose(1),robot_pose(2),covariance(1:2,1:2),'k', 1); + + #plot landmark covariances (if any) + for i=4:2:2*(map_size+1) + plotcov2d(pose(i,1), pose(i+1,1), covariance(i:i+1,i:i+1),'r',1); + endfor + + #draw robot pose + drawRobot(robot_pose, covariance); + + endif + axis([-11, 11, -11, 11]); + drawnow; +endfunction diff --git a/tools/visualization/plotStateEKFSLAM.m b/tools/visualization/plotStateEKFSLAM.m new file mode 100644 index 0000000..1ee49d8 --- /dev/null +++ b/tools/visualization/plotStateEKFSLAM.m @@ -0,0 +1,36 @@ +function out = plotStateEKFSLAM(mean, covariance, observations, state_to_id_map, trajectory_) + + robot_pose = mean(1:3); + state_dim = size(mean,1); + map_size = (state_dim - 3)/2; #number of landmark(if any) + + if(nargin == 2) %init step + hold on; + #axis([-12 12 -12 12]); + drawRobot(robot_pose, zeros(3)); + else + hold off; + + #draw robot trajectory + drawTrajectoryXY(trajectory_); + + %draw landmarks + if(map_size > 0) + drawLandmarks_slam(mean(4:end), state_to_id_map); + end + + drawRobot(robot_pose, covariance); + if(length(observations) > 0) + drawHighlObservations(robot_pose,observations); + endif + #plot robot covariance + plotcov2d(robot_pose(1),robot_pose(2),covariance(1:2,1:2),'k', 1); + #plot landmark(if any) covariance + for i=4:2:2*(map_size+1) + plotcov2d(mean(i,1), mean(i+1,1), covariance(i:i+1,i:i+1),'r',1); + end + + end + drawnow; + +end diff --git a/tools/visualization/plotStatePF.m b/tools/visualization/plotStatePF.m new file mode 100644 index 0000000..464bcf2 --- /dev/null +++ b/tools/visualization/plotStatePF.m @@ -0,0 +1,11 @@ +function out = plotStatePF(samples, weights, landmarks, best_particle, gt_pose) + +hold off; + +drawLandmarks(landmarks); +drawParticles(samples, weights, best_particle, gt_pose); + +drawnow; + +end + diff --git a/tools/visualization/plotcov2d.m b/tools/visualization/plotcov2d.m new file mode 100644 index 0000000..1daef74 --- /dev/null +++ b/tools/visualization/plotcov2d.m @@ -0,0 +1,50 @@ +function h = plotcov2d( centerX, centerY, cov, color, sigmaFactor) +% PLOTCOV2D Hacked-together function that plops a basic representation of covariance onto a graph +% IN: centerX - x coordinate of center point of the covariance +% centerY - y coordinate of center point of the covariance +% cov - covariance matrix, duh :) +% color - Color to plot in (e.g. 'r', 'g', etc.) +% Note: The filling command, especially with alpha, doesn't seem to work in octave + +% Some of this code is borrowed from sample code at: +% http://www.cs.columbia.edu/~jebara/6998-01/matlab.html + +cov = [cov(1,1) cov(1,2); cov(2,1) cov(2,2)]; + +mu = [ centerX; centerY]; +[V,D]=eig(cov); +lam1 = D(1,1); +lam2 = D(2,2); +if lam1 < 0 || lam2 < 0 % adapted to octave | to || by Bartolomeo Della Corte + disp("Non-positive definite matrix:"); + disp(cov); + return; +end +v1 = V(:,1); +v2 = V(:,2); +%if v1(1)==0 +% theta = deg2rad(90); +%else +% theta = atan(v1(2)/v1(1)); +%end +theta = atan2(v1(2),v1(1)); + + +a = sigmaFactor*sqrt(lam1); +b = sigmaFactor*sqrt(lam2); + +% plot the ellipse +np = 500; +ang = [0:np]*2*pi/np; +R = [cos(theta) -sin(theta); sin(theta) cos(theta)]; +pts = [centerX;centerY]*ones(size(ang)) + R*[cos(ang)*a; sin(ang)*b]; + +h=plot( pts(1,:), pts(2,:), 'Color', color); + +hold on +minor1 = mu-a*v1; +minor2 = mu+a*v1; +line([minor1(1) minor2(1)], [minor1(2) minor2(2)], 'Color', color) +major1 = mu-b*v2; major2 = mu+b*v2; +hl=line([major1(1) major2(1)], [major1(2) major2(2)], 'Color', color); + diff --git a/tools/visualization/polygons2d.m b/tools/visualization/polygons2d.m new file mode 100644 index 0000000..a12d38c --- /dev/null +++ b/tools/visualization/polygons2d.m @@ -0,0 +1,172 @@ +## Copyright (C) 2004-2011 David Legland +## Copyright (C) 2004-2011 INRA - CEPIA Nantes - MIAJ (Jouy-en-Josas) +## Copyright (C) 2012 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +## -*- texinfo -*- +## @deftypefn {Function File} {} polygons2d () +## Description of functions operating on 2D polygons +## +## The 'polygons' module contains functions operating on shapes composed +## of a vertex list, like polygons or polylines. +## +## We call 'polyline' the curve defined by a series of vertices. +## A polyline can be either closed or open, depending on whether the last +## vertex is connected to the first one or not. This can be given as an +## option is some functions in the module. +## A 'polygon' is the planar domain delimited by a closed polyline. We +## sometimes want to consider 'complex polygons', whose boundary is +## composed of several disjoint domains. The domain defined by a single +## closed polyline is called 'simple polygon'. +## We call 'curve' a polyline with many vertices, such that the polyline +## can be considered as a discrete approximation of a "real" curve. +## +## A simple polygon or polyline is represented by a N-by-2 array, each row +## of the array representing the coordinates of a vertex. +## Simple polygons are assumed to be closed, so there is no need to repeat +## the first vertex at the end. +## As both polygons and polylines can be represented by a list of vertex +## coordinates, some functions also consider the vertex list itself. Such +## functions are prefixed by 'pointSet'. Also, many functions prefixed by +## 'polygon' or 'polyline' works also on the other type of shape. +## +## For multiple-connected polygons, the different connected boundaries are +## separated by a row [NaN NaN]. +## +## For some functions, the orientation of the polygon can be relevant: CCW +## stands for 'Conter-Clockwise' (positive orientation), CW stands for +## 'Clockwise'. +## +## Polylines are parametrized in the following way: +## * the i-th vertex is located at position i-1 +## * points of the i-th edge have positions ranging linearly from i-1 to i +## The parametrization domain for an open polyline is from 0 to Nv-1, and +## from 0 to Nv for a closed polyline (positions 0 and Nv correspond to +## the same point). +## +## Example: +## # Simple polygon: +## P1 = [1 1;2 1;2 2;1 2]; +## drawPolygon(P1); +## axis([0 5 0 5]); +## # Multiple polygon: +## P2 = [10 10;40 10;40 40;10 40;NaN NaN;20 20;20 30;30 30;30 20]; +## figure;drawPolygon(P2); axis([0 50 0 50]); +## +## +## Point Sets +## pointSetBounds - Bounding box of a set of points +## pointSetsAverage - Compute the average of several point sets +## minimumCaliperDiameter - Minimum caliper diameter of a set of points +## findPoint - Find index of a point in an set from its coordinates +## +## Polylines +## polylinePoint - Extract a point from a polyline +## polylineLength - Return length of a polyline given as a list of points +## polylineCentroid - Compute centroid of a curve defined by a series of points +## polylineSubcurve - Extract a portion of a polyline +## reversePolyline - Reverse a polyline, by iterating vertices from the end +## isPointOnPolyline - Test if a point belongs to a polyline +## projPointOnPolyline - Compute position of a point projected on a polyline +## distancePointPolyline - Compute shortest distance between a point and a polyline +## distancePolylines - Compute the shortest distance between 2 polylines +## intersectPolylines - Find the common points between 2 polylines +## polylineSelfIntersections - Find self-intersections points of a polyline +## +## Curves (polylines with lot of vertices) +## parametrize - Parametrization of a curve, based on edges length +## curvature - Estimate curvature of a polyline defined by points +## cart2geod - Convert cartesian coordinates to geodesic coord. +## geod2cart - Convert geodesic coordinates to cartesian coord. +## curveMoment - Compute inertia moment of a 2D curve +## curveCMoment - Compute centered inertia moment of a 2D curve +## curveCSMoment - Compute centered scaled moment of a 2D curve +## +## Polygons +## polygonPoint - Extract a point from a polygon +## polygonSubcurve - Extract a portion of a polygon +## reversePolygon - Reverse a polygon, by iterating vertices from the end +## projPointOnPolygon - Compute position of a point projected on a polygon +## splitPolygons - Convert a NaN separated polygon list to a cell array of polygons +## clipPolygon - Clip a polygon with a rectangular box +## clipPolygonHP - Clip a polygon with a Half-plane defined by a directed line +## intersectLinePolygon - Intersection points between a line and a polygon +## intersectRayPolygon - Intersection points between a ray and a polygon +## polygonSelfIntersections - Find-self intersection points of a polygon +## convexHull - Convex hull of a set of points +## polygonLoops - Divide a possibly self-intersecting polygon into a set of simple loops +## expandPolygon - Expand a polygon by a given (signed) distance +## medialAxisConvex - Compute medial axis of a convex polygon +## +## Measures on Polygons +## isPointInPolygon - Test if a point is located inside a polygon +## polygonContains - Test if a point is contained in a multiply connected polygon +## polygonCentroid - Compute the centroid (center of mass) of a polygon +## polygonArea - Compute the signed area of a polygon +## polygonLength - Perimeter of a polygon +## polygonNormalAngle - Compute the normal angle at a vertex of the polygon +## polygonBounds - Compute the bounding box of a polygon +## distancePointPolygon - Compute shortest distance between a point and a polygon +## distancePolygons - Compute the shortest distance between 2 polygons +## +## Triangles +## isPointInTriangle - Test if a point is located inside a triangle +## triangleArea - Area of a triangle +## +## Functions from stochastic geometry +## steinerPoint - Compute steiner point (weighted centroid) of a polygon +## steinerPolygon - Create a Steiner polygon from a set of vectors +## supportFunction - Compute support function of a polygon +## convexification - Compute the convexification of a polygon +## +## Input, Output and conversions +## readPolygon - Read a polygon stored in a file +## polygonToRow - Convert polygon coordinates to a row vector +## rowToPolygon - Create a polygon from a row vector +## rectAsPolygon - Convert a (centered) rectangle into a series of points +## +## Drawing functions +## drawPolyline - Draw a polyline specified by a list of points +## drawPolygon - Draw a polygon specified by a list of points +## fillPolygon - Fill a polygon specified by a list of points +## +## +## Credits: +## * function intersectPolylines uses the 'interX' contribution from "NS" +## (file exchange 22441, called 'curve-intersections') +## +## ----- +## Author: David Legland +## e-mail: david.legland@@grignon.inra.fr +## created the 07/11/2005. +## Homepage: @url{http://matgeom.sourceforge.net/} +## @url{http://www.pfl-cepia.inra.fr/index.php?page=geom2d} +## Copyright INRA - Cepia Software Platform. +## +## @end deftypefn + +function polygons2d () + +help('polygons2d'); + +endfunction diff --git a/tools/visualization/rectAsPolygon.m b/tools/visualization/rectAsPolygon.m new file mode 100644 index 0000000..a05fb64 --- /dev/null +++ b/tools/visualization/rectAsPolygon.m @@ -0,0 +1,74 @@ +## Copyright (C) 2003-2011 David Legland +## Copyright (C) 2016 Adapted to Octave by Juan Pablo Carbajal +## All rights reserved. +## +## Redistribution and use in source and binary forms, with or without +## modification, are permitted provided that the following conditions are met: +## +## 1 Redistributions of source code must retain the above copyright notice, +## this list of conditions and the following disclaimer. +## 2 Redistributions in binary form must reproduce the above copyright +## notice, this list of conditions and the following disclaimer in the +## documentation and/or other materials provided with the distribution. +## +## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' +## AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +## ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR +## ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +## SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +## CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## +## The views and conclusions contained in the software and documentation are +## those of the authors and should not be interpreted as representing official +## policies, either expressed or implied, of the copyright holders. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{p} =} rectAsPolygon (@var{rect}) +## @deftypefnx {Function File} {[@var{x}, @var{y}] =} rectAsPolygon (@var{rect}) +## Convert a (centered) rectangle into a series of points +## +## Converts rectangle given as [x0 y0 w h] or [x0 y0 w h theta] into a +## 4*2 array double, containing coordinate of rectangle vertices. +## with two output arguments the coordinates are splitted in @var{x} and @var{y}. +## +## @seealso{polygons2d, drawRect, drawRect2, drawPolygon, drawShape} +## @end deftypefn + +function [tx ty] = rectAsPolygon (rect) + + theta = 0; + x = rect(1); + y = rect(2); + w = rect(3) / 2; # easier to compute with w and h divided by 2 + h = rect(4) / 2; + if length (rect) > 4 + theta = rect(5); + endif + + v = [cos(theta); sin(theta)]; + + #M = [-1 1; 1 1; 1 -1; -1 -1] .* [w h]; + M = bsxfun (@times, [-1 1; 1 1; 1 -1; -1 -1], [w h]); + + tx = x + M * v; + ty = y + M(4:-1:1,[2 1]) * v; + # tx(1) = x - w*cot + h*sit; + # tx(2) = x + w*cot + h*sit; + # tx(3) = x + w*cot - h*sit; + # tx(4) = x - w*cot - h*sit; + + # ty(1) = y - h*cot - w*sit ; + # ty(2) = y - h*cot + w*sit; + # ty(3) = y + h*cot + w*sit; + # ty(4) = y + h*cot - w*sit; + + if nargout == 1 + tx = [tx ty]; + endif + +endfunction + diff --git a/trajectory_plot.png b/trajectory_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..cce173ec883b67496ba672c41e65c796e75f000b GIT binary patch literal 59366 zcmd43cRbbq8$W!IG7=(WhRh1do`q8OCR>BZDtjKvtgNykPRP#63K>yU;+WYa``A0< zIQRAL^S$rK{m1X``*HiDM>yww-tX)6dR^D^`MjQ&NF6OzDhg%_6beOk>!ykx3U#a$ zg(3+dBZi+SP+JwDP(i3$D%T9WhnL2D4p|KA6_1S7ZV!LZh|9hoM<2%~b6@xKj2qXF z%&X5Gi7geED@UIbZ|t2LFJX*7Z)vWpIP>huH|_nJKWB)9izrjowTj>J-^{%zsKXgV zVXmSi;AbC*e&f%}cjeVR(bxA9Kc#Qv-BP%%#XIt8_RXfkYty3RT>rk96?!wBQMCWQ zu0IWqjX=I0+`LS4`rnVJ1dc2HdtD~y*Q+;GkT0=!Ok|P&UKU1A!uju2-LZGho&WE0 zdM88vy-G#-+5aCe))#uP+NjvuTw&k4Gk7;fUt8W|8`uANA_;mU_*VUae_(;N4mTZDr~!eWC~+ri;3ny{@{jzak( z{QfpveNszy*&QCJ;Gy$i>14{o;_ow$>y|#W+on2IwF}jeaq{xZkHReB;q}$7mGOc*fJwKl(1FuJ$j;+0WrL}SBBR?5JwEpK84)f0WYj$RSCM^ z&^VuRchn7=H}O(MrH^h04y3M>rSC%azpc1+?F3uJVsYJY5(ZWUeYA-oa;zG%Rb_qj ztEa>9<@tK>Y2V=xX3@o#Npn^=jQ} z15SIu3SG}0!}hD#;@~rE!~EQI;e3lDtS*^Nu2H?ú$Lq5|P8!j%j7kP97 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

4fh<3Yd5)5?jnE39c;+q7x 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 literal 0 HcmV?d00001