SDXFrameWork  0.12
SDXFrameWork
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
Line.h
1 //Copyright © 2014 SDXFramework
2 //[License]GNU Affero General Public License, version 3
3 //[Contact]http://sourceforge.jp/projects/dxframework/
4 #pragma once
5 
6 #include <Framework/IShape.h>
7 namespace SDX
8 {
9  class Complex;
10  class Point;
11  class Line;
12  class Circle;
13  class Rect;
14 
15  class Camera;
16  class Color;
17 
20  class Line : public IShape
21  {
22  private:
23  double x;
24  double y;
25  double xA;
26  double yA;
27  double xB;
28  double yB;
29  double thick;
30 
31  double angle;
32 
33  double lengthA;
34  double lengthB;
35 
36  double width;
37  double height;
38  double thickHarf;
39  double thickPow;
40  double minX;
41  double minY;
42  double maxX;
43  double maxY;
44 
45  void CulLine()
46  {
47  this->xA = x + cos(angle) * lengthA;
48  this->yA = y + sin(angle) * lengthA;
49  this->xB = x - cos(angle) * lengthB;
50  this->yB = y - sin(angle) * lengthB;
51  this->width = abs(this->xB - this->xA);
52  this->height = abs(this->yB - this->yA);
53  this->thickHarf = this->thick / 2;
54  this->thickPow = this->thick * this->thick / 4;
55  this->minX = std::min(xA, xB);
56  this->maxX = std::max(xA, xB);
57  this->minY = std::min(yA, yB);
58  this->maxY = std::max(yA, yB);
59  }
60  public:
62  Line(double X中心座標, double Y中心座標, double 角度, double 長さ, double 太さ) :
63  x(X中心座標),
64  y(Y中心座標),
65  angle(角度),
66  lengthA(長さ / 2),
67  lengthB(長さ / 2),
68  thick(太さ)
69  {
70  this->CulLine();
71  }
72 
74  Line(double X中心座標, double Y中心座標, double 角度, double 前方長さ, double 後方長さ, double 太さ) :
75  x(X中心座標),
76  y(Y中心座標),
77  angle(角度),
78  lengthA(前方長さ),
79  lengthB(後方長さ),
80  thick(太さ)
81  {
82  this->CulLine();
83  }
84 
85  virtual IShape* Clone(double X座標, double Y座標) const override
86  {
87  auto shape = new Line(X座標, Y座標, this->angle, this->lengthA, this->thick);
88  shape->zoomX = this->zoomX;
89  shape->zoomY = this->zoomY;
90  return shape;
91  }
92 
93  double GetX() const override
94  {
95  return x;
96  }
97 
98  double GetY() const override
99  {
100  return y;
101  }
102 
103  double GetW() const override
104  {
105  return int(xA - xB);
106  }
107 
108  double GetH() const override
109  {
110  return int(yA - yB);
111  }
112 
113  void SetPos(double X座標, double Y座標) override
114  {
115  this->x = X座標;
116  this->y = Y座標;
117  this->CulLine();
118  }
119 
120  void MultiZoom(double X倍率, double Y倍率) override
121  {
122  this->lengthA *= X倍率;
123  this->lengthB *= Y倍率;
124  this->thick *= X倍率;
125 
126  this->CulLine();
127 
128  zoomX *= X倍率;
129  zoomY *= Y倍率;
130  }
131 
132  void Rotate(double 回転する角度) override
133  {
134  this->angle += 回転する角度;
135  this->CulLine();
136  }
137 
138  void Move(double X移動量, double Y移動量) override
139  {
140  this->x += X移動量;
141  this->y += Y移動量;
142  this->xA += X移動量;
143  this->yA += Y移動量;
144  this->xB += X移動量;
145  this->yB += Y移動量;
146 
147  this->minX += X移動量;
148  this->minY += Y移動量;
149  this->maxX += X移動量;
150  this->maxY += Y移動量;
151  }
152 
153  void Draw(const Color &描画色) const override;
154 
156  double GetXA() const
157  {
158  return xA;
159  }
160 
162  double GetYA() const
163  {
164  return yA;
165  }
166 
168  double GetXB() const
169  {
170  return xB;
171  }
172 
174  double GetYB() const
175  {
176  return yB;
177  }
178 
180  double GetThick() const
181  {
182  return thick;
183  }
184 
186  void SetThick(double 太さ)
187  {
188  thick = 太さ;
189  thickHarf = int(thick / 2);
190  thickPow = int(thick * thick / 4);
191  }
192 
194  double GetAngle() const override
195  {
196  return this->angle;
197  }
198 
200  double GetLength() const
201  {
202  return this->lengthA + this->lengthB;
203  }
204 
206  double GetThickHarf() const
207  {
208  return this->thickHarf;
209  }
210 
212  double GetThickPow() const
213  {
214  return this->thickPow;
215  }
216 
218  double GetMinX() const
219  {
220  return minX;
221  }
222 
224  double GetMinY() const
225  {
226  return minY;
227  }
228 
230  double GetMaxX() const
231  {
232  return maxX;
233  }
234 
236  double GetMaxY() const
237  {
238  return maxY;
239  }
240 
241  bool Hit(const IShape *shape) const override
242  {
243  return shape->Hit(this);
244  }
245  bool Hit(const Complex *complex) const override
246  {
247  for (auto it : complex->shapes)
248  {
249  if (it->Hit(this)) return true;
250  }
251  return false;
252  }
253  bool Hit(const Point *point) const override
254  {
255  return LinePoint(point->GetX(), point->GetY(), this->GetThick());
256  }
257  bool Hit(const Line *line) const override
258  {
259  //四角形でラフチェック
260  if (RectRect(this->GetXA() - this->GetThickHarf(), this->GetYA() - this->GetThickHarf(), this->GetXB() - line->GetThickHarf(), this->GetYB() - line->GetThickHarf(),
261  line->GetXA() - this->GetThickHarf(), line->GetYA() - this->GetThickHarf(), line->GetXB() - line->GetThickHarf(), line->GetYB() - line->GetThickHarf()))
262  {
263  return true;
264  }
265  //交差チェック
266  if (LineLine(this->GetXA(), this->GetYA(), this->GetXB(), this->GetYB(), line->GetXA(), line->GetYA(), line->GetXB(), line->GetYB()))
267  {
268  return true;
269  }
270  //線と端のチェック
271  //線が点になっているかで分ける
272  if (this->GetLength() != 0)
273  {
274  if (this->LinePoint(line->GetXA(), line->GetYA(), this->GetThickHarf() + line->GetThickHarf())) return true;
275  if (this->LinePoint(line->GetXB(), line->GetYB(), this->GetThickHarf() + line->GetThickHarf())) return true;
276  }
277  if (line->GetLength() != 0)
278  {
279  if (line->LinePoint(this->GetXA(), this->GetYA(), this->GetThickHarf() + line->GetThickHarf())) return true;
280  if (line->LinePoint(this->GetXB(), this->GetYB(), this->GetThickHarf() + line->GetThickHarf())) return true;
281  }
282 
283  return false;
284  }
285  bool Hit(const Rect *rect) const override;
286  bool Hit(const Circle *circle) const override;
287 
289  bool LinePoint(double px, double py, double range) const
290  {
291  //点同士の距離
292  const double dx = GetXB() - GetXA();
293  const double dy = GetYB() - GetYA();
294 
295  const double a = dx * dx + dy * dy;
296  const double b = dx *(GetXA() - px) + dy *(GetYA() - py);
297 
298  //点の場合
299  if (a == 0)
300  {
301  if (
302  (GetXA() - px) *(GetXA() - px) +
303  (GetYA() - py) *(GetYA() - py)
304  < range * range) return true;
305  return false;
306  }
307 
308  const double t = -b / a;
309 
310  const double tx = GetXA() + dx*t;
311  const double ty = GetYA() + dy*t;
312 
313  //線分上の点が範囲内かチェック
314  if (tx < minX || tx > maxX || ty < minY || ty > maxY)
315  {
316  if (
317  (xA - px) * (xA - px) + (yA - py) * (yA - py) > range * range &&
318  (xB - px) * (xB - px) + (yB - py) * (yB - py) > range * range
319  )
320  {
321  return false;
322  }
323  }
324 
325  const double d = (px - tx)*(px - tx) + (py - ty) * (py - ty);
326 
327  return (d < range * range);
328  }
329  };
330 }
double GetAngle() const override
角度を取得.
Definition: Line.h:194
double GetThickHarf() const
太さの半分を取得.
Definition: Line.h:206
double GetYB() const
頂点BのY座標を取得.
Definition: Line.h:174
矩形を表す図形クラス.
Definition: Rect.h:22
太さのある線を表す図形クラス.
Definition: Line.h:20
double GetThick() const
太さを取得.
Definition: Line.h:180
bool Hit(const Line *line) const override
衝突判定.
Definition: Line.h:257
void SetThick(double 太さ)
太さを設定.
Definition: Line.h:186
Line(double X中心座標, double Y中心座標, double 角度, double 前方長さ, double 後方長さ, double 太さ)
コンストラクタ.
Definition: Line.h:74
double GetMaxY() const
頂点AとBのY座標の大きい値を取得.
Definition: Line.h:236
std::vector< IShape * > shapes
保持するShape
Definition: Complex.h:23
double GetY() const override
Y座標を取得.
Definition: Point.h:68
double GetLength() const
長さを取得.
Definition: Line.h:200
点を表す図形クラス.
Definition: Point.h:22
void Rotate(double 回転する角度) override
回転する.
Definition: Line.h:132
衝突判定可能な図形の抽象クラス.
Definition: IShape.h:21
virtual bool Hit(const IShape *iShape) const =0
衝突判定.
複合図形を表すクラス.
Definition: Complex.h:20
void Draw(const Color &描画色) const override
描画する.
Definition: ShapeDraw.h:23
void SetPos(double X座標, double Y座標) override
指定座標に移動.
Definition: Line.h:113
double GetMinX() const
頂点AとBのX座標の小さい値を取得.
Definition: Line.h:218
色を表すクラス.
Definition: Color.h:11
double GetX() const override
X座標を取得.
Definition: Line.h:93
double GetH() const override
高さを取得.
Definition: Line.h:108
bool Hit(const Complex *complex) const override
衝突判定.
Definition: Line.h:245
bool Hit(const Point *point) const override
衝突判定.
Definition: Line.h:253
double GetMinY() const
頂点AとBのY座標の小さい値を取得.
Definition: Line.h:224
static bool LineLine(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
線分の交差判定.
Definition: IShape.h:62
double GetW() const override
幅を取得.
Definition: Line.h:103
Line(double X中心座標, double Y中心座標, double 角度, double 長さ, double 太さ)
コンストラクタ.
Definition: Line.h:62
double GetXB() const
頂点BのX座標を取得.
Definition: Line.h:168
double zoomX
図形の拡大率
Definition: IPosition.h:14
void MultiZoom(double X倍率, double Y倍率) override
縦横別で拡大率を掛け算する.
Definition: Line.h:120
bool LinePoint(double px, double py, double range) const
線と点の当たり判定.
Definition: Line.h:289
virtual IShape * Clone(double X座標, double Y座標) const override
同じ形の図形を作る.
Definition: Line.h:85
double GetYA() const
頂点AのY座標を取得.
Definition: Line.h:162
static bool RectRect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
矩形の交差判定.
Definition: IShape.h:25
double GetXA() const
頂点AのX座標を取得.
Definition: Line.h:156
double GetMaxX() const
頂点AとBのX座標の大きい値を取得.
Definition: Line.h:230
円を表す図形クラス.
Definition: Circle.h:20
double zoomY
図形の拡大率
Definition: IPosition.h:15
double GetX() const override
X座標を取得.
Definition: Point.h:63
double GetThickPow() const
太さの二乗を取得.
Definition: Line.h:212
double GetY() const override
Y座標を取得.
Definition: Line.h:98
bool Hit(const IShape *shape) const override
衝突判定.
Definition: Line.h:241
void Move(double X移動量, double Y移動量) override
相対座標で移動.
Definition: Line.h:138