2012-11-05 18:34:31 -08:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
#ifndef ThreeDPoint_h_
|
|
|
|
#define ThreeDPoint_h_
|
|
|
|
|
2013-03-21 09:45:53 -07:00
|
|
|
#include <cmath>
|
2013-09-04 02:20:58 -07:00
|
|
|
#include <algorithm>
|
2013-03-21 09:45:53 -07:00
|
|
|
|
2012-11-05 18:34:31 -08:00
|
|
|
namespace mozilla {
|
|
|
|
|
|
|
|
namespace dom {
|
|
|
|
|
|
|
|
struct ThreeDPoint {
|
|
|
|
ThreeDPoint()
|
2013-03-11 16:09:27 -07:00
|
|
|
: x(0.)
|
|
|
|
, y(0.)
|
|
|
|
, z(0.)
|
2012-11-05 18:34:31 -08:00
|
|
|
{
|
|
|
|
}
|
2013-03-11 16:09:27 -07:00
|
|
|
ThreeDPoint(double aX, double aY, double aZ)
|
2012-11-05 18:34:31 -08:00
|
|
|
: x(aX)
|
|
|
|
, y(aY)
|
|
|
|
, z(aZ)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-03-21 09:45:53 -07:00
|
|
|
double Magnitude() const
|
|
|
|
{
|
|
|
|
return sqrt(x * x + y * y + z * z);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Normalize()
|
|
|
|
{
|
2013-09-04 02:20:58 -07:00
|
|
|
// Normalize with the maximum norm first to avoid overflow and underflow.
|
|
|
|
double invMax = 1 / MaxNorm();
|
|
|
|
x *= invMax;
|
|
|
|
y *= invMax;
|
|
|
|
z *= invMax;
|
|
|
|
|
2013-03-21 09:45:53 -07:00
|
|
|
double invDistance = 1 / Magnitude();
|
|
|
|
x *= invDistance;
|
|
|
|
y *= invDistance;
|
|
|
|
z *= invDistance;
|
|
|
|
}
|
|
|
|
|
|
|
|
ThreeDPoint CrossProduct(const ThreeDPoint& rhs) const
|
|
|
|
{
|
|
|
|
return ThreeDPoint(y * rhs.z - z * rhs.y,
|
|
|
|
z * rhs.x - x * rhs.z,
|
|
|
|
x * rhs.y - y * rhs.x);
|
|
|
|
}
|
|
|
|
|
|
|
|
double DotProduct(const ThreeDPoint& rhs)
|
|
|
|
{
|
|
|
|
return x * rhs.x + y * rhs.y + z * rhs.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
double Distance(const ThreeDPoint& rhs)
|
|
|
|
{
|
|
|
|
return sqrt(hypot(rhs.x, x) + hypot(rhs.y, y) + hypot(rhs.z, z));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool IsZero() const
|
|
|
|
{
|
|
|
|
return x == 0 && y == 0 && z == 0;
|
|
|
|
}
|
2013-03-11 16:09:27 -07:00
|
|
|
double x, y, z;
|
2013-09-04 02:20:58 -07:00
|
|
|
|
|
|
|
private:
|
|
|
|
double MaxNorm() const
|
|
|
|
{
|
|
|
|
return std::max(fabs(x), std::max(fabs(y), fabs(z)));
|
|
|
|
}
|
2012-11-05 18:34:31 -08:00
|
|
|
};
|
|
|
|
|
2013-03-21 09:45:53 -07:00
|
|
|
ThreeDPoint operator-(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
|
|
|
|
ThreeDPoint operator*(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
|
|
|
|
ThreeDPoint operator*(const ThreeDPoint& lhs, const double rhs);
|
|
|
|
bool operator==(const ThreeDPoint& lhs, const ThreeDPoint& rhs);
|
|
|
|
|
2012-11-05 18:34:31 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|