paysages3d/src/basics/Vector3.cpp

79 lines
1.7 KiB
C++
Raw Normal View History

2013-11-11 12:56:39 +00:00
#include "Vector3.inline.cpp"
2013-11-09 17:46:34 +00:00
2013-11-11 12:56:39 +00:00
#include <cmath>
2013-11-09 17:46:34 +00:00
#include "PackStream.h"
2013-11-11 12:56:39 +00:00
const Vector3 paysages::basics::VECTOR_ZERO(0.0, 0.0, 0.0);
const Vector3 paysages::basics::VECTOR_DOWN(0.0, -1.0, 0.0);
const Vector3 paysages::basics::VECTOR_UP(0.0, 1.0, 0.0);
const Vector3 paysages::basics::VECTOR_NORTH(0.0, 0.0, -1.0);
const Vector3 paysages::basics::VECTOR_SOUTH(0.0, 0.0, 1.0);
const Vector3 paysages::basics::VECTOR_WEST(-1.0, 0.0, 0.0);
const Vector3 paysages::basics::VECTOR_EAST(1.0, 0.0, 0.0);
Vector3::Vector3(const VectorSpherical &v):
x(v.r * cos(v.phi) * cos(v.theta)), y(v.r * sin(v.theta)), z(-v.r * sin(v.phi) * cos(v.theta))
{
}
void Vector3::save(PackStream* stream) const
{
stream->write(&x);
stream->write(&y);
stream->write(&z);
}
void Vector3::load(PackStream* stream)
{
stream->read(&x);
stream->read(&y);
stream->read(&z);
}
2013-11-09 17:46:34 +00:00
static inline double _euclidGet2DAngle(double x, double y)
{
// TEMP Copy of old euclid.c
double nx, ny, d, ret;
if (x == 0.0)
{
if (y == 0.0)
{
return 0.0;
}
else if (y < 0.0)
{
return 3.0 * M_PI_2;
}
else
{
return M_PI_2;
}
}
d = sqrt(x * x + y * y);
nx = x / d;
ny = y / d;
ret = asin(ny);
if (nx < 0.0)
{
ret = M_PI - ret;
}
return ret < 0.0 ? ret + 2.0 * M_PI : ret;
}
2013-11-11 12:56:39 +00:00
VectorSpherical Vector3::toSpherical() const
2013-11-09 17:46:34 +00:00
{
VectorSpherical result;
2013-11-11 12:56:39 +00:00
result.phi = _euclidGet2DAngle(x, -z);
result.theta = _euclidGet2DAngle(sqrt(x * x + z * z), y);
if (y < 0.0)
2013-11-09 17:46:34 +00:00
{
result.theta -= 2.0 * M_PI;
}
2013-11-11 12:56:39 +00:00
result.r = getNorm();
2013-11-09 17:46:34 +00:00
return result;
}