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 "Unit.h"
20#include "TemporarySummon.h"
21
22// ---== RECTANGLE ==---
23RectangleBoundary::RectangleBoundary(float southX, float northX, float eastY, float westY, bool isInverted) :
24 AreaBoundary(isInverted), _minX(southX), _maxX(northX), _minY(eastY), _maxY(westY) { }
26{
27 return !(
28 pos->GetPositionX() < _minX ||
29 pos->GetPositionX() > _maxX ||
30 pos->GetPositionY() < _minY ||
31 pos->GetPositionY() > _maxY
32 );
33}
34
35// ---== CIRCLE ==---
36CircleBoundary::CircleBoundary(Position const& center, double radius, bool isInverted) :
37 AreaBoundary(isInverted), _center(center), _radiusSq(radius*radius) { }
38CircleBoundary::CircleBoundary(Position const& center, Position const& pointOnCircle, bool isInverted) :
39 AreaBoundary(isInverted), _center(center), _radiusSq(_center.GetDoubleExactDist2dSq(pointOnCircle)) { }
41{
42 double offX = _center.GetDoublePositionX() - pos->GetPositionX();
43 double offY = _center.GetDoublePositionY() - pos->GetPositionY();
44 return offX*offX+offY*offY <= _radiusSq;
45}
46
47// ---== ELLIPSE ==---
48EllipseBoundary::EllipseBoundary(Position const& center, double radiusX, double radiusY, bool isInverted) :
49 AreaBoundary(isInverted), _center(center), _radiusYSq(radiusY*radiusY), _scaleXSq(_radiusYSq / (radiusX*radiusX)) { }
51{
52 double offX = _center.GetDoublePositionX() - pos->GetPositionX();
53 double offY = _center.GetDoublePositionY() - pos->GetPositionY();
54 return (offX*offX)*_scaleXSq + (offY*offY) <= _radiusYSq;
55}
56
57// ---== TRIANGLE ==---
58TriangleBoundary::TriangleBoundary(Position const& pointA, Position const& pointB, Position const& pointC, bool isInverted) :
59 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()) { }
61{
62 // half-plane signs
63 bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
64 bool sign2 = ((-_c.GetDoublePositionX() + pos->GetPositionX()) * _bcy - (-_c.GetDoublePositionY() + pos->GetPositionY()) * _bcx) < 0;
65 bool sign3 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _cay - (-_a.GetDoublePositionY() + 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), _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()) { }
75{
76 // half-plane signs
77 bool sign1 = ((-_b.GetDoublePositionX() + pos->GetPositionX()) * _aby - (-_b.GetDoublePositionY() + pos->GetPositionY()) * _abx) < 0;
78 bool sign2 = ((-_a.GetDoublePositionX() + pos->GetPositionX()) * _day - (-_a.GetDoublePositionY() + pos->GetPositionY()) * _dax) < 0;
79 bool sign3 = ((-_d.GetDoublePositionY() + pos->GetPositionY()) * _abx - (-_d.GetDoublePositionX() + pos->GetPositionX()) * _aby) < 0; // AB = -CD
80 bool sign4 = ((-_c.GetDoublePositionY() + pos->GetPositionY()) * _dax - (-_c.GetDoublePositionX() + pos->GetPositionX()) * _day) < 0; // DA = -BC
81
82 // if all signs are equal, the point is inside
83 return ((sign1 == sign2) && (sign2 == sign3) && (sign3 == sign4));
84}
85
86// ---== Z RANGE ==---
87ZRangeBoundary::ZRangeBoundary(float minZ, float maxZ, bool isInverted) :
88 AreaBoundary(isInverted), _minZ(minZ), _maxZ(maxZ) { }
90{
91 return (_minZ <= pos->GetPositionZ() && pos->GetPositionZ() <= _maxZ);
92}
93
94// ---== UNION OF 2 BOUNDARIES ==---
96 AreaBoundary(isInverted), _b1(b1), _b2(b2)
97{
98 ASSERT(b1 && b2);
99}
101{
102 delete _b1;
103 delete _b2;
104}
106{
107 return (_b1->IsWithinBoundary(pos) || _b2->IsWithinBoundary(pos));
108}
#define ASSERT
Definition Errors.h:68
bool IsWithinBoundary(Position const *pos) const
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
CircleBoundary(Position const &center, double radius, bool isInverted=false)
DoublePosition const _center
double const _radiusSq
bool IsWithinBoundaryArea(Position const *pos) const override
bool IsWithinBoundaryArea(Position const *pos) const override
DoublePosition const _center
double const _scaleXSq
double const _radiusYSq
EllipseBoundary(Position const &center, double radiusX, double radiusY, bool isInverted=false)
DoublePosition const _d
DoublePosition const _c
DoublePosition const _b
ParallelogramBoundary(Position const &cornerA, Position const &cornerB, Position const &cornerD, bool isInverted=false)
DoublePosition const _a
bool IsWithinBoundaryArea(Position const *pos) const override
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
double const _bcx
DoublePosition const _a
double const _abx
double const _aby
double const _cax
DoublePosition const _c
bool IsWithinBoundaryArea(Position const *pos) const override
DoublePosition const _b
double const _cay
TriangleBoundary(Position const &pointA, Position const &pointB, Position const &pointC, bool isInverted=false)
double const _bcy
float const _maxZ
ZRangeBoundary(float minZ, float maxZ, bool isInverted=false)
bool IsWithinBoundaryArea(Position const *pos) const override
double GetDoublePositionY() const
double GetDoublePositionX() const
float GetPositionZ() const
Definition Position.h:81
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80