TrinityCore
Loading...
Searching...
No Matches
Position.h
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#ifndef Trinity_game_Position_h__
19#define Trinity_game_Position_h__
20
21#include "Define.h"
22#include <string>
23#include <cmath>
24
25class ByteBuffer;
26
28{
30 : m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f) { }
31
32 Position(float x, float y, float z = 0.0f, float o = 0.0f)
33 : m_positionX(x), m_positionY(y), m_positionZ(z), m_orientation(NormalizeOrientation(o)) { }
34
35 // streamer tags
36 struct XY;
37 struct XYZ;
38 struct XYZO;
39 struct PackedXYZ;
40
41 template <class Tag>
43 {
44 explicit ConstStreamer(Position const& pos) : Pos(&pos) { }
45 Position const* Pos;
46 };
47
48 template <class Tag>
49 struct Streamer
50 {
51 explicit Streamer(Position& pos) : Pos(&pos) { }
52 operator ConstStreamer<Tag>() const { return ConstStreamer<Tag>(*Pos); }
54 };
55
59 // Better to limit access to _orientation field, to guarantee the value is normalized
60private:
62
63public:
64 bool operator==(Position const& a) const;
65
66 void Relocate(float x, float y) { m_positionX = x; m_positionY = y; }
67 void Relocate(float x, float y, float z) { Relocate(x, y); m_positionZ = z; }
68 void Relocate(float x, float y, float z, float o) { Relocate(x, y, z); SetOrientation(o); }
69 void Relocate(Position const& pos) { *this = pos; }
70 void Relocate(Position const* pos) { *this = *pos; }
71
72 void RelocateOffset(Position const& offset);
73
74 void SetOrientation(float orientation)
75 {
76 m_orientation = NormalizeOrientation(orientation);
77 }
78
79 float GetPositionX() const { return m_positionX; }
80 float GetPositionY() const { return m_positionY; }
81 float GetPositionZ() const { return m_positionZ; }
82 float GetOrientation() const { return m_orientation; }
83
84 void GetPosition(float &x, float &y) const { x = m_positionX; y = m_positionY; }
85 void GetPosition(float &x, float &y, float &z) const { GetPosition(x, y); z = m_positionZ; }
86 void GetPosition(float &x, float &y, float &z, float &o) const { GetPosition(x, y, z); o = m_orientation; }
87 Position GetPosition() const { return *this; }
88
97
98 bool IsPositionValid() const;
99
100 float GetExactDist2dSq(const float x, const float y) const
101 {
102 float dx = x - m_positionX;
103 float dy = y - m_positionY;
104 return dx*dx + dy*dy;
105 }
106 float GetExactDist2dSq(Position const& pos) const { return GetExactDist2dSq(pos.m_positionX, pos.m_positionY); }
107 float GetExactDist2dSq(Position const* pos) const { return GetExactDist2dSq(*pos); }
108
109 float GetExactDist2d(const float x, const float y) const { return std::sqrt(GetExactDist2dSq(x, y)); }
110 float GetExactDist2d(Position const& pos) const { return GetExactDist2d(pos.m_positionX, pos.m_positionY); }
111 float GetExactDist2d(Position const* pos) const { return GetExactDist2d(*pos); }
112
113 float GetExactDistSq(float x, float y, float z) const
114 {
115 float dz = z - m_positionZ;
116 return GetExactDist2dSq(x, y) + dz*dz;
117 }
118 float GetExactDistSq(Position const& pos) const { return GetExactDistSq(pos.m_positionX, pos.m_positionY, pos.m_positionZ); }
119 float GetExactDistSq(Position const* pos) const { return GetExactDistSq(*pos); }
120
121 float GetExactDist(float x, float y, float z) const { return std::sqrt(GetExactDistSq(x, y, z)); }
122 float GetExactDist(Position const& pos) const { return GetExactDist(pos.m_positionX, pos.m_positionY, pos.m_positionZ); }
123 float GetExactDist(Position const* pos) const { return GetExactDist(*pos); }
124
125 void GetPositionOffsetTo(Position const & endPos, Position & retOffset) const;
126 Position GetPositionWithOffset(Position const& offset) const;
127
128 float GetAbsoluteAngle(float x, float y) const
129 {
130 float dx = x - m_positionX;
131 float dy = y - m_positionY;
132 return NormalizeOrientation(std::atan2(dy, dx));
133 }
134 float GetAbsoluteAngle(Position const& pos) const { return GetAbsoluteAngle(pos.m_positionX, pos.m_positionY); }
135 float GetAbsoluteAngle(Position const* pos) const { return GetAbsoluteAngle(*pos); }
136 float ToAbsoluteAngle(float relAngle) const { return NormalizeOrientation(relAngle + m_orientation); }
137
138 float ToRelativeAngle(float absAngle) const { return NormalizeOrientation(absAngle - m_orientation); }
139 float GetRelativeAngle(float x, float y) const { return ToRelativeAngle(GetAbsoluteAngle(x, y)); }
140 float GetRelativeAngle(Position const& pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); }
141 float GetRelativeAngle(Position const* pos) const { return ToRelativeAngle(GetAbsoluteAngle(pos)); }
142
143 void GetSinCos(float x, float y, float &vsin, float &vcos) const;
144
145 bool IsInDist2d(float x, float y, float dist) const { return GetExactDist2dSq(x, y) < dist * dist; }
146 bool IsInDist2d(Position const* pos, float dist) const { return GetExactDist2dSq(pos) < dist * dist; }
147
148 bool IsInDist(float x, float y, float z, float dist) const { return GetExactDistSq(x, y, z) < dist * dist; }
149 bool IsInDist(Position const& pos, float dist) const { return GetExactDistSq(pos) < dist * dist; }
150 bool IsInDist(Position const* pos, float dist) const { return GetExactDistSq(pos) < dist * dist; }
151
152 bool IsWithinBox(Position const& center, float xradius, float yradius, float zradius) const;
153
154 // dist2d < radius && abs(dz) < height
155 bool IsWithinDoubleVerticalCylinder(Position const* center, float radius, float height) const;
156
157 bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
158 bool HasInLine(Position const* pos, float objSize, float width) const;
159 std::string ToString() const;
160
161 // constrain arbitrary radian orientation to interval [0,2*PI)
162 static float NormalizeOrientation(float o);
163};
164
165#define MAPID_INVALID 0xFFFFFFFF
166
168{
169 public:
170 explicit WorldLocation()
172
173 explicit WorldLocation(uint32 _mapId, float x, float y, float z = 0.0f, float o = 0.0f)
174 : Position(x, y, z, o), m_mapId(_mapId) { }
175
176 WorldLocation(uint32 mapId, Position const& position)
177 : Position(position), m_mapId(mapId) { }
178
179 void WorldRelocate(WorldLocation const& loc) { m_mapId = loc.GetMapId(); Relocate(loc); }
180 void WorldRelocate(WorldLocation const* loc) { m_mapId = loc->GetMapId(); Relocate(loc); }
181 void WorldRelocate(uint32 mapId, Position const& pos) { m_mapId = mapId; Relocate(pos); }
182 void WorldRelocate(uint32 mapId = MAPID_INVALID, float x = 0.f, float y = 0.f, float z = 0.f, float o = 0.f)
183 {
184 m_mapId = mapId;
185 Relocate(x, y, z, o);
186 }
187
189 {
190 return *this;
191 }
192
193 uint32 GetMapId() const { return m_mapId; }
194
196
197 std::string GetDebugInfo() const;
198};
199
207
208template <class Tag>
210{
212 TaggedPosition(float x, float y, float z = 0.0f, float o = 0.0f) : Pos(x, y, z, o) { }
213 TaggedPosition(Position const& pos) : Pos(pos) { }
214
216 {
217 Pos.Relocate(pos);
218 return *this;
219 }
220
221 operator Position() const { return Pos; }
222
223 friend ByteBuffer& operator<<(ByteBuffer& buf, TaggedPosition const& tagged) { return buf << Position::ConstStreamer<Tag>(tagged.Pos); }
224 friend ByteBuffer& operator>>(ByteBuffer& buf, TaggedPosition& tagged) { return buf >> Position::Streamer<Tag>(tagged.Pos); }
225
227};
228
229#endif // Trinity_game_Position_h__
#define TC_GAME_API
Definition Define.h:114
uint32_t uint32
Definition Define.h:133
TC_GAME_API ByteBuffer & operator<<(ByteBuffer &buf, Position::ConstStreamer< Position::XY > const &streamer)
Definition Position.cpp:170
#define MAPID_INVALID
Definition Position.h:165
TC_GAME_API ByteBuffer & operator>>(ByteBuffer &buf, Position::Streamer< Position::XY > const &streamer)
Definition Position.cpp:177
void WorldRelocate(WorldLocation const &loc)
Definition Position.h:179
WorldLocation(uint32 mapId, Position const &position)
Definition Position.h:176
std::string GetDebugInfo() const
Definition Position.cpp:224
uint32 GetMapId() const
Definition Position.h:193
WorldLocation GetWorldLocation() const
Definition Position.h:188
void WorldRelocate(uint32 mapId, Position const &pos)
Definition Position.h:181
WorldLocation(uint32 _mapId, float x, float y, float z=0.0f, float o=0.0f)
Definition Position.h:173
uint32 m_mapId
Definition Position.h:195
void WorldRelocate(WorldLocation const *loc)
Definition Position.h:180
void WorldRelocate(uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
Definition Position.h:182
ConstStreamer(Position const &pos)
Definition Position.h:44
Position const * Pos
Definition Position.h:45
Position * Pos
Definition Position.h:53
Streamer(Position &pos)
Definition Position.h:51
Streamer< XYZO > PositionXYZOStream()
Definition Position.h:93
float GetRelativeAngle(Position const &pos) const
Definition Position.h:140
float m_positionZ
Definition Position.h:58
void Relocate(Position const *pos)
Definition Position.h:70
bool IsInDist(Position const &pos, float dist) const
Definition Position.h:149
float GetExactDist2dSq(const float x, const float y) const
Definition Position.h:100
ConstStreamer< XY > PositionXYStream() const
Definition Position.h:90
Streamer< XY > PositionXYStream()
Definition Position.h:89
float GetExactDist2d(const float x, const float y) const
Definition Position.h:109
float GetRelativeAngle(float x, float y) const
Definition Position.h:139
Position()
Definition Position.h:29
float GetExactDist(float x, float y, float z) const
Definition Position.h:121
float GetExactDist(Position const &pos) const
Definition Position.h:122
void Relocate(float x, float y, float z)
Definition Position.h:67
float ToAbsoluteAngle(float relAngle) const
Definition Position.h:136
float GetExactDist2dSq(Position const &pos) const
Definition Position.h:106
float m_positionX
Definition Position.h:56
float GetPositionZ() const
Definition Position.h:81
float m_positionY
Definition Position.h:57
Position(float x, float y, float z=0.0f, float o=0.0f)
Definition Position.h:32
float GetAbsoluteAngle(Position const &pos) const
Definition Position.h:134
Streamer< PackedXYZ > PositionPackedXYZStream()
Definition Position.h:95
bool IsInDist(Position const *pos, float dist) const
Definition Position.h:150
bool IsInDist2d(float x, float y, float dist) const
Definition Position.h:145
float GetOrientation() const
Definition Position.h:82
float GetExactDist(Position const *pos) const
Definition Position.h:123
float GetExactDist2d(Position const &pos) const
Definition Position.h:110
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:148
void GetPosition(float &x, float &y, float &z) const
Definition Position.h:85
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
Streamer< XYZ > PositionXYZStream()
Definition Position.h:91
float GetExactDist2dSq(Position const *pos) const
Definition Position.h:107
ConstStreamer< XYZ > PositionXYZStream() const
Definition Position.h:92
void GetPosition(float &x, float &y, float &z, float &o) const
Definition Position.h:86
void SetOrientation(float orientation)
Definition Position.h:74
ConstStreamer< PackedXYZ > PositionPackedXYZStream() const
Definition Position.h:96
float GetRelativeAngle(Position const *pos) const
Definition Position.h:141
float GetExactDistSq(Position const *pos) const
Definition Position.h:119
float GetExactDist2d(Position const *pos) const
Definition Position.h:111
ConstStreamer< XYZO > PositionXYZOStream() const
Definition Position.h:94
Position GetPosition() const
Definition Position.h:87
void Relocate(Position const &pos)
Definition Position.h:69
float m_orientation
Definition Position.h:61
bool IsInDist2d(Position const *pos, float dist) const
Definition Position.h:146
float GetAbsoluteAngle(Position const *pos) const
Definition Position.h:135
float GetPositionX() const
Definition Position.h:79
void GetPosition(float &x, float &y) const
Definition Position.h:84
float GetPositionY() const
Definition Position.h:80
float GetExactDistSq(Position const &pos) const
Definition Position.h:118
void Relocate(float x, float y, float z, float o)
Definition Position.h:68
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:113
float ToRelativeAngle(float absAngle) const
Definition Position.h:138
void Relocate(float x, float y)
Definition Position.h:66
TaggedPosition(float x, float y, float z=0.0f, float o=0.0f)
Definition Position.h:212
friend ByteBuffer & operator>>(ByteBuffer &buf, TaggedPosition &tagged)
Definition Position.h:224
friend ByteBuffer & operator<<(ByteBuffer &buf, TaggedPosition const &tagged)
Definition Position.h:223
TaggedPosition & operator=(Position const &pos)
Definition Position.h:215
Position Pos
Definition Position.h:226
TaggedPosition(Position const &pos)
Definition Position.h:213