• R/O
  • SSH
  • HTTPS

marathon: コミット


コミットメタ情報

リビジョン280 (tree)
日時2007-05-02 00:49:58
作者hogepiyo

ログメッセージ

*** empty log message ***

変更サマリ

差分

--- marathon/trunk/MapEditorOne/src/MapEditorSDI.h (revision 279)
+++ marathon/trunk/MapEditorOne/src/MapEditorSDI.h (revision 280)
@@ -294,6 +294,9 @@
294294 //struct selectInformation selectGroupInformation;
295295 hpl::aleph::map::HPLSelectData selectDatas;
296296
297+ //変更点の履歴
298+ list<hpl::aleph::map::HPLSelectData> doneHistory;
299+
297300 //selection group
298301 //vector<struct selectInformation> selectGroupInformationList;
299302
--- marathon/trunk/MapEditorOne/src/MapEditorSDIView.cpp (revision 279)
+++ marathon/trunk/MapEditorOne/src/MapEditorSDIView.cpp (revision 280)
@@ -248,6 +248,9 @@
248248 nullBrush.DeleteObject();
249249 }
250250
251+/**
252+ 線を描画します
253+*/
251254 void CMapEditorSDIView::drawLines(CDC *cdc)
252255 {
253256 CPen pen, selectedPen, hiddenLinePen;
--- marathon/trunk/HPLLib/HPLMapTool.cpp (revision 279)
+++ marathon/trunk/HPLLib/HPLMapTool.cpp (revision 280)
@@ -271,5 +271,33 @@
271271 pointB = polygon->endpoint_indexes[1];
272272 pointC = polygon->endpoint_indexes[2];
273273
274+ //二つの線AB,BCが織り成す角度を求める
275+ double firstDegree = hpl::aleph::map::getTwoLinesDegree(pointA, pointB, pointB, pointC);
274276 return false;
275277 }
278+
279+/**
280+ 二つの線が織り成す角度を求めます
281+ @param pIndexA1,2 線分A1-A2の点インデックス
282+ @param pIndexB1,2 線分B1-B2の点インデックス
283+*/
284+double hpl::aleph::map::getTwoLinesDegree(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2)
285+{
286+ //degreeにします
287+ double rad = hpl::aleph::map::getTwoLinesRadian(pIndexA1, pIndexA2, pIndexB1, pIndexB2);
288+ double deg = hpl::math::getDegreeFromRadian(rad);
289+ return deg;
290+}
291+double hpl::aleph::map::getTwoLinesRadian(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2)
292+{
293+ //radianで求めます
294+ endpoint_data *a1 = get_endpoint_data(pIndexA1);
295+ endpoint_data *a2 = get_endpoint_data(pIndexA2);
296+ endpoint_data *b1 = get_endpoint_data(pIndexB1);
297+ endpoint_data *b2 = get_endpoint_data(pIndexB2);
298+ double rad = hpl::math::getTwoLinesRadian(a1->vertex.x, a1->vertex.y,
299+ a2->vertex.x, a2->vertex.y,
300+ b1->vertex.x, b1->vertex.y,
301+ b2->vertex.x, b2->vertex.y);
302+ return rad;
303+}
--- marathon/trunk/HPLLib/HPLDoneHistory.h (nonexistent)
+++ marathon/trunk/HPLLib/HPLDoneHistory.h (revision 280)
@@ -0,0 +1,42 @@
1+/*
2+ <jp> UNDOのための作業記録です
3+ 注意点として、復元や削除では激しくデータが入れ替わります
4+ NULLだったり順番がめちゃくちゃになるのを考慮しましょう
5+ <en> history of actions you did. this class will be used
6+ for undoing
7+
8+*/
9+#ifndef _HPL_DONE_HISTORY_
10+#define _HPL_DONE_HISTORY_
11+
12+#include <list>
13+#include "HPLSelectData.h"
14+#include "HPLRealMapData.h"
15+
16+namespace hpl{
17+namespace aleph{
18+namespace map{
19+ namespace ActionType{
20+ enum{
21+ Add,
22+ Delete,
23+ Modify,
24+ };
25+ };
26+
27+ class HPLDoneHistory{
28+ private:
29+ //触ったデータ情報
30+ list<HPLSelectData> dataList;
31+
32+ //触った実データの控え
33+ list<HPLRealMapData> realList;
34+ public:
35+ HPLDoneHistory();
36+ ~HPLDoneHistory();
37+ };
38+};
39+};
40+};
41+
42+#endif
--- marathon/trunk/HPLLib/HPLMath.h (revision 279)
+++ marathon/trunk/HPLLib/HPLMath.h (revision 280)
@@ -90,7 +90,23 @@
9090 bool isNearbyPoints(double px0, double py0,
9191 double px1, double py1, double distance);
9292
93-
93+ //////////////////////////////////////////////////////////////////////
94+ /////////////// Angle /////////////////////////////////////////////
95+ /**
96+ 二つの線が織り成す角度を求めます。スクリーン座標系より、
97+ 時計回りが正方向となる
98+ @param pax,y,pbx,y 線分ABの座標
99+ @param pcx,y,pdx,y 線分CDの座標
100+ */
101+ double getTwoLinesRadian(double pax, double pay, double pbx, double pby,
102+ double pcx, double pcy, double pdx, double pdy);
103+ double getTwoLinesDegree(double pax, double pay, double pbx, double pby,
104+ double pcx, double pcy, double pdx, double pdy);
105+ /**
106+ ベクトルの角度を求めます(0 deg = (1,0))
107+ */
108+ double getDegreeFromVector(double x, double y);
109+ double getRadianFromVector(double x, double y);
94110 };
95111 };
96112 #endif
--- marathon/trunk/HPLLib/HPLMapTool.h (revision 279)
+++ marathon/trunk/HPLLib/HPLMapTool.h (revision 280)
@@ -132,6 +132,14 @@
132132 bool isValidPolygon(int index);
133133
134134 /**
135+ 二つの線が織り成す角度を求めます
136+ @param pIndexA1,2 線分A1-A2の点インデックス
137+ @param pIndexB1,2 線分B1-B2の点インデックス
138+ */
139+ double getTwoLinesDegree(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2);
140+ double getTwoLinesRadian(int pIndexA1, int pIndexA2, int pIndexB1, int pIndexB2);
141+
142+ /**
135143 ポリゴンをセットアップします
136144 具体的には、
137145 ・点の順番、線の順番を時計回りに整えます
--- marathon/trunk/HPLLib/HPLRealMapData.h (nonexistent)
+++ marathon/trunk/HPLLib/HPLRealMapData.h (revision 280)
@@ -0,0 +1,36 @@
1+/*
2+ 実データの控えです。
3+ UNDO用です
4+
5+*/
6+#ifndef _HPL_REAL_MAP_DATA_
7+#define _HPL_REAL_MAP_DATA_
8+
9+#include <map>
10+
11+namespace hpl{
12+namespace aleph{
13+namespace map{
14+ class HPLRealMapData{
15+ private:
16+ //名前がかぶりまくるので扱いに注意。
17+ //<en> names of field are all duplicated to
18+ // ones in AlephOne's original codes.
19+ //点データ<index, data_structure>
20+ std::map<int, endpoint_data> points;
21+ //オブジェクトデータ
22+ std::map<int, map_object> objects;
23+ //線データ
24+ std::map<int, line_data> lines;
25+ //サイドデータ
26+ std::map<int, side_date> sides;
27+ //ポリゴンデータ
28+ std::map<int, polygon_data> polygons;
29+ public:
30+ HPLRealMapData();
31+ ~HPLRealMapData();
32+ };
33+};
34+};
35+};
36+#endif
--- marathon/trunk/HPLLib/HPLMath.cpp (revision 279)
+++ marathon/trunk/HPLLib/HPLMath.cpp (revision 280)
@@ -73,6 +73,7 @@
7373 return fabs(startToPointDeltaY);
7474 }
7575
76+ //垂線の距離を得るために角度を計算します
7677 double costheta = (double)getInnerProduct(lineDeltaX, lineDeltaY, startToPointDeltaX, startToPointDeltaY) /
7778 (linevectorDistance * pointvectorDistance);
7879
@@ -253,3 +254,80 @@
253254 }
254255 }
255256
257+//////////////////////////////////////////////////////////////////////
258+/////////////// Angle /////////////////////////////////////////////
259+/**
260+ 二つの線が織り成す角度を求めます。スクリーン座標系より、
261+ 時計回りが正方向となる
262+ @param pax,y,pbx,y 線分ABの座標
263+ @param pcx,y,pdx,y 線分CDの座標
264+*/
265+double hpl::math::getTwoLinesRadian(double pax, double pay, double pbx, double pby,
266+ double pcx, double pcy, double pdx, double pdy)
267+{
268+ //cosの定義により角度を求めます
269+ //A->B >>> [AB]
270+ double deltaABX = pbx - pax;
271+ double deltaABY = pby - pay;
272+ //|AB|
273+ double lengthAB = getLength(deltaABX, deltaABY);
274+ //∠BAX
275+ double radABX = getRadianFromVector(deltaABX, deltaABY);
276+
277+ //[CD]
278+ double deltaCDX = pdx - pcx;
279+ double deltaCDY = pdy - pcy;
280+ //|CD|
281+ double lengthCD = getLength(deltaCDX, deltaCDY);
282+ //∠DCX
283+ double radCDX = getRadianFromVector(deltaCDX, deltaCDY);
284+
285+ //ABとCDの成す角
286+ double radABCD = radCDX - radABX;
287+
288+ return radABCD;
289+}
290+double hpl::math::getTwoLinesRadian(double pax, double pay, double pbx, double pby,
291+ double pcx, double pcy, double pdx, double pdy)
292+{
293+ double rad = hpl::math::getTwoLinesRadian(pax, pay, pbx, pby, pcx, pcy, pdx, pdy);
294+ double deg = hpl::math::getDegreeFromRadian(rad);
295+ return deg;
296+}
297+
298+/**
299+ ベクトルの角度を求めます(0 deg = (1,0))
300+*/
301+double hpl::math::getDegreeFromVector(double x, double y){
302+ double rad = hpl::math::getRadianFromVector(x,y);
303+ double deg = hpl::math::getDegreeFromRadian(rad);
304+ return rad;
305+}
306+
307+double hpl::math::getRadianFromVector(double x, double y){
308+ //atanで求める
309+ //垂直
310+ if(x == 0){
311+ if(y > 0){
312+ //90度
313+ return PI / 2.f;
314+ }else if(y < 0){
315+ //270度
316+ return PI * 1.5f;
317+ }else{ //y == 0
318+ return 0;
319+ }
320+ }
321+
322+ float div = y / x;
323+ if( x > 0){
324+ float rad = atan(div);
325+ if( rad < 0){
326+ rad += 2 * PI;
327+ }
328+ return rad;
329+ }else{
330+ float rad = atan(div) + PI;
331+ return rad;
332+ }
333+}
旧リポジトリブラウザで表示