• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン359 (tree)
日時2007-07-03 01:41:01
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/MapEditorOne/test/TestMathematics.cpp (revision 358)
+++ marathon/trunk/MapEditorOne/test/TestMathematics.cpp (revision 359)
@@ -64,6 +64,7 @@
6464 printf("sorted\n");
6565 //表示してみる
6666 printPairs(pairs, max);
67+ getchar();
6768 return 0;
6869 /*
6970 for(int i = 0; i < NUM; i ++){
--- marathon/trunk/MapEditorWX/src/MainFrameLeftDown.cpp (revision 358)
+++ marathon/trunk/MapEditorWX/src/MainFrameLeftDown.cpp (revision 359)
@@ -345,10 +345,12 @@
345345 wmp, smgr, zMin, zMax);
346346 if(polyDatas.size() == 0){
347347 //失敗
348- hpl::error::caution("No frame to fill as a polygon found");
348+ hpl::error::caution("No frame to fill as a VALID polygon found (it seems to be a illegal polygon or a none)");
349349 }else{
350350 //追加
351351 hpl::aleph::map::addPolygon(polyDatas[0]);
352+ //更新
353+ smgr->updateDeletes();
352354 }
353355 }
354356 void MapEditorMainFrame::doLButtonOnHandTool(wxMouseEvent& ev)
@@ -424,8 +426,8 @@
424426 }else{
425427 //でなけば線を作成する
426428 line_data line;
427- assert(hpl::aleph::map::createLine(wxGetApp().prevPointIndex,
428- pointIndex, &line));
429+ if(!hpl::aleph::map::createLine(wxGetApp().prevPointIndex,
430+ pointIndex, &line))wxFAIL;//hpl::error::halt("line creation failure");
429431 int newLineIndex = hpl::aleph::map::addLine(line);
430432 }
431433 wxGetApp().prevPointIndex = pointIndex;
@@ -498,11 +500,17 @@
498500 &newLine2);
499501 int newLine2Index = hpl::aleph::map::addLine(newLine2);
500502
501- //前回→今回の点の間に線を追加
502- line_data newLine;
503- hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &newLine);
504- int lineIndex = hpl::aleph::map::addLine(newLine);
505503
504+ if(wxGetApp().isFirstOfLineToAdd){
505+ //最初ならなにもしない
506+ }else{
507+ //前回→今回の点の間に線を追加
508+ line_data newLine;
509+ if(!hpl::aleph::map::createLine(wxGetApp().prevPointIndex, newPointIndex, &newLine)){
510+ hpl::error::halt("line creation failure");
511+ }
512+ int lineIndex = hpl::aleph::map::addLine(newLine);
513+ }
506514 wxGetApp().prevPointIndex = newPointIndex;
507515 }
508516 }else{
--- marathon/trunk/MapEditorWX/setting.ini (revision 358)
+++ marathon/trunk/MapEditorWX/setting.ini (revision 359)
@@ -1,9 +1,9 @@
1-GRID_SIZE_INDEX=4
2-COLOR_PRESET=1
3-BACKGROUND=0,0,0
4-GRID=50,50,50
5-LINES=50,255,0
6-POLYGONS=0,50,0
7-STRINGS=100,255,0
8-POINTS=255,255,0
1+GRID_SIZE_INDEX=0
2+COLOR_PRESET=0
3+BACKGROUND=255,255,255
4+GRID=100,100,100
5+LINES=0,0,0
6+POLYGONS=200,200,200
7+STRINGS=0,0,0
8+POINTS=0,0,255
99 FLAGS=1,1,1,1,1,1,1,1,1,1,1,1,
\ No newline at end of file
--- marathon/trunk/HPLLib/HPLMapTool.cpp (revision 358)
+++ marathon/trunk/HPLLib/HPLMapTool.cpp (revision 359)
@@ -201,8 +201,11 @@
201201 if(smgr->delLines[i]){
202202 continue;
203203 }
204+ int *a = NULL;
204205 endpoint_data* begin = get_endpoint_data(line->endpoint_indexes[0]);
206+ if(!begin)delete a;
205207 endpoint_data* end = get_endpoint_data(line->endpoint_indexes[1]);
208+ if(!end)delete a;
206209
207210 //選択しているか判定
208211 if(hpl::aleph::map::isSelectLine(wpoint, begin->vertex, end->vertex,
@@ -629,9 +632,9 @@
629632 int zMin, int zMax,
630633 world_point2d& wpoint)
631634 {
632- //最小の角度
633- double minDeg = 360;
634- int minLineIndex = NONE;
635+ //最大の角度
636+ double maxDeg = 0;
637+ int maxLineIndex = NONE;
635638
636639 line_data* baseLine = get_line_data(baseLineIndex);
637640 int startBasePointIndex = baseLine->endpoint_indexes[0];
@@ -641,7 +644,7 @@
641644 hpl::math::exchange(&startBasePointIndex, &endBasePointIndex);
642645 }else if(endBasePointIndex == basePointIndex){
643646 }else{
644- assert(false);
647+ hpl::error::halt("invalid basePointIndex");
645648 }
646649
647650 int lastPointIndex = NONE;
@@ -648,21 +651,22 @@
648651 //ベースポイントに繋がる線を取り出す
649652 std::vector<int> conLines = hpl::aleph::map::getLineIndexesIncludePoint(basePointIndex);
650653 for(int k = 0; k < (int)conLines.size(); k ++){
654+ int conLineIndex = conLines[k];
651655 if(doneList->find(conLines[k]) != doneList->end()){
652656 //既に見つけ出したものは省く
653657 continue;
654658 }
655659 //delLinesは省く
656- if(smgr->delLines[conLines[k]]){
660+ if(smgr->delLines[conLineIndex]){
657661 continue;
658662 }
659663 //ベースの線と一緒の場合も除外する
660- if(baseLineIndex == conLines[k]){
664+ if(baseLineIndex == conLineIndex){
661665 continue;
662666 }
663667
664- line_data* line = get_line_data(conLines[k]);
665- assert(line);
668+ line_data* line = get_line_data(conLineIndex);
669+ if(!line)hpl::error::halt("line is null");
666670 //高さチェック
667671 if(!hpl::aleph::map::isValidHeight(line->highest_adjacent_floor,
668672 line->lowest_adjacent_ceiling, zMin, zMax))
@@ -681,7 +685,10 @@
681685 }
682686
683687 endpoint_data* ep0 = get_endpoint_data(ep0Index);
688+ if(!ep0)hpl::error::halt("ep0 is null");
684689 endpoint_data* ep1 = get_endpoint_data(ep1Index);
690+ if(!ep1)hpl::error::halt("ep1 is null");
691+
685692 double l0x = ep0->vertex.x;
686693 double l0y = ep0->vertex.y;
687694 double l1x = ep1->vertex.x;
@@ -706,19 +713,19 @@
706713 if(deg > DEG_ROUND / 2.0){
707714 deg = DEG_ROUND - deg;
708715 }
709- //角度が現在最小かどうか確認する
710- if(deg < minDeg){
711- minDeg = deg;
712- //今までより小さい
713- minLineIndex = conLines[k];
716+ //角度が現在最大かどうか確認する
717+ if(deg > maxDeg){
718+ maxDeg = deg;
719+ //今までより大きい
720+ maxLineIndex = conLineIndex;
714721 //最後の点
715722 lastPointIndex = ep1Index;
716723 }
717724 //済み
718- doneList->insert(conLines[k]);
725+ doneList->insert(conLineIndex);
719726 }
720727
721- if(minLineIndex == NONE){
728+ if(maxLineIndex == NONE){
722729 //見つからなかった
723730 //よって戻っていく
724731 return false;
@@ -734,8 +741,12 @@
734741 return true;
735742 }else{
736743 //まだまだ
744+ if(pointIndexes->size() >= MAXIMUM_VERTICES_PER_POLYGON + 1){
745+ return false;
746+ }
747+ //もう最大数を超えている
737748 //次を探す
738- baseLineIndex = minLineIndex;
749+ baseLineIndex = maxLineIndex;
739750 basePointIndex = lastPointIndex;
740751 bool found = getValidLines(basePointIndex, baseLineIndex, pointIndexes,
741752 smgr, rotRem, doneList, zMin, zMax, wpoint);
@@ -763,8 +774,11 @@
763774 struct hpl::math::qsort::Pair<double>* pairs = new struct hpl::math::qsort::Pair<double>[max];
764775 for(int i = 0; i < max; i ++){
765776 line_data* line = get_line_data(i);
777+ assert(line);
766778 endpoint_data* epStart = get_endpoint_data(line->endpoint_indexes[0]);
779+ assert(epStart);
767780 endpoint_data* epEnd = get_endpoint_data(line->endpoint_indexes[1]);
781+ assert(epEnd);
768782 pairs[i].data = hpl::math::getPointDistanceFromLine(wpoint.x, wpoint.y,
769783 epStart->vertex.x, epStart->vertex.y, epEnd->vertex.x, epEnd->vertex.y);
770784 }
@@ -785,7 +799,7 @@
785799 }
786800 int lineIndexBase = pairs[i].index;
787801 line_data* startLine = get_line_data(lineIndexBase);
788- assert(startLine);
802+ if(!startLine)hpl::error::halt("startLine is null");
789803 //高さチェック
790804 if(!hpl::aleph::map::isValidHeight(startLine->highest_adjacent_floor,
791805 startLine->lowest_adjacent_ceiling, zMin, zMax))
@@ -795,10 +809,10 @@
795809
796810 int startPointIndex = startLine->endpoint_indexes[0];
797811 endpoint_data* epStart = get_endpoint_data(startPointIndex);
798- assert(epStart);
812+ if(!epStart)hpl::error::halt("epStart is null");
799813 int endPointIndex = startLine->endpoint_indexes[1];
800814 endpoint_data* epEnd = get_endpoint_data(endPointIndex);
801- assert(epEnd);
815+ if(!epEnd)hpl::error::halt("epEnd is null");
802816
803817 //線の左右どちらの側に点があるかをチェックします
804818 int rotRem = hpl::math::getPointRotationTypeFromLine(
@@ -805,15 +819,17 @@
805819 wpoint.x, wpoint.y, epStart->vertex.x, epStart->vertex.y,
806820 epEnd->vertex.x, epEnd->vertex.y);
807821 if(rotRem == hpl::math::RotationType::Clockwise &&
808- startLine->clockwise_polygon_owner != NONE)
822+ startLine->counterclockwise_polygon_owner != NONE)
809823 {
810824 //右周りで、かつ線の右側(指定点のある領域)
811825 //にポリゴンが既にある場合スキップ
826+ hpl::error::caution("already polygon exists");
812827 continue;
813828 }
814829 if(rotRem == hpl::math::RotationType::Counterclockwise &&
815- startLine->counterclockwise_polygon_owner != NONE)
830+ startLine->clockwise_polygon_owner != NONE)
816831 {
832+ hpl::error::caution("already polygon exists");
817833 continue;
818834 }
819835 //これ以降はすでに指定点の部分にポリゴンがないと仮定する
@@ -837,7 +853,7 @@
837853 int indexes[MAXIMUM_VERTICES_PER_POLYGON];
838854
839855 //点データ集計
840- for(int l = 0; l < pointIndexes.size() - 2; i ++){
856+ for(int l = 0; l < pointIndexes.size() - 1; l ++){
841857 //
842858 indexes[l] = pointIndexes[l];
843859 }
@@ -844,7 +860,8 @@
844860 int vertexCount = pointIndexes.size() - 1;
845861 //ポリゴン作成
846862 polygon_data poly;
847- hpl::aleph::map::createPolygon(indexes, vertexCount, &poly);
863+ bool result = hpl::aleph::map::createPolygon(indexes, vertexCount, &poly);
864+ if(!result)hpl::error::halt("polygon creation failure");
848865 polyDatas.push_back(poly);
849866
850867 //TODO 複数見つけ出すのか?
@@ -915,6 +932,7 @@
915932 for(int i = 0; i < n; i ++){
916933 pdata.endpoint_indexes[i] = i; /* clockwise */
917934 pdata.line_indexes[i] = i;
935+ pdata.side_indexes[i] = NONE;
918936 }
919937
920938 pdata.floor_texture = NONE;
@@ -1122,6 +1140,10 @@
11221140 PolygonList.push_back(polygon);
11231141 dynamic_world->polygon_count = (int16)PolygonList.size();
11241142 int index = dynamic_world->polygon_count - 1;
1143+
1144+ polygon_data* poly = get_polygon_data(index);
1145+ //点、線に登録する
1146+ //TODO for(int i = 0; i < poly->
11251147 return index;
11261148 }
11271149 int hpl::aleph::map::addMapSavedObject(map_object object)
@@ -1227,6 +1249,7 @@
12271249 return false;
12281250 }
12291251 poly->line_indexes[i] = lIndex;
1252+ poly->side_indexes[i] = NONE;
12301253 }
12311254 //TODO
12321255 //poly->adjacent_polygon_indexes = NONE;
--- marathon/trunk/HPLLib/HPLQuickSort.cpp (revision 358)
+++ marathon/trunk/HPLLib/HPLQuickSort.cpp (revision 359)
@@ -5,8 +5,16 @@
55 ////////////// Static Methods /////////////////////////////////////////////
66 /////////////////////////////////////////////////////////////////////////////
77
8+template<class T>
9+void exchangePair(struct hpl::math::qsort::Pair<T> *data1,
10+ struct hpl::math::qsort::Pair<T> *data2)
11+{
12+ struct hpl::math::qsort::Pair<T> temp;
13+ temp.index = data1->index;
14+ temp.data = data1->data;
15+}
816 /**
9- ピボットで得たアクシス数より大きいもの、以下のものをより分けます
17+ 指定した基準値より大きい物、小さい物で分割します
1018 divide [more than axis] and [less than axis]
1119 -smaller is left, bigger is right
1220 -return offset of start of biggers
@@ -26,8 +34,9 @@
2634 }
2735
2836 /**
29- クイックソート用。ピボット交換を行います
30- 返り値は左から見て異なる数値のうち大きいもののある位置
37+ 左から見たとき、最初の値より大きい物がくるか、小さい物が来るかを判定します
38+ 大きい物が来た場合は最初の位置、
39+ 小さい物が来た場合はその場所を基準値のインデックスとします。
3140 select axis-num
3241 -find two different nums from indexes' left
3342 -return bigger one
@@ -36,14 +45,24 @@
3645 template<class T>
3746 int pivot(struct hpl::math::qsort::Pair<T> *dataArray, int start, int end)
3847 {
48+ //startの右隣から始める。startの数値を基準値とする。
3949 int k = start + 1;
40- while( k <= end && dataArray[start].data == dataArray[k].data)k ++;
41- //all are same
42- if(k > end) return -1;
43- //if not
50+
51+ //startと異なる数値が出るまで調べる
52+ while( k <= end && dataArray[start].data == dataArray[k].data){
53+ k ++;
54+ }
55+ //全て同じ数字である場合(あるいは要素が一つしかない(end == start)場合)
56+ if(k > end){
57+ return -1;
58+ }
59+
4460 if(dataArray[start].data >= dataArray[k].data){
61+ //k番目の値が基準値より大きい場合
62+ //→基準値の場所を返す(基準値〜kは大)
4563 return start;
4664 }else{
65+ //基準値より小さい場合はその場所とする
4766 return k;
4867 }
4968 }
@@ -56,11 +75,15 @@
5675 template<class T>
5776 void repeatbleQuickSort(struct hpl::math::qsort::Pair<T> *dataArray, int start, int end)
5877 {
78+ //ぶつかったら終了
5979 if( start == end){
6080 return;
6181 }
6282 int p = pivot(dataArray, start, end);
83+
84+ //pが-1(全て同じ数値か、)
6385 if(p != -1){
86+ //指定された基準値を元に分割します
6487 int offset = partition(dataArray, start, end, dataArray[p].data);
6588 repeatbleQuickSort(dataArray, start, offset - 1);
6689 repeatbleQuickSort(dataArray, offset, end);
@@ -81,8 +104,8 @@
81104 for(int i = 0; i < max; i ++){
82105 dataArray[i].index = i;
83106 }
84- //sort it
85- repeatbleQuickSort(dataArray, 0, max);
107+ //ソート開始 <en> sort it
108+ repeatbleQuickSort(dataArray, 0, max - 1);
86109 }
87110 }
88111
旧リポジトリブラウザで表示