TrinityCore
Loading...
Searching...
No Matches
AreaBoundary.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "AreaBoundary.h"
19#include "Errors.h"
20
21// ---== RECTANGLE ==---
22RectangleBoundary::RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted) :
23 AreaBoundary(isInverted), _minX(southX), _maxX(northX), _minY(eastY), _maxY(westY) { }
24
26{
27 return pos->GetPositionX() >= _minX && pos->GetPositionX() <= _maxX
28 && pos->GetPositionY() >= _minY && pos->GetPositionY() <= _maxY;
29}
30
31// ---== CIRCLE ==---
32CircleBoundary::CircleBoundary(Position const& center, float radius, bool isInverted) :
33 AreaBoundary(isInverted), _center(center), _radiusSq(radius * radius) { }
34
35CircleBoundary::CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted) :
36 AreaBoundary(isInverted), _center(center), _radiusSq(_center.GetExactDist2dSq(pointOnCircle)) { }
37
39{
40 return _center.GetExactDistSq(pos) <= _radiusSq;
41}
42
43// ---== ELLIPSE ==---
44EllipseBoundary::EllipseBoundary(Position const& center, float radiusX, float radiusY, bool isInverted) :
45 AreaBoundary(isInverted), _center(center), _radiusYSq(radiusY * radiusY), _scaleXSq(_radiusYSq / (radiusX * radiusX)) { }
46
48{
49 float offX = _center.GetPositionX() - pos->GetPositionX();
50 float offY = _center.GetPositionY() - pos->GetPositionY();
51 return (offX * offX) * _scaleXSq + (offY * offY) <= _radiusYSq;
52}
53
54// ---== TRIANGLE ==---
55TriangleBoundary::TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted) :
56 AreaBoundary(isInverted), _a(pointA), _b(pointB), _c(pointC),
57 _abx(_b.GetPositionX() - _a.GetPositionX()), _bcx(_c.GetPositionX() - _b.GetPositionX()), _cax(_a.GetPositionX() - _c.GetPositionX()),
58 _aby(_b.GetPositionY() - _a.GetPositionY()), _bcy(_c.GetPositionY() - _b.GetPositionY()), _cay(_a.GetPositionY() - _c.GetPositionY()) { }
59
61{
62 // half-plane signs
63 bool sign1 = ((-_b.GetPositionX() + pos->GetPositionX()) * _aby - (-_b.GetPositionY() + pos->GetPositionY()) * _abx) < 0;
64 bool sign2 = ((-_c.GetPositionX() + pos->GetPositionX()) * _bcy - (-_c.GetPositionY() + pos->GetPositionY()) * _bcx) < 0;
65 bool sign3 = ((-_a.GetPositionX() + pos->GetPositionX()) * _cay - (-_a.GetPositionY() + pos->GetPositionY()) * _cax) < 0;
66
67 // if all signs are the same, the point is inside the triangle
68 return ((sign1 == sign2) && (sign2 == sign3));
69}
70
71// ---== PARALLELOGRAM ==---
72ParallelogramBoundary::ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted) :
73 AreaBoundary(isInverted), _a(cornerA), _b(cornerB), _d(cornerD),
74 _c(_d.GetPositionX() + (_b.GetPositionX() - _a.GetPositionX()), _d.GetPositionY() + (_b.GetPositionY() - _a.GetPositionY())),
75 _abx(_b.GetPositionX() - _a.GetPositionX()), _dax(_a.GetPositionX() - _d.GetPositionX()),
76 _aby(_b.GetPositionY() - _a.GetPositionY()), _day(_a.GetPositionY() - _d.GetPositionY()) { }
77
79{
80 // half-plane signs
81 bool sign1 = ((-_b.GetPositionX() + pos->GetPositionX()) * _aby - (-_b.GetPositionY() + pos->GetPositionY()) * _abx) < 0;
82 bool sign2 = ((-_a.GetPositionX() + pos->GetPositionX()) * _day - (-_a.GetPositionY() + pos->GetPositionY()) * _dax) < 0;
83 bool sign3 = ((-_d.GetPositionY() + pos->GetPositionY()) * _abx - (-_d.GetPositionX() + pos->GetPositionX()) * _aby) < 0; // AB = -CD
84 bool sign4 = ((-_c.GetPositionY() + pos->GetPositionY()) * _dax - (-_c.GetPositionX() + pos->GetPositionX()) * _day) < 0; // DA = -BC
85
86 // if all signs are equal, the point is inside
87 return ((sign1 == sign2) && (sign2 == sign3) && (sign3 == sign4));
88}
89
90// ---== Z RANGE ==---
91ZRangeBoundary::ZRangeBoundary(float minZ, float maxZ, bool isInverted) :
92 AreaBoundary(isInverted), _minZ(minZ), _maxZ(maxZ) { }
93
95{
96 return pos->GetPositionZ() >= _minZ && pos->GetPositionZ() <= _maxZ;
97}
98
99// ---== POLYGON ==---
100PolygonBoundary::PolygonBoundary(Position const& origin, std::vector<Position>&& vertices, bool isInverted /* = false*/) :
101 AreaBoundary(isInverted), _origin(origin), _vertices(std::move(vertices)) { }
102
104{
105 return pos->IsInPolygon2D(_origin, _vertices);
106}
107
108// ---== UNION OF 2 BOUNDARIES ==---
110 AreaBoundary(isInverted), _b1(b1), _b2(b2)
111{
112 ASSERT(b1 && b2);
113}
114
116{
117 delete _b1;
118 delete _b2;
119}
120
122{
123 return _b1->IsWithinBoundary(pos) || _b2->IsWithinBoundary(pos);
124}
125
126// ---== INTERSECTION OF 2 BOUNDARIES ==---
128 AreaBoundary(isInverted), _b1(b1), _b2(b2)
129{
130 ASSERT(b1 && b2);
131}
132
138
#define ASSERT
Definition Errors.h:80
bool IsWithinBoundary(Position const *pos) const
AreaBoundary const *const _b1
AreaBoundary const *const _b2
BoundaryIntersectionBoundary(AreaBoundary const *b1, AreaBoundary const *b2, bool isInverted=false)
bool IsWithinBoundaryArea(Position const *pos) const override
BoundaryUnionBoundary(AreaBoundary const *b1, AreaBoundary const *b2, bool isInverted=false)
AreaBoundary const *const _b1
bool IsWithinBoundaryArea(Position const *pos) const override
AreaBoundary const *const _b2
float const _radiusSq
CircleBoundary(Position const &center, float radius, bool isInverted=false)
Position const _center
bool IsWithinBoundaryArea(Position const *pos) const override
bool IsWithinBoundaryArea(Position const *pos) const override
EllipseBoundary(Position const &center, float radiusX, float radiusY, bool isInverted=false)
float const _scaleXSq
float const _radiusYSq
Position const _center
ParallelogramBoundary(Position const &cornerA, Position const &cornerB, Position const &cornerD, bool isInverted=false)
bool IsWithinBoundaryArea(Position const *pos) const override
std::vector< Position > _vertices
bool IsWithinBoundaryArea(Position const *pos) const override
PolygonBoundary(Position const &origin, std::vector< Position > &&vertices, bool isInverted=false)
bool IsWithinBoundaryArea(Position const *pos) const override
float const _maxX
float const _minX
float const _maxY
RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted=false)
float const _minY
Position const _a
float const _cax
float const _abx
float const _cay
float const _aby
Position const _b
bool IsWithinBoundaryArea(Position const *pos) const override
Position const _c
float const _bcx
float const _bcy
TriangleBoundary(Position const &pointA, Position const &pointB, Position const &pointC, bool isInverted=false)
float const _maxZ
ZRangeBoundary(float minZ, float maxZ, bool isInverted=false)
float const _minZ
bool IsWithinBoundaryArea(Position const *pos) const override
STL namespace.
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
bool IsInPolygon2D(Position const &polygonOrigin, std::span< Position const > vertices) const
Definition Position.cpp:104
constexpr float GetExactDistSq(float x, float y, float z) const
Definition Position.h:121
constexpr float GetPositionZ() const
Definition Position.h:89