This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/geo/Point3.h
2018-10-25 11:50:12 +02:00

146 lines
3.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* © Copyright 2014 Urheberrechtshinweis
* Alle Rechte vorbehalten / All Rights Reserved
*
* Programmcode ist urheberrechtlich geschuetzt.
* Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner.
* Keine Verwendung ohne explizite Genehmigung.
* (vgl. § 106 ff UrhG / § 97 UrhG)
*/
#ifndef GEO_Point3_H
#define GEO_Point3_H
#include "../Assertions.h"
#include <cmath>
#include "Point2.h"
/**
* 3D Point
*/
template <typename Scalar> struct _Point3 {
Scalar x;
Scalar y;
Scalar z;
/** ctor */
_Point3() : x(0), y(0), z(0) {;}
/** ctor */
_Point3(const Scalar x, const Scalar y, const Scalar z) : x(x), y(y), z(z) {;}
_Point3 operator - () const {return _Point3(-x, -y, -z);}
_Point3 operator + (const _Point3& o) const {return _Point3(x+o.x, y+o.y, z+o.z);}
_Point3 operator - (const _Point3& o) const {return _Point3(x-o.x, y-o.y, z-o.z);}
_Point3 operator * (const _Point3& o) const {return _Point3(x*o.x, y*o.y, z*o.z);}
_Point3 operator * (const Scalar v) const {return _Point3(v*x, v*y, v*z);}
_Point3 operator / (const Scalar v) const {return _Point3(x/v, y/v, z/v);}
_Point3& operator *= (const Scalar v) {x*=v; y*=v; z*=v; return *this;}
_Point3& operator /= (const Scalar v) {x/=v; y/=v; z/=v; return *this;}
_Point3& operator += (const _Point3& o) {x+=o.x; y+=o.y; z+=o.z; return *this;}
_Point3& operator -= (const _Point3& o) {x-=o.x; y-=o.y; z-=o.z; return *this;}
_Point3& operator *= (const _Point3& o) {x*=o.x; y*=o.y; z*=o.z; return *this;}
_Point3& operator /= (const _Point3& o) {x/=o.x; y/=o.y; z/=o.z; return *this;}
bool operator < (const _Point3& o) const {return x<o.x && y<o.y && z<o.z;}
bool operator == (const _Point3& o) const {return x==o.x && y==o.y && z==o.z;}
bool operator != (const _Point3& o) const {return x!=o.x || y!=o.y || z!=o.z;}
bool eq (const _Point3& o, const Scalar delta) const { return eq(x,o.x,delta) && eq(y,o.y,delta) && eq(z,o.z,delta); }
Point2 xy() const {return Point2(x,y);}
Point2 xz() const {return Point2(x,z);}
_Point3 rotX(const Scalar r) const {
return _Point3(x, y*cos(r) - z*sin(r), y*sin(r) + z*cos(r));
}
_Point3 rotY(const Scalar r) const {
return _Point3(z*sin(r) + x*cos(r), y, z*cos(r) - x*sin(r));
}
_Point3 rotZ(const Scalar r) const {
return _Point3(x*cos(r) - y*sin(r), x*sin(r) + y*cos(r), z);
}
_Point3 rot(const Scalar rx, const Scalar ry, const Scalar rz) const {
return rotX(rx).rotY(ry).rotZ(rz);
//return rotZ(rz).rotY(ry).rotX(rx);
}
/** read-only array access */
Scalar operator [] (const int idx) const {
Assert::isBetween(idx, 0, 2, "index out of bounds");
if (0 == idx) {return x;}
if (1 == idx) {return y;}
return z;
}
/** get the distance between this point and the other one */
Scalar getDistance(const _Point3& o) const {
const Scalar dx = x - o.x;
const Scalar dy = y - o.y;
const Scalar dz = z - o.z;
return std::sqrt(dx*dx + dy*dy + dz*dz);
}
/** get a normalized copy */
_Point3 normalized() const {return *this / this->length();}
Scalar length() const {return std::sqrt(x*x + y*y + z*z);}
Scalar length(const Scalar norm) const {
return std::pow(
(std::pow(std::abs(x),norm) +
std::pow(std::abs(y),norm) +
std::pow(std::abs(z),norm)
), 1.0f/norm);
}
std::string asString() const {
return "(" + std::to_string(x) + ", " + std::to_string(y) + ", " + std::to_string(z) + ")";
}
private:
static inline bool eq(const Scalar a, const Scalar b, const Scalar delta) {return std::abs(a-b) <= delta;}
static inline bool ne(const Scalar a, const Scalar b, const Scalar delta) {return std::abs(a-b) > delta;}
};
//using Point3 = _Point3<double>;
using Point3 = _Point3<float>;
inline double dot(const Point3 p1, const Point3 p2) {
return (p1.x*p2.x) + (p1.y*p2.y) + (p1.z*p2.z);
}
inline Point3 cross(const Point3 a, const Point3 b) {
return Point3(
a.y*b.z - a.z*b.y,
a.z*b.x - a.x*b.z,
a.x*b.y - a.y*b.x
);
}
#endif // GEO__Point3_H