TrinityCore
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 "Unit.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) { }
25{
26 return !(
27 pos->GetPositionX() < _minX ||
28 pos->GetPositionX() > _maxX ||
29 pos->GetPositionY() < _minY ||
30 pos->GetPositionY() > _maxY
31 );
32}
33
34// ---== CIRCLE ==---
35CircleBoundary::CircleBoundary(Position const& center, double radius, bool isInverted) :
36 AreaBoundary(isInverted), _center(center), _radiusSq(radius*radius) { }
37CircleBoundary::CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted) :
38 AreaBoundary(isInverted), _center(center), _radiusSq(_center.GetDoubleExactDist2dSq(pointOnCircle)) { }
40{
41 double offX = _center.GetDoublePositionX() - pos->GetPositionX();
42 double offY = _center.GetDoublePositionY() - pos->GetPositionY();
43 return offX*offX+offY*offY <= _radiusSq;
44}
45
46// ---== ELLIPSE ==---
47EllipseBoundary::EllipseBoundary(Position const& center, double radiusX, double radiusY, bool isInverted) :
48 AreaBoundary(isInverted), _center(center), _radiusYSq(radiusY*radiusY), _scaleXSq(_radiusYSq / (radiusX*radiusX)) { }
50{
51 double offX = _center.GetDoublePositionX() - pos->GetPositionX();
52 double offY = _center.GetDoublePositionY() - pos->GetPositionY();
53 return (offX*offX)*_scaleXSq + (offY*offY) <= _radiusYSq;
54}
55
56// ---== TRIANGLE ==---
57TriangleBoundary::TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted) :
58 AreaBoundary(isInverted), _a(pointA), _b(pointB), _c(pointC), _abx(_b.GetDoublePositionX()-_a.GetDoublePositionX()), _bcx(_c.GetDoublePositionX()-_b.GetDoublePositionX()), _cax(_a.GetDoublePositionX() - _c.GetDoublePositionX()), _aby(_b.GetDoublePositionY()-_a.GetDoublePositionY()), _bcy(_c.GetDoublePositionY()-_b.GetDoublePositionY()), _cay(_a.GetDoublePositionY() - _c.GetDoublePositionY()) { }
60{
61 // half-plane signs
62 bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
63 bool sign2 = ((-_c.GetDoublePositionX() + pos->GetPositionX()) * _bcy - (-_c.GetDoublePositionY() + pos->GetPositionY()) * _bcx) < 0;
64 bool sign3 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _cay - (-_a.GetDoublePositionY() + pos->GetPositionY()) * _cax) < 0;
65
66 // if all signs are the same, the point is inside the triangle
67 return ((sign1 == sign2) && (sign2 == sign3));
68}
69
70// ---== PARALLELOGRAM ==---
71ParallelogramBoundary::ParallelogramBoundary(Position const& cornerA, Position const& cornerB, Position const& cornerD, bool isInverted) :
72 AreaBoundary(isInverted), _a(cornerA), _b(cornerB), _d(cornerD), _c(DoublePosition(_d.GetDoublePositionX() + (_b.GetDoublePositionX() - _a.GetDoublePositionX()), _d.GetDoublePositionY() + (_b.GetDoublePositionY() - _a.GetDoublePositionY()))), _abx(_b.GetDoublePositionX() - _a.GetDoublePositionX()), _dax(_a.GetDoublePositionX() - _d.GetDoublePositionX()), _aby(_b.GetDoublePositionY() - _a.GetDoublePositionY()), _day(_a.GetDoublePositionY() - _d.GetDoublePositionY()) { }
74{
75 // half-plane signs
76 bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
77 bool sign2 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _day - (-_a.GetDoublePositionY() + pos->GetPositionY()) * _dax) < 0;
78 bool sign3 = ((-_d.GetDoublePositionY() + pos->GetPositionY()) * _abx - (-_d.GetDoublePositionX() + pos->GetPositionX()) * _aby) < 0; // AB = -CD
79 bool sign4 = ((-_c.GetDoublePositionY() + pos->GetPositionY()) * _dax - (-_c.GetDoublePositionX() + pos->GetPositionX()) * _day) < 0; // DA = -BC
80
81 // if all signs are equal, the point is inside
82 return ((sign1 == sign2) && (sign2 == sign3) && (sign3 == sign4));
83}
84
85// ---== Z RANGE ==---
86ZRangeBoundary::ZRangeBoundary(float minZ, float maxZ, bool isInverted) :
87 AreaBoundary(isInverted), _minZ(minZ), _maxZ(maxZ) { }
89{
90 return (_minZ <= pos->GetPositionZ() && pos->GetPositionZ() <= _maxZ);
91}
92
93// ---== UNION OF 2 BOUNDARIES ==---
95 AreaBoundary(isInverted), _b1(b1), _b2(b2)
96{
97 ASSERT(b1 && b2);
98}
100{
101 delete _b1;
102 delete _b2;
103}
105{
106 return (_b1->IsWithinBoundary(pos) || _b2->IsWithinBoundary(pos));
107}
#define ASSERT
Definition: Errors.h:68
bool IsWithinBoundary(Position const *pos) const
Definition: AreaBoundary.h:26
BoundaryUnionBoundary(AreaBoundary const *b1, AreaBoundary const *b2, bool isInverted=false)
AreaBoundary const *const _b1
Definition: AreaBoundary.h:163
bool IsWithinBoundaryArea(Position const *pos) const override
virtual ~BoundaryUnionBoundary()
AreaBoundary const *const _b2
Definition: AreaBoundary.h:164
CircleBoundary(Position const &center, double radius, bool isInverted=false)
DoublePosition const _center
Definition: AreaBoundary.h:97
double const _radiusSq
Definition: AreaBoundary.h:98
bool IsWithinBoundaryArea(Position const *pos) const override
bool IsWithinBoundaryArea(Position const *pos) const override
DoublePosition const _center
Definition: AreaBoundary.h:110
double const _scaleXSq
Definition: AreaBoundary.h:111
double const _radiusYSq
Definition: AreaBoundary.h:111
EllipseBoundary(Position const &center, double radiusX, double radiusY, bool isInverted=false)
DoublePosition const _d
Definition: AreaBoundary.h:137
DoublePosition const _c
Definition: AreaBoundary.h:137
DoublePosition const _b
Definition: AreaBoundary.h:137
ParallelogramBoundary(Position const &cornerA, Position const &cornerB, Position const &cornerD, bool isInverted=false)
DoublePosition const _a
Definition: AreaBoundary.h:137
bool IsWithinBoundaryArea(Position const *pos) const override
bool IsWithinBoundaryArea(Position const *pos) const override
float const _maxX
Definition: AreaBoundary.h:84
float const _minX
Definition: AreaBoundary.h:84
float const _maxY
Definition: AreaBoundary.h:84
RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted=false)
float const _minY
Definition: AreaBoundary.h:84
double const _bcx
Definition: AreaBoundary.h:124
DoublePosition const _a
Definition: AreaBoundary.h:123
double const _abx
Definition: AreaBoundary.h:124
double const _aby
Definition: AreaBoundary.h:124
double const _cax
Definition: AreaBoundary.h:124
DoublePosition const _c
Definition: AreaBoundary.h:123
bool IsWithinBoundaryArea(Position const *pos) const override
DoublePosition const _b
Definition: AreaBoundary.h:123
double const _cay
Definition: AreaBoundary.h:124
TriangleBoundary(Position const &pointA, Position const &pointB, Position const &pointC, bool isInverted=false)
double const _bcy
Definition: AreaBoundary.h:124
float const _maxZ
Definition: AreaBoundary.h:150
ZRangeBoundary(float minZ, float maxZ, bool isInverted=false)
bool IsWithinBoundaryArea(Position const *pos) const override
double GetDoublePositionY() const
Definition: AreaBoundary.h:46
double GetDoublePositionX() const
Definition: AreaBoundary.h:45
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetPositionZ() const
Definition: Position.h:78