*** empty log message ***
@@ -378,26 +378,23 @@ | ||
378 | 378 | int max = (int)LineList.size(); |
379 | 379 | //線への垂線の距離順で整列する |
380 | 380 | //全部の線への垂線を求める |
381 | - double *length = new double[max]; | |
382 | - | |
381 | + struct hpl::math::qsort::Pair<double>* pairs = new struct hpl::math::qsort::Pair<double>[max]; | |
383 | 382 | for(int i = 0; i < max; i ++){ |
384 | 383 | line_data* line = get_line_data(i); |
385 | 384 | endpoint_data* epStart = get_endpoint_data(line->endpoint_indexes[0]); |
386 | 385 | endpoint_data* epEnd = get_endpoint_data(line->endpoint_indexes[1]); |
387 | - length[i] = hpl::math::getPointDistanceFromLine(wpoint.x, wpoint.y, | |
386 | + pairs[i].data = hpl::math::getPointDistanceFromLine(wpoint.x, wpoint.y, | |
388 | 387 | epStart->vertex.x, epStart->vertex.y, epEnd->vertex.x, epEnd->vertex.y); |
389 | 388 | } |
390 | - struct hpl::math::qsort::Pair* pairs = new struct hpl::math::qsort::Pair[max]; | |
391 | - hpl::math::qsort::quickSort(pairs, max); | |
389 | + hpl::math::qsort::quickSort<double>(pairs, max); | |
392 | 390 | |
393 | 391 | //近くにある線から見ていく |
394 | 392 | for(int i = 0; i < max; i ++){ |
395 | - | |
393 | + line_data* startLine = get_line_data(pairs[i].index); | |
396 | 394 | } |
397 | 395 | |
398 | 396 | //解放 |
399 | - delete sortedIndex; | |
400 | - delete length; | |
397 | + delete pairs; | |
401 | 398 | return polyDatas; |
402 | 399 | } |
403 | 400 |
@@ -600,3 +597,28 @@ | ||
600 | 597 | b2->vertex.x, b2->vertex.y); |
601 | 598 | return rad; |
602 | 599 | } |
600 | + | |
601 | +/** | |
602 | + 指定した点がポリゴンの中に存在するかどうかを確かめます | |
603 | + @ | |
604 | +*/ | |
605 | +bool hpl::aleph::map::isPointInPolygon(int viewPX, int viewPY, int polygonIndex, | |
606 | + int offsetXWorld, int offsetYWorld, int zoomDivision, int offsetx, int offsety) | |
607 | +{ | |
608 | + //ワールド座標に変換します | |
609 | + world_point2d wpoint = hpl::aleph::map::getWorldPoint2DFromViewPoint(viewPX, viewPY, | |
610 | + offsetXWorld, offsetYWorld, zoomDivision, offsetx, offsety); | |
611 | + double points[MAXIMUM_VERTICES_PER_POLYGON][2]; | |
612 | + //ポリゴン情報を得ます | |
613 | + polygon_data* poly = get_polygon_data(polygonIndex); | |
614 | + int n = poly->vertex_count; | |
615 | + for(int i = 0; i < n; i ++){ | |
616 | + endpoint_data* ep = get_endpoint_data(poly->endpoint_indexes[i]); | |
617 | + points[i][0] = ep->vertex.x; | |
618 | + points[i][1] = ep->vertex.y; | |
619 | + } | |
620 | + //位置検査します | |
621 | + bool isPointIn = hpl::math::isPointInPolygon(wpoint.x, wpoint.y, points, n); | |
622 | + return isPointIn; | |
623 | +} | |
624 | + |
@@ -221,6 +221,13 @@ | ||
221 | 221 | ・ |
222 | 222 | */ |
223 | 223 | //void setupPolygon(int index); |
224 | + | |
225 | + /** | |
226 | + 指定した点がポリゴンの中に存在するかどうかを確かめます | |
227 | + @ | |
228 | + */ | |
229 | + bool isPointInPolygon(int viewPX, int viewPY, int polygonIndex, | |
230 | + int offsetXWorld, int offsetYWorld, int zoomDivision, int offsetx, int offsety); | |
224 | 231 | }; |
225 | 232 | }; |
226 | 233 | }; |
@@ -16,11 +16,11 @@ | ||
16 | 16 | { |
17 | 17 | int left = start, right = end; |
18 | 18 | while( left <= right){ |
19 | - while(left <= end && dataArray[left] < axis)left ++; | |
20 | - while(right >= start && dataArray[right] >= axis)right --; | |
19 | + while(left <= end && dataArray[left].data < axis)left ++; | |
20 | + while(right >= start && dataArray[right].data >= axis)right --; | |
21 | 21 | if(left > right)break; |
22 | 22 | //交換 |
23 | - hpl::math::exchange<struct hpl::math::qsort::Pair<T>>(&dataArray[left], &dataArray[right]); | |
23 | + hpl::math::exchange<struct hpl::math::qsort::Pair<T> >(&dataArray[left], &dataArray[right]); | |
24 | 24 | } |
25 | 25 | return left; |
26 | 26 | } |
@@ -37,11 +37,11 @@ | ||
37 | 37 | int pivot(struct hpl::math::qsort::Pair<T> *dataArray, int start, int end) |
38 | 38 | { |
39 | 39 | int k = start + 1; |
40 | - while( k <= end && dataArray[start] == dataArray[k])k ++; | |
40 | + while( k <= end && dataArray[start].data == dataArray[k].data)k ++; | |
41 | 41 | //all are same |
42 | 42 | if(k > end) return -1; |
43 | 43 | //if not |
44 | - if(dataArray[start] >= dataArray[k]){ | |
44 | + if(dataArray[start].data >= dataArray[k].data){ | |
45 | 45 | return start; |
46 | 46 | }else{ |
47 | 47 | return k; |
@@ -59,11 +59,11 @@ | ||
59 | 59 | if( start == end){ |
60 | 60 | return; |
61 | 61 | } |
62 | - int p = pivot(dataArray, start, end, destIndexes); | |
62 | + int p = pivot(dataArray, start, end); | |
63 | 63 | if(p != -1){ |
64 | - int offset = partition(dataArray, start, end, dataArray[p]); | |
65 | - repeatbleQuickSort(dataArray, start, offset - 1, destIndexes); | |
66 | - repeatbleQuickSort(dataArray, offset, end, destIndexes); | |
64 | + int offset = partition(dataArray, start, end, dataArray[p].data); | |
65 | + repeatbleQuickSort(dataArray, start, offset - 1); | |
66 | + repeatbleQuickSort(dataArray, offset, end); | |
67 | 67 | } |
68 | 68 | } |
69 | 69 |
@@ -75,13 +75,16 @@ | ||
75 | 75 | void hpl::math::qsort::quickSort(struct hpl::math::qsort::Pair<T> *dataArray, int max) |
76 | 76 | { |
77 | 77 | if(max == 1){ |
78 | - destIndexes[0] = (T)0; | |
78 | + dataArray[0].index = 0; | |
79 | 79 | }else{ |
80 | 80 | //init indexes |
81 | 81 | for(int i = 0; i < max; i ++){ |
82 | - destIndexes[i] = i; | |
82 | + dataArray[i].index = i; | |
83 | 83 | } |
84 | 84 | //sort it |
85 | 85 | repeatbleQuickSort(dataArray, 0, max); |
86 | 86 | } |
87 | 87 | } |
88 | + | |
89 | +template void hpl::math::qsort::quickSort(struct hpl::math::qsort::Pair<int> *dataArray, int max); | |
90 | +template void hpl::math::qsort::quickSort(struct hpl::math::qsort::Pair<double> *dataArray, int max); |