1 #ifndef geo_Vectors_H__
2 #define geo_Vectors_H__
4 #include "../math/utility.h"
5 #include "../math/Vector.h"
6 #include "../math/Matrix.h"
17 template<
class Scalar>
35 Vector2D(Scalar
const& sx, Scalar
const& sy): x_(sx), y_(sy) {
52 return xy(v.
x(), v.
y());
56 Scalar
const&
x()
const {
71 Scalar
const&
y()
const {
76 Scalar
const&
x(Scalar
const& s) {
82 Scalar
const&
y(Scalar
const& s) {
116 return xy(
x() + v.
x(),
y() + v.
y());
126 return xy(
x() - v.
x(),
y() - v.
y());
136 return xy(
x() * s,
y() * s);
146 return xy(
x() / s,
y() / s);
156 return x() * v.
x() +
y() * v.
y();
161 return x() * v.
y() -
y() * v.
x();
166 return Scalar(sqrt(
double(
length2())));
186 Scalar cs(cos(-
double(theta)));
187 Scalar sn(sin(-
double(theta)));
225 return (n == 0 ?
x() :
y());
254 template<
class Scalar>
274 Scalar
const& sz): x_(sx), y_(sy), z_(sz) {
291 return xyz(v.
x(), v.
y(), v.
z());
295 Scalar
const&
x()
const{
300 Scalar
const&
y()
const{
305 Scalar
const&
z()
const{
325 Scalar
const&
x(Scalar
const& s) {
331 Scalar
const&
y(Scalar
const& s) {
337 Scalar
const&
z(Scalar
const& s) {
343 Vector3D&
xyz(Scalar
const& sx, Scalar
const& sy, Scalar
const& sz) {
367 return xyz(
x() + v.
x(),
y() + v.
y(),
z() + v.
z());
377 return xyz(
x() - v.
x(),
y() - v.
y(),
z() - v.
z());
387 return xyz(
x() * s,
y() * s,
z() * s);
397 return xyz(
x() / s,
y() / s,
z() / s);
407 return x() * v.
x() +
y() * v.
y() +
z() * v.
z();
413 z() * v.
x() -
x() * v.
z(),
414 x() * v.
y() -
y() * v.
x());
424 return Scalar(sqrt(
double(
length2())));
446 Vector3D yy(a.cross(*this).mul(sin(theta)));
447 return a.
mul(a.dot(*
this)).
add(xx).
add(yy);
485 return (n == 0 ?
x() : (n == 1 ?
y() :
z()));
489 return xyz(sx, sy, sz);
510 #endif // geo_Vectors_H__
Matrix< Scalar > matrix(Scalar const &homo) const
return a 3x1 matrix form of itself
Vector3D & normalized()
normalize itself
Vector3D & subed(Vector3D const &v)
Let itself substract v.
Vector3D & operator-=(Vector3D const &v)
Scalar const & z(Scalar const &s)
modify z
Scalar & xGet()
access x with non constant reference
Vector2D & operator+=(Vector2D const &v)
Vector3D(Vector< Scalar > const &v)
constructor (from another Vector)
Scalar const & y(Scalar const &s)
modify y
Scalar & zGet()
access z with non constant reference
Scalar const & x(Scalar const &s)
modify x
Vector3D & crossed(Vector3D const &v)
crossed
Vector2D reflect(Vector2D const &v) const
return reflect from given vector v
Scalar const & x() const
access x
Vector2D(Scalar const &s)
constructor (s, s)
Scalar & xGet()
access x with non constant reference
Scalar const & z() const
access z
Vector2D rotate(Scalar const &theta) const
return rotate theta degree of itself
Vector2D div(Scalar const &s) const
return (*this)/s , where s is a scalar
Matrix< Scalar > matrix(Scalar const &homo) const
return a 3x1 matrix form of itself
Vector2D & muled(Scalar const &s)
Let itself mulitple s.
Vector3D rotate(Vector3D const &axis, double theta) const
return rotate theta degree by axis of itself
Vector2D right() const
return count-clockwise rotate 90 degree of itself
Vector2D negative() const
return -(*this)
Vector2D positive() const
return +(*this)
Vector3D & operator=(Vector3D const &v)
Vector2D & dived(Scalar const &s)
Let itself divide s.
Scalar operator*(Vector2D const &v) const
Vector3D operator-(Vector3D const &v) const
Vector3D & copyFrom(Vector3D const &v)
copy
Scalar & yGet()
access y with non constant reference
Vector3D div(Scalar const &s) const
return (*this)/s , where s is a scalar
Vector3D(Scalar const &s)
constructor (s, s)
Vector3D & xyz(Scalar const &sx, Scalar const &sy, Scalar const &sz)
modify x and y
Vector3D & added(Vector3D const &v)
Let itself add v.
Vector2D operator*(Scalar const &s) const
Vector3D & dived(Scalar const &s)
Let itself divide s.
Vector3D cross(Vector3D const &v) const
cross
Scalar mul(Vector3D const &v) const
same as dot(v)
Scalar operator*(Vector3D const &v) const
Vector2D & operator-=(Vector2D const &v)
Vector2D & operator*=(Scalar const &s)
Scalar mul(Vector2D const &v) const
same as dot(v)
Vector3D mul(Scalar const &s) const
return (*this)*s , where s is a scalar
Scalar const & operator()(size_t n) const
Vector2D operator~() const
Vector2D operator-(Vector2D const &v) const
Scalar const & y() const
access y
Vector2D add(Vector2D const &v) const
return (*this)+v
Scalar const & operator()(size_t n) const
Vector3D sub(Vector3D const &v) const
return (*this)-v
Vector2D & operator()(Scalar const &sx, Scalar const &sy)
Vector3D & operator/=(Scalar const &s)
Matrix< Scalar > matrix() const
return a 3x1 matrix form of itself
Vector2D & xy(Scalar const &sx, Scalar const &sy)
modify x and y
Vector3D(Scalar const &sx, Scalar const &sy, Scalar const &sz)
constructor (sx, sy)
Vector2D mul(Scalar const &s) const
return (*this)*s , where s is a scalar
Vector2D & rotated(Scalar const &theta)
Let itself rotate theta degree.
Vector3D operator/(Scalar const &s) const
Vector2D operator/(Scalar const &s) const
Vector3D negative() const
return -(*this)
Vector3D operator+() const
Vector2D operator+(Vector2D const &v) const
Vector2D(Vector< Scalar > const &v)
constructor (from another Vector)
Scalar dot(Vector3D const &v) const
dot
Vector3D add(Vector3D const &v) const
return (*this)+v
Scalar & yGet()
access y with non constant reference
Vector2D operator+() const
Scalar length2() const
same as dot(*this)
Vector3D()
consturctor (0, 0)
Vector3D operator+(Vector3D const &v) const
Vector2D operator-() const
Scalar cross(Vector2D const &v) const
cross
Vector2D & copyFrom(Vector2D const &v)
copy
Vector2D & operator=(Vector2D const &v)
Vector2D sub(Vector2D const &v) const
return (*this)-v
Vector3D positive() const
return +(*this)
Vector2D & added(Vector2D const &v)
Let itself add v.
Vector3D & operator*=(Scalar const &s)
Vector3D(Vector3D const &v)
consturctor (from another Vector3D)
Scalar length2() const
same as dot(*this)
Scalar const & x() const
access x
Vector2D & subed(Vector2D const &v)
Let itself substract v.
Vector3D & operator+=(Vector3D const &v)
Scalar length() const
sqrt of length2
Vector2D & operator/=(Scalar const &s)
Vector3D normalize() const
return normalize form of itself
Scalar dot(Vector2D const &v) const
dot
Vector2D(Vector2D const &v)
consturctor (from another Vector2D)
Vector3D operator-() const
Vector3D & rotated(Vector3D const &axis, double theta)
Let itself rotate theta degree.
Vector2D()
consturctor (0, 0)
Vector3D & reflected(Vector3D const &v)
reflect itself given vector v
Vector2D & reflected(Vector2D const &v)
reflect itself given vector v
Scalar const & y() const
access y
Vector3D & muled(Scalar const &s)
Let itself mulitple s.
Vector2D & normalized()
normalize itself
Matrix< Scalar > matrix() const
return a 2x1 matrix form of itself
Vector3D operator*(Scalar const &s) const
Vector2D normalize() const
return normalize form of itself
Vector3D & operator()(Scalar const &sx, Scalar const &sy, Scalar const &sz)
Vector2D(Scalar const &sx, Scalar const &sy)
constructor (sx, sy)
Scalar length() const
sqrt of length2
Vector3D reflect(Vector3D const &v) const
return reflect from given vector v
Scalar const & y(Scalar const &s)
modify y
Vector2D(Vector< Scalar > const &v, size_t i)
constructor (from another Vector, i-th)
Vector3D(Vector< Scalar > const &v, size_t i)
constructor (from another Vector, i-th)
Scalar const & x(Scalar const &s)
modify x