Mercurial > hg > pub > prymula > com
comparison DPF-Prymula-audioplugins/dpf/dgl/src/Geometry.cpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2:cf2cb71d31dd | 3:84e66ea83026 |
---|---|
1 /* | |
2 * DISTRHO Plugin Framework (DPF) | |
3 * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> | |
4 * | |
5 * Permission to use, copy, modify, and/or distribute this software for any purpose with | |
6 * or without fee is hereby granted, provided that the above copyright notice and this | |
7 * permission notice appear in all copies. | |
8 * | |
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |
10 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |
11 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |
12 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |
13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
15 */ | |
16 | |
17 #ifdef _MSC_VER | |
18 # pragma warning(disable:4661) /* instantiated template classes whose methods are defined elsewhere */ | |
19 #elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) | |
20 # pragma GCC diagnostic push | |
21 # pragma GCC diagnostic ignored "-Wconversion" | |
22 #endif | |
23 | |
24 #include "../Geometry.hpp" | |
25 | |
26 #include <cmath> | |
27 | |
28 START_NAMESPACE_DGL | |
29 | |
30 static const float M_2PIf = 3.14159265358979323846f*2.0f; | |
31 | |
32 // ----------------------------------------------------------------------- | |
33 // Point | |
34 | |
35 template<typename T> | |
36 Point<T>::Point() noexcept | |
37 : x(0), | |
38 y(0) {} | |
39 | |
40 template<typename T> | |
41 Point<T>::Point(const T& x2, const T& y2) noexcept | |
42 : x(x2), | |
43 y(y2) {} | |
44 | |
45 template<typename T> | |
46 Point<T>::Point(const Point<T>& pos) noexcept | |
47 : x(pos.x), | |
48 y(pos.y) {} | |
49 | |
50 template<typename T> | |
51 const T& Point<T>::getX() const noexcept | |
52 { | |
53 return x; | |
54 } | |
55 | |
56 template<typename T> | |
57 const T& Point<T>::getY() const noexcept | |
58 { | |
59 return y; | |
60 } | |
61 | |
62 template<typename T> | |
63 void Point<T>::setX(const T& x2) noexcept | |
64 { | |
65 x = x2; | |
66 } | |
67 | |
68 template<typename T> | |
69 void Point<T>::setY(const T& y2) noexcept | |
70 { | |
71 y = y2; | |
72 } | |
73 | |
74 template<typename T> | |
75 void Point<T>::setPos(const T& x2, const T& y2) noexcept | |
76 { | |
77 x = x2; | |
78 y = y2; | |
79 } | |
80 | |
81 template<typename T> | |
82 void Point<T>::setPos(const Point<T>& pos) noexcept | |
83 { | |
84 x = pos.x; | |
85 y = pos.y; | |
86 } | |
87 | |
88 template<typename T> | |
89 void Point<T>::moveBy(const T& x2, const T& y2) noexcept | |
90 { | |
91 x = static_cast<T>(x+x2); | |
92 y = static_cast<T>(y+y2); | |
93 } | |
94 | |
95 template<typename T> | |
96 void Point<T>::moveBy(const Point<T>& pos) noexcept | |
97 { | |
98 x = static_cast<T>(x+pos.x); | |
99 y = static_cast<T>(y+pos.y); | |
100 } | |
101 | |
102 template<typename T> | |
103 bool Point<T>::isZero() const noexcept | |
104 { | |
105 return x == 0 && y == 0; | |
106 } | |
107 | |
108 template<typename T> | |
109 bool Point<T>::isNotZero() const noexcept | |
110 { | |
111 return x != 0 || y != 0; | |
112 } | |
113 | |
114 template<typename T> | |
115 Point<T> Point<T>::operator+(const Point<T>& pos) noexcept | |
116 { | |
117 return Point<T>(x+pos.x, y+pos.y); | |
118 } | |
119 | |
120 template<typename T> | |
121 Point<T> Point<T>::operator-(const Point<T>& pos) noexcept | |
122 { | |
123 return Point<T>(x-pos.x, y-pos.y); | |
124 } | |
125 | |
126 template<typename T> | |
127 Point<T>& Point<T>::operator=(const Point<T>& pos) noexcept | |
128 { | |
129 x = pos.x; | |
130 y = pos.y; | |
131 return *this; | |
132 } | |
133 | |
134 template<typename T> | |
135 Point<T>& Point<T>::operator+=(const Point<T>& pos) noexcept | |
136 { | |
137 x = static_cast<T>(x+pos.x); | |
138 y = static_cast<T>(y+pos.y); | |
139 return *this; | |
140 } | |
141 | |
142 template<typename T> | |
143 Point<T>& Point<T>::operator-=(const Point<T>& pos) noexcept | |
144 { | |
145 x = static_cast<T>(x-pos.x); | |
146 y = static_cast<T>(y-pos.y); | |
147 return *this; | |
148 } | |
149 | |
150 template<typename T> | |
151 bool Point<T>::operator==(const Point<T>& pos) const noexcept | |
152 { | |
153 return (x == pos.x && y == pos.y); | |
154 } | |
155 | |
156 template<typename T> | |
157 bool Point<T>::operator!=(const Point<T>& pos) const noexcept | |
158 { | |
159 return (x != pos.x || y != pos.y); | |
160 } | |
161 | |
162 // ----------------------------------------------------------------------- | |
163 // Size | |
164 | |
165 template<typename T> | |
166 Size<T>::Size() noexcept | |
167 : fWidth(0), | |
168 fHeight(0) {} | |
169 | |
170 template<typename T> | |
171 Size<T>::Size(const T& width, const T& height) noexcept | |
172 : fWidth(width), | |
173 fHeight(height) {} | |
174 | |
175 template<typename T> | |
176 Size<T>::Size(const Size<T>& size) noexcept | |
177 : fWidth(size.fWidth), | |
178 fHeight(size.fHeight) {} | |
179 | |
180 template<typename T> | |
181 const T& Size<T>::getWidth() const noexcept | |
182 { | |
183 return fWidth; | |
184 } | |
185 | |
186 template<typename T> | |
187 const T& Size<T>::getHeight() const noexcept | |
188 { | |
189 return fHeight; | |
190 } | |
191 | |
192 template<typename T> | |
193 void Size<T>::setWidth(const T& width) noexcept | |
194 { | |
195 fWidth = width; | |
196 } | |
197 | |
198 template<typename T> | |
199 void Size<T>::setHeight(const T& height) noexcept | |
200 { | |
201 fHeight = height; | |
202 } | |
203 | |
204 template<typename T> | |
205 void Size<T>::setSize(const T& width, const T& height) noexcept | |
206 { | |
207 fWidth = width; | |
208 fHeight = height; | |
209 } | |
210 | |
211 template<typename T> | |
212 void Size<T>::setSize(const Size<T>& size) noexcept | |
213 { | |
214 fWidth = size.fWidth; | |
215 fHeight = size.fHeight; | |
216 } | |
217 | |
218 template<typename T> | |
219 void Size<T>::growBy(double multiplier) noexcept | |
220 { | |
221 fWidth = static_cast<T>(static_cast<double>(fWidth)*multiplier); | |
222 fHeight = static_cast<T>(static_cast<double>(fHeight)*multiplier); | |
223 } | |
224 | |
225 template<typename T> | |
226 void Size<T>::shrinkBy(double divider) noexcept | |
227 { | |
228 fWidth = static_cast<T>(static_cast<double>(fWidth)/divider); | |
229 fHeight = static_cast<T>(static_cast<double>(fHeight)/divider); | |
230 } | |
231 | |
232 template<typename T> | |
233 bool Size<T>::isNull() const noexcept | |
234 { | |
235 return fWidth == 0 && fHeight == 0; | |
236 } | |
237 | |
238 template<typename T> | |
239 bool Size<T>::isNotNull() const noexcept | |
240 { | |
241 return fWidth != 0 || fHeight != 0; | |
242 } | |
243 | |
244 template<typename T> | |
245 bool Size<T>::isValid() const noexcept | |
246 { | |
247 return fWidth > 0 && fHeight > 0; | |
248 } | |
249 | |
250 template<typename T> | |
251 bool Size<T>::isInvalid() const noexcept | |
252 { | |
253 return fWidth <= 0 || fHeight <= 0; | |
254 } | |
255 | |
256 template<typename T> | |
257 Size<int> Size<T>::toInt() const noexcept | |
258 { | |
259 return Size<int>(static_cast<int>(fWidth), | |
260 static_cast<int>(fHeight)); | |
261 } | |
262 | |
263 template<> | |
264 Size<int> Size<double>::toInt() const noexcept | |
265 { | |
266 return Size<int>(static_cast<int>(fWidth + 0.5), | |
267 static_cast<int>(fHeight + 0.5)); | |
268 } | |
269 | |
270 template<> | |
271 Size<int> Size<float>::toInt() const noexcept | |
272 { | |
273 return Size<int>(static_cast<int>(fWidth + 0.5f), | |
274 static_cast<int>(fHeight + 0.5f)); | |
275 } | |
276 | |
277 template<typename T> | |
278 Size<T> Size<T>::operator+(const Size<T>& size) noexcept | |
279 { | |
280 return Size<T>(fWidth+size.fWidth, fHeight+size.fHeight); | |
281 } | |
282 | |
283 template<typename T> | |
284 Size<T> Size<T>::operator-(const Size<T>& size) noexcept | |
285 { | |
286 return Size<T>(fWidth-size.fWidth, fHeight-size.fHeight); | |
287 } | |
288 | |
289 template<typename T> | |
290 Size<T>& Size<T>::operator=(const Size<T>& size) noexcept | |
291 { | |
292 fWidth = size.fWidth; | |
293 fHeight = size.fHeight; | |
294 return *this; | |
295 } | |
296 | |
297 template<typename T> | |
298 Size<T>& Size<T>::operator+=(const Size<T>& size) noexcept | |
299 { | |
300 fWidth = static_cast<T>(fWidth+size.fWidth); | |
301 fHeight = static_cast<T>(fHeight+size.fHeight); | |
302 return *this; | |
303 } | |
304 | |
305 template<typename T> | |
306 Size<T>& Size<T>::operator-=(const Size<T>& size) noexcept | |
307 { | |
308 fWidth = static_cast<T>(fWidth-size.fWidth); | |
309 fHeight = static_cast<T>(fHeight-size.fHeight); | |
310 return *this; | |
311 } | |
312 | |
313 template<typename T> | |
314 Size<T>& Size<T>::operator*=(double m) noexcept | |
315 { | |
316 fWidth = static_cast<T>(static_cast<double>(fWidth)*m); | |
317 fHeight = static_cast<T>(static_cast<double>(fHeight)*m); | |
318 return *this; | |
319 } | |
320 | |
321 template<typename T> | |
322 Size<T>& Size<T>::operator/=(double d) noexcept | |
323 { | |
324 fWidth = static_cast<T>(static_cast<double>(fWidth)/d); | |
325 fHeight = static_cast<T>(static_cast<double>(fHeight)/d); | |
326 return *this; | |
327 } | |
328 | |
329 template<typename T> | |
330 Size<T> Size<T>::operator*(const double m) const noexcept | |
331 { | |
332 Size<T> size(fWidth, fHeight); | |
333 size *= m; | |
334 return size; | |
335 } | |
336 | |
337 template<typename T> | |
338 Size<T> Size<T>::operator/(const double m) const noexcept | |
339 { | |
340 Size<T> size(fWidth, fHeight); | |
341 size /= m; | |
342 return size; | |
343 } | |
344 | |
345 template<typename T> | |
346 bool Size<T>::operator==(const Size<T>& size) const noexcept | |
347 { | |
348 return (fWidth == size.fWidth && fHeight == size.fHeight); | |
349 } | |
350 | |
351 template<typename T> | |
352 bool Size<T>::operator!=(const Size<T>& size) const noexcept | |
353 { | |
354 return (fWidth != size.fWidth || fHeight != size.fHeight); | |
355 } | |
356 | |
357 // ----------------------------------------------------------------------- | |
358 // Line | |
359 | |
360 template<typename T> | |
361 Line<T>::Line() noexcept | |
362 : posStart(0, 0), | |
363 posEnd(0, 0) {} | |
364 | |
365 template<typename T> | |
366 Line<T>::Line(const T& startX, const T& startY, const T& endX, const T& endY) noexcept | |
367 : posStart(startX, startY), | |
368 posEnd(endX, endY) {} | |
369 | |
370 template<typename T> | |
371 Line<T>::Line(const T& startX, const T& startY, const Point<T>& endPos) noexcept | |
372 : posStart(startX, startY), | |
373 posEnd(endPos) {} | |
374 | |
375 template<typename T> | |
376 Line<T>::Line(const Point<T>& startPos, const T& endX, const T& endY) noexcept | |
377 : posStart(startPos), | |
378 posEnd(endX, endY) {} | |
379 | |
380 template<typename T> | |
381 Line<T>::Line(const Point<T>& startPos, const Point<T>& endPos) noexcept | |
382 : posStart(startPos), | |
383 posEnd(endPos) {} | |
384 | |
385 template<typename T> | |
386 Line<T>::Line(const Line<T>& line) noexcept | |
387 : posStart(line.posStart), | |
388 posEnd(line.posEnd) {} | |
389 | |
390 template<typename T> | |
391 const T& Line<T>::getStartX() const noexcept | |
392 { | |
393 return posStart.x; | |
394 } | |
395 | |
396 template<typename T> | |
397 const T& Line<T>::getStartY() const noexcept | |
398 { | |
399 return posStart.y; | |
400 } | |
401 | |
402 template<typename T> | |
403 const T& Line<T>::getEndX() const noexcept | |
404 { | |
405 return posEnd.x; | |
406 } | |
407 | |
408 template<typename T> | |
409 const T& Line<T>::getEndY() const noexcept | |
410 { | |
411 return posEnd.y; | |
412 } | |
413 | |
414 template<typename T> | |
415 const Point<T>& Line<T>::getStartPos() const noexcept | |
416 { | |
417 return posStart; | |
418 } | |
419 | |
420 template<typename T> | |
421 const Point<T>& Line<T>::getEndPos() const noexcept | |
422 { | |
423 return posEnd; | |
424 } | |
425 | |
426 template<typename T> | |
427 void Line<T>::setStartX(const T& x) noexcept | |
428 { | |
429 posStart.x = x; | |
430 } | |
431 | |
432 template<typename T> | |
433 void Line<T>::setStartY(const T& y) noexcept | |
434 { | |
435 posStart.y = y; | |
436 } | |
437 | |
438 template<typename T> | |
439 void Line<T>::setStartPos(const T& x, const T& y) noexcept | |
440 { | |
441 posStart = Point<T>(x, y); | |
442 } | |
443 | |
444 template<typename T> | |
445 void Line<T>::setStartPos(const Point<T>& pos) noexcept | |
446 { | |
447 posStart = pos; | |
448 } | |
449 | |
450 template<typename T> | |
451 void Line<T>::setEndX(const T& x) noexcept | |
452 { | |
453 posEnd.x = x; | |
454 } | |
455 | |
456 template<typename T> | |
457 void Line<T>::setEndY(const T& y) noexcept | |
458 { | |
459 posEnd.y = y; | |
460 } | |
461 | |
462 template<typename T> | |
463 void Line<T>::setEndPos(const T& x, const T& y) noexcept | |
464 { | |
465 posEnd = Point<T>(x, y); | |
466 } | |
467 | |
468 template<typename T> | |
469 void Line<T>::setEndPos(const Point<T>& pos) noexcept | |
470 { | |
471 posEnd = pos; | |
472 } | |
473 | |
474 template<typename T> | |
475 void Line<T>::moveBy(const T& x, const T& y) noexcept | |
476 { | |
477 posStart.moveBy(x, y); | |
478 posEnd.moveBy(x, y); | |
479 } | |
480 | |
481 template<typename T> | |
482 void Line<T>::moveBy(const Point<T>& pos) noexcept | |
483 { | |
484 posStart.moveBy(pos); | |
485 posEnd.moveBy(pos); | |
486 } | |
487 | |
488 template<typename T> | |
489 bool Line<T>::isNull() const noexcept | |
490 { | |
491 return posStart == posEnd; | |
492 } | |
493 | |
494 template<typename T> | |
495 bool Line<T>::isNotNull() const noexcept | |
496 { | |
497 return posStart != posEnd; | |
498 } | |
499 | |
500 template<typename T> | |
501 Line<T>& Line<T>::operator=(const Line<T>& line) noexcept | |
502 { | |
503 posStart = line.posStart; | |
504 posEnd = line.posEnd; | |
505 return *this; | |
506 } | |
507 | |
508 template<typename T> | |
509 bool Line<T>::operator==(const Line<T>& line) const noexcept | |
510 { | |
511 return (posStart == line.posStart && posEnd == line.posEnd); | |
512 } | |
513 | |
514 template<typename T> | |
515 bool Line<T>::operator!=(const Line<T>& line) const noexcept | |
516 { | |
517 return (posStart != line.posStart || posEnd != line.posEnd); | |
518 } | |
519 | |
520 // ----------------------------------------------------------------------- | |
521 // Circle | |
522 | |
523 template<typename T> | |
524 Circle<T>::Circle() noexcept | |
525 : fPos(0, 0), | |
526 fSize(0.0f), | |
527 fNumSegments(0), | |
528 fTheta(0.0f), | |
529 fCos(0.0f), | |
530 fSin(0.0f) {} | |
531 | |
532 template<typename T> | |
533 Circle<T>::Circle(const T& x, const T& y, const float size, const uint numSegments) | |
534 : fPos(x, y), | |
535 fSize(size), | |
536 fNumSegments(numSegments >= 3 ? numSegments : 3), | |
537 fTheta(M_2PIf / static_cast<float>(fNumSegments)), | |
538 fCos(std::cos(fTheta)), | |
539 fSin(std::sin(fTheta)) | |
540 { | |
541 DISTRHO_SAFE_ASSERT(fSize > 0.0f); | |
542 } | |
543 | |
544 template<typename T> | |
545 Circle<T>::Circle(const Point<T>& pos, const float size, const uint numSegments) | |
546 : fPos(pos), | |
547 fSize(size), | |
548 fNumSegments(numSegments >= 3 ? numSegments : 3), | |
549 fTheta(M_2PIf / static_cast<float>(fNumSegments)), | |
550 fCos(std::cos(fTheta)), | |
551 fSin(std::sin(fTheta)) | |
552 { | |
553 DISTRHO_SAFE_ASSERT(fSize > 0.0f); | |
554 } | |
555 | |
556 template<typename T> | |
557 Circle<T>::Circle(const Circle<T>& cir) noexcept | |
558 : fPos(cir.fPos), | |
559 fSize(cir.fSize), | |
560 fNumSegments(cir.fNumSegments), | |
561 fTheta(cir.fTheta), | |
562 fCos(cir.fCos), | |
563 fSin(cir.fSin) | |
564 { | |
565 DISTRHO_SAFE_ASSERT(fSize > 0.0f); | |
566 } | |
567 | |
568 template<typename T> | |
569 const T& Circle<T>::getX() const noexcept | |
570 { | |
571 return fPos.x; | |
572 } | |
573 | |
574 template<typename T> | |
575 const T& Circle<T>::getY() const noexcept | |
576 { | |
577 return fPos.y; | |
578 } | |
579 | |
580 template<typename T> | |
581 const Point<T>& Circle<T>::getPos() const noexcept | |
582 { | |
583 return fPos; | |
584 } | |
585 | |
586 template<typename T> | |
587 void Circle<T>::setX(const T& x) noexcept | |
588 { | |
589 fPos.x = x; | |
590 } | |
591 | |
592 template<typename T> | |
593 void Circle<T>::setY(const T& y) noexcept | |
594 { | |
595 fPos.y = y; | |
596 } | |
597 | |
598 template<typename T> | |
599 void Circle<T>::setPos(const T& x, const T& y) noexcept | |
600 { | |
601 fPos.x = x; | |
602 fPos.y = y; | |
603 } | |
604 | |
605 template<typename T> | |
606 void Circle<T>::setPos(const Point<T>& pos) noexcept | |
607 { | |
608 fPos = pos; | |
609 } | |
610 | |
611 template<typename T> | |
612 float Circle<T>::getSize() const noexcept | |
613 { | |
614 return fSize; | |
615 } | |
616 | |
617 template<typename T> | |
618 void Circle<T>::setSize(const float size) noexcept | |
619 { | |
620 DISTRHO_SAFE_ASSERT_RETURN(size > 0.0f,); | |
621 | |
622 fSize = size; | |
623 } | |
624 | |
625 template<typename T> | |
626 uint Circle<T>::getNumSegments() const noexcept | |
627 { | |
628 return fNumSegments; | |
629 } | |
630 | |
631 template<typename T> | |
632 void Circle<T>::setNumSegments(const uint num) | |
633 { | |
634 DISTRHO_SAFE_ASSERT_RETURN(num >= 3,); | |
635 | |
636 if (fNumSegments == num) | |
637 return; | |
638 | |
639 fNumSegments = num; | |
640 | |
641 fTheta = M_2PIf / static_cast<float>(fNumSegments); | |
642 fCos = std::cos(fTheta); | |
643 fSin = std::sin(fTheta); | |
644 } | |
645 | |
646 template<typename T> | |
647 Circle<T>& Circle<T>::operator=(const Circle<T>& cir) noexcept | |
648 { | |
649 fPos = cir.fPos; | |
650 fSize = cir.fSize; | |
651 fTheta = cir.fTheta; | |
652 fCos = cir.fCos; | |
653 fSin = cir.fSin; | |
654 fNumSegments = cir.fNumSegments; | |
655 return *this; | |
656 } | |
657 | |
658 template<typename T> | |
659 bool Circle<T>::operator==(const Circle<T>& cir) const noexcept | |
660 { | |
661 return (fPos == cir.fPos && d_isEqual(fSize, cir.fSize) && fNumSegments == cir.fNumSegments); | |
662 } | |
663 | |
664 template<typename T> | |
665 bool Circle<T>::operator!=(const Circle<T>& cir) const noexcept | |
666 { | |
667 return (fPos != cir.fPos || d_isNotEqual(fSize, cir.fSize) || fNumSegments != cir.fNumSegments); | |
668 } | |
669 | |
670 // ----------------------------------------------------------------------- | |
671 // Triangle | |
672 | |
673 template<typename T> | |
674 Triangle<T>::Triangle() noexcept | |
675 : pos1(0, 0), | |
676 pos2(0, 0), | |
677 pos3(0, 0) {} | |
678 | |
679 template<typename T> | |
680 Triangle<T>::Triangle(const T& x1, const T& y1, const T& x2, const T& y2, const T& x3, const T& y3) noexcept | |
681 : pos1(x1, y1), | |
682 pos2(x2, y2), | |
683 pos3(x3, y3) {} | |
684 | |
685 template<typename T> | |
686 Triangle<T>::Triangle(const Point<T>& p1, const Point<T>& p2, const Point<T>& p3) noexcept | |
687 : pos1(p1), | |
688 pos2(p2), | |
689 pos3(p3) {} | |
690 | |
691 template<typename T> | |
692 Triangle<T>::Triangle(const Triangle<T>& tri) noexcept | |
693 : pos1(tri.pos1), | |
694 pos2(tri.pos2), | |
695 pos3(tri.pos3) {} | |
696 | |
697 template<typename T> | |
698 bool Triangle<T>::isNull() const noexcept | |
699 { | |
700 return pos1 == pos2 && pos1 == pos3; | |
701 } | |
702 | |
703 template<typename T> | |
704 bool Triangle<T>::isNotNull() const noexcept | |
705 { | |
706 return pos1 != pos2 || pos1 != pos3; | |
707 } | |
708 | |
709 template<typename T> | |
710 bool Triangle<T>::isValid() const noexcept | |
711 { | |
712 return pos1 != pos2 && pos1 != pos3; | |
713 } | |
714 | |
715 template<typename T> | |
716 bool Triangle<T>::isInvalid() const noexcept | |
717 { | |
718 return pos1 == pos2 || pos1 == pos3; | |
719 } | |
720 | |
721 template<typename T> | |
722 Triangle<T>& Triangle<T>::operator=(const Triangle<T>& tri) noexcept | |
723 { | |
724 pos1 = tri.pos1; | |
725 pos2 = tri.pos2; | |
726 pos3 = tri.pos3; | |
727 return *this; | |
728 } | |
729 | |
730 template<typename T> | |
731 bool Triangle<T>::operator==(const Triangle<T>& tri) const noexcept | |
732 { | |
733 return (pos1 == tri.pos1 && pos2 == tri.pos2 && pos3 == tri.pos3); | |
734 } | |
735 | |
736 template<typename T> | |
737 bool Triangle<T>::operator!=(const Triangle<T>& tri) const noexcept | |
738 { | |
739 return (pos1 != tri.pos1 || pos2 != tri.pos2 || pos3 != tri.pos3); | |
740 } | |
741 | |
742 // ----------------------------------------------------------------------- | |
743 // Rectangle | |
744 | |
745 template<typename T> | |
746 Rectangle<T>::Rectangle() noexcept | |
747 : pos(0, 0), | |
748 size(0, 0) {} | |
749 | |
750 template<typename T> | |
751 Rectangle<T>::Rectangle(const T& x, const T& y, const T& w, const T& h) noexcept | |
752 : pos(x, y), | |
753 size(w, h) {} | |
754 | |
755 template<typename T> | |
756 Rectangle<T>::Rectangle(const T& x, const T& y, const Size<T>& s) noexcept | |
757 : pos(x, y), | |
758 size(s) {} | |
759 | |
760 template<typename T> | |
761 Rectangle<T>::Rectangle(const Point<T>& p, const T& w, const T& h) noexcept | |
762 : pos(p), | |
763 size(w, h) {} | |
764 | |
765 template<typename T> | |
766 Rectangle<T>::Rectangle(const Point<T>& p, const Size<T>& s) noexcept | |
767 : pos(p), | |
768 size(s) {} | |
769 | |
770 template<typename T> | |
771 Rectangle<T>::Rectangle(const Rectangle<T>& rect) noexcept | |
772 : pos(rect.pos), | |
773 size(rect.size) {} | |
774 | |
775 template<typename T> | |
776 const T& Rectangle<T>::getX() const noexcept | |
777 { | |
778 return pos.x; | |
779 } | |
780 | |
781 template<typename T> | |
782 const T& Rectangle<T>::getY() const noexcept | |
783 { | |
784 return pos.y; | |
785 } | |
786 | |
787 template<typename T> | |
788 const T& Rectangle<T>::getWidth() const noexcept | |
789 { | |
790 return size.fWidth; | |
791 } | |
792 | |
793 template<typename T> | |
794 const T& Rectangle<T>::getHeight() const noexcept | |
795 { | |
796 return size.fHeight; | |
797 } | |
798 | |
799 template<typename T> | |
800 const Point<T>& Rectangle<T>::getPos() const noexcept | |
801 { | |
802 return pos; | |
803 } | |
804 | |
805 template<typename T> | |
806 const Size<T>& Rectangle<T>::getSize() const noexcept | |
807 { | |
808 return size; | |
809 } | |
810 | |
811 template<typename T> | |
812 void Rectangle<T>::setX(const T& x) noexcept | |
813 { | |
814 pos.x = x; | |
815 } | |
816 | |
817 template<typename T> | |
818 void Rectangle<T>::setY(const T& y) noexcept | |
819 { | |
820 pos.y = y; | |
821 } | |
822 | |
823 template<typename T> | |
824 void Rectangle<T>::setPos(const T& x, const T& y) noexcept | |
825 { | |
826 pos.x = x; | |
827 pos.y = y; | |
828 } | |
829 | |
830 template<typename T> | |
831 void Rectangle<T>::setPos(const Point<T>& pos2) noexcept | |
832 { | |
833 pos = pos2; | |
834 } | |
835 | |
836 template<typename T> | |
837 void Rectangle<T>::moveBy(const T& x, const T& y) noexcept | |
838 { | |
839 pos.moveBy(x, y); | |
840 } | |
841 | |
842 template<typename T> | |
843 void Rectangle<T>::moveBy(const Point<T>& pos2) noexcept | |
844 { | |
845 pos.moveBy(pos2); | |
846 } | |
847 | |
848 template<typename T> | |
849 void Rectangle<T>::setWidth(const T& width) noexcept | |
850 { | |
851 size.fWidth = width; | |
852 } | |
853 | |
854 template<typename T> | |
855 void Rectangle<T>::setHeight(const T& height) noexcept | |
856 { | |
857 size.fHeight = height; | |
858 } | |
859 | |
860 template<typename T> | |
861 void Rectangle<T>::setSize(const T& width, const T& height) noexcept | |
862 { | |
863 size.fWidth = width; | |
864 size.fHeight = height; | |
865 } | |
866 | |
867 template<typename T> | |
868 void Rectangle<T>::setSize(const Size<T>& size2) noexcept | |
869 { | |
870 size = size2; | |
871 } | |
872 | |
873 template<typename T> | |
874 void Rectangle<T>::growBy(double multiplier) noexcept | |
875 { | |
876 size.growBy(multiplier); | |
877 } | |
878 | |
879 template<typename T> | |
880 void Rectangle<T>::shrinkBy(double divider) noexcept | |
881 { | |
882 size.shrinkBy(divider); | |
883 } | |
884 | |
885 template<typename T> | |
886 void Rectangle<T>::setRectangle(const Point<T>& pos2, const Size<T>& size2) noexcept | |
887 { | |
888 pos = pos2; | |
889 size = size2; | |
890 } | |
891 | |
892 template<typename T> | |
893 void Rectangle<T>::setRectangle(const Rectangle<T>& rect) noexcept | |
894 { | |
895 pos = rect.pos; | |
896 size = rect.size; | |
897 } | |
898 | |
899 template<typename T> | |
900 bool Rectangle<T>::contains(const T& x, const T& y) const noexcept | |
901 { | |
902 return (x >= pos.x && y >= pos.y && x <= pos.x+size.fWidth && y <= pos.y+size.fHeight); | |
903 } | |
904 | |
905 template<typename T> | |
906 bool Rectangle<T>::contains(const Point<T>& p) const noexcept | |
907 { | |
908 return contains(p.x, p.y); | |
909 } | |
910 | |
911 template<typename T> | |
912 template<typename T2> | |
913 bool Rectangle<T>::contains(const Point<T2>& p) const noexcept | |
914 { | |
915 return (p.x >= pos.x && p.y >= pos.y && p.x <= pos.x+size.fWidth && p.y <= pos.y+size.fHeight); | |
916 } | |
917 | |
918 template<> template<> | |
919 bool Rectangle<int>::contains(const Point<double>& p) const noexcept | |
920 { | |
921 return (p.x >= pos.x && p.y >= pos.y && p.x <= pos.x+size.fWidth && p.y <= pos.y+size.fHeight); | |
922 } | |
923 | |
924 template<> template<> | |
925 bool Rectangle<uint>::contains(const Point<double>& p) const noexcept | |
926 { | |
927 return (p.x >= pos.x && p.y >= pos.y && p.x <= pos.x+size.fWidth && p.y <= pos.y+size.fHeight); | |
928 } | |
929 | |
930 template<typename T> | |
931 bool Rectangle<T>::containsAfterScaling(const Point<T>& p, const double scaling) const noexcept | |
932 { | |
933 return (p.x >= pos.x && p.y >= pos.y && p.x/scaling <= pos.x+size.fWidth && p.y/scaling <= pos.y+size.fHeight); | |
934 } | |
935 | |
936 template<typename T> | |
937 bool Rectangle<T>::containsX(const T& x) const noexcept | |
938 { | |
939 return (x >= pos.x && x <= pos.x + size.fWidth); | |
940 } | |
941 | |
942 template<typename T> | |
943 bool Rectangle<T>::containsY(const T& y) const noexcept | |
944 { | |
945 return (y >= pos.y && y <= pos.y + size.fHeight); | |
946 } | |
947 | |
948 template<typename T> | |
949 bool Rectangle<T>::isNull() const noexcept | |
950 { | |
951 return size.isNull(); | |
952 } | |
953 | |
954 template<typename T> | |
955 bool Rectangle<T>::isNotNull() const noexcept | |
956 { | |
957 return size.isNotNull(); | |
958 } | |
959 | |
960 template<typename T> | |
961 bool Rectangle<T>::isValid() const noexcept | |
962 { | |
963 return size.isValid(); | |
964 } | |
965 | |
966 template<typename T> | |
967 bool Rectangle<T>::isInvalid() const noexcept | |
968 { | |
969 return size.isInvalid(); | |
970 } | |
971 | |
972 template<typename T> | |
973 Rectangle<T>& Rectangle<T>::operator=(const Rectangle<T>& rect) noexcept | |
974 { | |
975 pos = rect.pos; | |
976 size = rect.size; | |
977 return *this; | |
978 } | |
979 | |
980 template<typename T> | |
981 Rectangle<T>& Rectangle<T>::operator*=(double m) noexcept | |
982 { | |
983 size *= m; | |
984 return *this; | |
985 } | |
986 | |
987 template<typename T> | |
988 Rectangle<T>& Rectangle<T>::operator/=(double d) noexcept | |
989 { | |
990 size /= d; | |
991 return *this; | |
992 } | |
993 | |
994 template<typename T> | |
995 bool Rectangle<T>::operator==(const Rectangle<T>& rect) const noexcept | |
996 { | |
997 return (pos == rect.pos && size == rect.size); | |
998 } | |
999 | |
1000 template<typename T> | |
1001 bool Rectangle<T>::operator!=(const Rectangle<T>& rect) const noexcept | |
1002 { | |
1003 return (pos != rect.pos || size != rect.size); | |
1004 } | |
1005 | |
1006 // ----------------------------------------------------------------------- | |
1007 // Possible template data types | |
1008 | |
1009 template class Point<double>; | |
1010 template class Point<float>; | |
1011 template class Point<int>; | |
1012 template class Point<uint>; | |
1013 template class Point<short>; | |
1014 template class Point<ushort>; | |
1015 | |
1016 template class Size<double>; | |
1017 template class Size<float>; | |
1018 template class Size<int>; | |
1019 template class Size<uint>; | |
1020 template class Size<short>; | |
1021 template class Size<ushort>; | |
1022 | |
1023 template class Line<double>; | |
1024 template class Line<float>; | |
1025 template class Line<int>; | |
1026 template class Line<uint>; | |
1027 template class Line<short>; | |
1028 template class Line<ushort>; | |
1029 | |
1030 template class Circle<double>; | |
1031 template class Circle<float>; | |
1032 template class Circle<int>; | |
1033 template class Circle<uint>; | |
1034 template class Circle<short>; | |
1035 template class Circle<ushort>; | |
1036 | |
1037 template class Triangle<double>; | |
1038 template class Triangle<float>; | |
1039 template class Triangle<int>; | |
1040 template class Triangle<uint>; | |
1041 template class Triangle<short>; | |
1042 template class Triangle<ushort>; | |
1043 | |
1044 template class Rectangle<double>; | |
1045 template class Rectangle<float>; | |
1046 template class Rectangle<int>; | |
1047 template class Rectangle<uint>; | |
1048 template class Rectangle<short>; | |
1049 template class Rectangle<ushort>; | |
1050 | |
1051 // ----------------------------------------------------------------------- | |
1052 | |
1053 END_NAMESPACE_DGL |