TNB Library
TnbFigurePointer.h
[詳解]
1#pragma once
11#include "TnbVector.h"
12#include "TnbPair.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
43template<typename T, typename TR = T>
44class CFigurePointerT : public CVectorT<TNB::CPairT<T,T> >
45{
47 DEFSUPER(_super);
48
55 friend double CalcSlantingDistance(const double& x, const double& y)
56 {
57 return ::sqrt(x * x + y * y);
58 }
59
60public:
61
63
66 {
67 }
68
77 virtual INDEX Add(const CPointer& t)
78 {
79 return _super::Add(t);
80 }
81
91 INDEX Add(const T& x, const T& y)
92 {
93 return _super::Add(CPointer(x, y));
94 }
95
102 INDEX AddEx(const CPointer& t)
103 {
104 return _super::AddEx(t);
105 }
106
114 INDEX AddEx(const T& x, const T& y)
115 {
116 return _super::AddEx(CPointer(x, y));
117 }
118
125 T X(INDEX index) const
126 {
127 return GetEx(index).first;
128 }
129
136 T Y(INDEX index) const
137 {
138 return GetEx(index).second;
139 }
140
146 int FindTop(void) const
147 {
148 int r = -1;
149 T tMin(0);
150 loop ( i, GetSize() )
151 {
152 const T& t = At(i).second;
153 if ( tMin > t )
154 {
155 tMin = t;
156 r = i;
157 }
158 }
159 return r;
160 }
161
167 TR CalcArea(void) const
168 {
169 EXCLUSIVE(this);
170 TR rr;
171 int size = GetSize();
172 if ( size > 2 )
173 {
174 TR r(0);
175 const CPointer* p = &At(0);
176 const T& bx = p->first;
177 const T& by = p->second;
178 p = &At(1);
179 for ( int i = 2; i < size; i++ )
180 {
181 const CPointer& a = At(i);
182 r += (((p->first - bx) * (a.second - by)) - ((a.first - bx) * (p->second - by))) / 2;
183 p = &a;
184 }
185 if ( r < TR(0) )
186 {
187 r *= -1;
188 }
189 rr = r;
190 }
191 return rr;
192 }
193
200 T CalcDistance(bool boIsLoop = false) const
201 {
202 EXCLUSIVE(this);
203 T r(0);
204 int size = GetSize();
205 if ( size > 1 )
206 {
207 const CPointer* p = &At(0);
208 for ( int i = 1; i < size; i++ )
209 {
210 const CPointer& a = At(i);
211 r += CalcSlantingDistance(p->first - a.first, p->second - a.second);
212 p = &a;
213 }
214 if ( boIsLoop )
215 {
216 const CPointer& a = At(0);
217 r += CalcSlantingDistance(p->first - a.first, p->second - a.second);
218 }
219 }
220 return r;
221 }
222};
223
224
225
226}; //TNB
227
228
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ペア型関係のヘッダ
配列型情報管理関係のヘッダ
図形管理計算クラス
CFigurePointerT(void)
コンストラクタ
TNB::CPairT< T, T > CPointer
座標管理型 first = x座標 second = y座標
INDEX Add(const T &x, const T &y)
[追加] 要素一つ追加.
T CalcDistance(bool boIsLoop=false) const
[計算] 総距離計算.
INDEX AddEx(const CPointer &t)
[追加] 要素一つ追加.
int FindTop(void) const
[検索] 外接する四角形作成 オブジェクトに外接する四角形の座標を取得します。
INDEX AddEx(const T &x, const T &y)
[追加] 要素一つ追加.
T X(INDEX index) const
[取得] X座標の取得.
T Y(INDEX index) const
[取得] Y座標の取得.
TR CalcArea(void) const
[計算] 範囲内面積計算.
virtual INDEX Add(const CPointer &t)
[追加] 要素一つ追加.
friend double CalcSlantingDistance(const double &x, const double &y)
[計算] 斜め距離計算 (√(水平距離^2 + 垂直距離^2))
ペア型テンプレートクラス
Definition: TnbPair.h:41
FIRST first
一つ目の型の値
Definition: TnbPair.h:44
SECOND second
二つ目の型の値
Definition: TnbPair.h:45
配列型情報管理テンプレート
Definition: TnbVector.h:75
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual const TNB::CPairT< T, T > & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:233
virtual INDEX Add(const TNB::CPairT< T, T > &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
#define EXCLUSIVE(CLS)
簡易排他制御マクロ.
Definition: TnbSync.h:788
CValueDistance sqrt(const CValueArea &a)
[計算] 平方根 (距離 = √面積)
TNB Library
Definition: TnbDoxyTitle.txt:2
INDEX AddEx(const TNB::CPairT< T, T > &t)
[追加] 要素一つ追加.
TNB::CPairT< T, T > GetEx(INDEX index) const
[取得] 要素の取得.