18#ifndef Trinity_game_Position_h__
19#define Trinity_game_Position_h__
30 : m_positionX(0.0f), m_positionY(0.0f), m_positionZ(0.0f), m_orientation(0.0f) { }
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)) { }
64 bool operator==(
Position const& a)
const;
66 void Relocate(
float x,
float y) { m_positionX = x; m_positionY = y; }
68 void Relocate(
float x,
float y,
float z,
float o) {
Relocate(x, y, z); SetOrientation(o); }
72 void RelocateOffset(
Position const& offset);
76 m_orientation = NormalizeOrientation(orientation);
84 void GetPosition(
float &x,
float &y)
const { x = m_positionX; y = m_positionY; }
98 bool IsPositionValid()
const;
102 float dx = x - m_positionX;
103 float dy = y - m_positionY;
104 return dx*dx + dy*dy;
109 float GetExactDist2d(
const float x,
const float y)
const {
return std::sqrt(GetExactDist2dSq(x, y)); }
115 float dz = z - m_positionZ;
116 return GetExactDist2dSq(x, y) + dz*dz;
121 float GetExactDist(
float x,
float y,
float z)
const {
return std::sqrt(GetExactDistSq(x, y, z)); }
125 void GetPositionOffsetTo(
Position const & endPos,
Position & retOffset)
const;
130 float dx = x - m_positionX;
131 float dy = y - m_positionY;
132 return NormalizeOrientation(std::atan2(dy, dx));
136 float ToAbsoluteAngle(
float relAngle)
const {
return NormalizeOrientation(relAngle + m_orientation); }
138 float ToRelativeAngle(
float absAngle)
const {
return NormalizeOrientation(absAngle - m_orientation); }
139 float GetRelativeAngle(
float x,
float y)
const {
return ToRelativeAngle(GetAbsoluteAngle(x, y)); }
143 void GetSinCos(
float x,
float y,
float &vsin,
float &vcos)
const;
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; }
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; }
152 bool IsWithinBox(
Position const& center,
float xradius,
float yradius,
float zradius)
const;
155 bool IsWithinDoubleVerticalCylinder(
Position const* center,
float radius,
float height)
const;
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;
162 static float NormalizeOrientation(
float o);
165#define MAPID_INVALID 0xFFFFFFFF
TC_GAME_API ByteBuffer & operator<<(ByteBuffer &buf, Position::ConstStreamer< Position::XY > const &streamer)
TC_GAME_API ByteBuffer & operator>>(ByteBuffer &buf, Position::Streamer< Position::XY > const &streamer)
void WorldRelocate(WorldLocation const &loc)
WorldLocation(uint32 mapId, Position const &position)
std::string GetDebugInfo() const
WorldLocation GetWorldLocation() const
void WorldRelocate(uint32 mapId, Position const &pos)
WorldLocation(uint32 _mapId, float x, float y, float z=0.0f, float o=0.0f)
void WorldRelocate(WorldLocation const *loc)
void WorldRelocate(uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
ConstStreamer(Position const &pos)
Streamer< XYZO > PositionXYZOStream()
float GetRelativeAngle(Position const &pos) const
void Relocate(Position const *pos)
bool IsInDist(Position const &pos, float dist) const
float GetExactDist2dSq(const float x, const float y) const
ConstStreamer< XY > PositionXYStream() const
Streamer< XY > PositionXYStream()
float GetExactDist2d(const float x, const float y) const
float GetRelativeAngle(float x, float y) const
float GetExactDist(float x, float y, float z) const
float GetExactDist(Position const &pos) const
void Relocate(float x, float y, float z)
float ToAbsoluteAngle(float relAngle) const
float GetExactDist2dSq(Position const &pos) const
float GetPositionZ() const
Position(float x, float y, float z=0.0f, float o=0.0f)
float GetAbsoluteAngle(Position const &pos) const
Streamer< PackedXYZ > PositionPackedXYZStream()
bool IsInDist(Position const *pos, float dist) const
bool IsInDist2d(float x, float y, float dist) const
float GetOrientation() const
float GetExactDist(Position const *pos) const
float GetExactDist2d(Position const &pos) const
bool IsInDist(float x, float y, float z, float dist) const
void GetPosition(float &x, float &y, float &z) const
float GetAbsoluteAngle(float x, float y) const
Streamer< XYZ > PositionXYZStream()
float GetExactDist2dSq(Position const *pos) const
ConstStreamer< XYZ > PositionXYZStream() const
void GetPosition(float &x, float &y, float &z, float &o) const
void SetOrientation(float orientation)
ConstStreamer< PackedXYZ > PositionPackedXYZStream() const
float GetRelativeAngle(Position const *pos) const
float GetExactDistSq(Position const *pos) const
float GetExactDist2d(Position const *pos) const
ConstStreamer< XYZO > PositionXYZOStream() const
Position GetPosition() const
void Relocate(Position const &pos)
bool IsInDist2d(Position const *pos, float dist) const
float GetAbsoluteAngle(Position const *pos) const
float GetPositionX() const
void GetPosition(float &x, float &y) const
float GetPositionY() const
float GetExactDistSq(Position const &pos) const
void Relocate(float x, float y, float z, float o)
float GetExactDistSq(float x, float y, float z) const
float ToRelativeAngle(float absAngle) const
void Relocate(float x, float y)
TaggedPosition(float x, float y, float z=0.0f, float o=0.0f)
friend ByteBuffer & operator>>(ByteBuffer &buf, TaggedPosition &tagged)
friend ByteBuffer & operator<<(ByteBuffer &buf, TaggedPosition const &tagged)
TaggedPosition & operator=(Position const &pos)
TaggedPosition(Position const &pos)