123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /* libsegl - Sebas Extended GL Library
- * Collection of Opengl/3D-Math helpers
- *
- * Copyright (c) 2008 by Sebastian Lohff, seba@seba-geek.de
- * http://www.seba-geek.de
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
- #include "punkt3d.h"
-
- namespace segl {
-
- Punkt3D::Punkt3D() {
- x = y = z = 0.0f;
- }
-
- Punkt3D::Punkt3D(float _x, float _y, float _z) {
- set(_x, _y, _z);
- }
-
- void Punkt3D::set(float _x, float _y, float _z) {
- x = _x;
- y = _y;
- z = _z;
- }
-
- float Punkt3D::abs() const {
- return sqrt(x*x+y*y+z*z);
- }
-
- Punkt3D Punkt3D::kreuzprodukt(const Punkt3D &b) const {
- Punkt3D erg;
- erg.x = y*b.z - z*b.y;
- erg.y = z*b.x - x*b.z;
- erg.z = x*b.y - y*b.x;
-
- return erg;
- }
-
- void Punkt3D::normalize() {
- float a = abs();
- x /= a;
- y /= a;
- z /= a;
- }
-
- Punkt3D Punkt3D::getNormalized() const {
- Punkt3D ret(*this);
- ret.normalize();
- return ret;
- }
-
- bool Punkt3D::isNormalized() const {
- return (abs()==1.0f);
- }
-
- float Punkt3D::calcAngle(Punkt3D b) const {
- if(abs()*b.abs()==0.0f)
- return 0.0f;
- return rad2deg(std::acos(((*this)*b)/(abs()*b.abs())));
- }
-
- Punkt3D Punkt3D::getOrtographic() const {
- Punkt3D erg;
- if(!x) {
- erg.x = 0.0f;
- erg.y = z;
- erg.z = -y;
- } else if(!y) {
- erg.x = z;
- erg.y = 0;
- erg.z = -x;
- } else {
- // z, oder genereller fall
- erg.x = y;
- erg.y = -x;
- erg.z = 0.0f;
- }
- return erg;
- }
-
- Punkt3D Punkt3D::getOrtographic2() const {
- Punkt3D nullvec;
- Punkt3D erg;
- erg.set(y, -x, 0.0f);
- if(erg!=nullvec)
- return erg;
- erg.set(z, 0.0f, -x);
- if(erg!=nullvec)
- return erg;
- erg.set(0.0f, z, -y);
- return erg;
- }
-
- void Punkt3D::print(std::string coordname) const {
- if(coordname!="")
- coordname.append(" ");
- std::cout << coordname << "Coord: (" << x << ", " << y << ", " << z << ")" << std::endl;
- }
-
- Punkt3D Punkt3D::operator+(const Punkt3D &b) const {
- Punkt3D c;
- c.x = x + b.x;
- c.y = y + b.y;
- c.z = z + b.z;
-
- return c;
- }
-
- Punkt3D Punkt3D::operator-(const Punkt3D &b) const {
- Punkt3D c;
- c.x = x - b.x;
- c.y = y - b.y;
- c.z = z - b.z;
-
- return c;
- }
-
- Punkt3D& Punkt3D::operator+=(const Punkt3D &b) {
- x += b.x;
- y += b.y;
- z += b.z;
-
- return *this;
- }
-
- Punkt3D& Punkt3D::operator-=(const Punkt3D &b) {
- x -= b.x;
- y -= b.y;
- z -= b.z;
-
- return *this;
- }
-
- Punkt3D Punkt3D::operator+(const float &_m) const {
- return Punkt3D(x+_m, y+_m, z+_m);
- }
-
- Punkt3D Punkt3D::operator-(const float &_m) const {
- return Punkt3D(x-_m, y-_m, z-_m);
- }
-
- Punkt3D Punkt3D::operator*(const float &_m) const {
- return Punkt3D(x*_m, y*_m, z*_m);
- }
-
- Punkt3D Punkt3D::operator/(const float &_m) const {
- return Punkt3D(x/_m, y/_m, z/_m);
- }
-
- Punkt3D& Punkt3D::operator+=(const float &_m) {
- x += _m;
- y += _m;
- z += _m;
- return *this;
- }
- Punkt3D& Punkt3D::operator-=(const float &_m) {
- x -= _m;
- y -= _m;
- z -= _m;
- return *this;
- }
- Punkt3D& Punkt3D::operator*=(const float &_m) {
- x *= _m;
- y *= _m;
- z *= _m;
- return *this;
- }
- Punkt3D& Punkt3D::operator/=(const float &_m) {
- x /= _m;
- y /= _m;
- z /= _m;
- return *this;
- }
-
- float Punkt3D::operator*(const Punkt3D& _m) const {
- return x * _m.x + y * _m.y + z * _m.z;
- }
-
- Punkt3D Punkt3D::operator-() const {
- return Punkt3D(-x, -y, -z);
- }
-
- bool Punkt3D::operator==(const Punkt3D& b) const {
- return ( x==b.x && y==b.y && z==b.z);
- }
- bool Punkt3D::operator!=(const Punkt3D& b) const {
- return !(*this==b);
- }
-
- // Freunde
-
- segl::Punkt3D operator+(const float& _m, const segl::Punkt3D& b) {
- return segl::Punkt3D(b.x+_m, b.y+_m, b.z+_m);
- }
-
- segl::Punkt3D operator-(const float& _m, const segl::Punkt3D& b) {
- return segl::Punkt3D(b.x-_m, b.y-_m, b.z-_m);
- }
-
- segl::Punkt3D operator*(const float& _m, const segl::Punkt3D& b) {
- return segl::Punkt3D(b.x*_m, b.y*_m, b.z*_m);
- }
-
- segl::Punkt3D operator/(const float& _m, const segl::Punkt3D& b) {
- return segl::Punkt3D(b.x/_m, b.y/_m, b.z/_m);
- }
-
- std::ostream &operator<<(std::ostream &ostr, const segl::Punkt3D &r) {
- return ostr << "(" << r.x << ", " << r.y << ", " << r.z << ")";
- }
-
- } // namespace segl
-
- float abs(const segl::Punkt3D &p) {
- return p.abs();
- }
-
- // OpenGL Funktionen f�r Punkt3D
-
- void glVertex3f(const segl::Punkt3D &p) {
- glVertex3f(p.x, p.y, p.z);
- }
-
- void glTranslatef(const segl::Punkt3D &p) {
- glTranslatef(p.x, p.y, p.z);
- }
-
- void glNormal3f(const segl::Punkt3D &p) {
- glNormal3f(p.x, p.y, p.z);
- }
-
- void glRotatef(const float °, const segl::Punkt3D &vec) {
- glRotatef(deg, vec.x, vec.y, vec.z);
- }
-
- // Funktionen mit richtgen bezeichnern
- void glVertexP3D(const segl::Punkt3D &p) {
- glVertex3f(p.x, p.y, p.z);
- }
-
- void glTranslateP3D(const segl::Punkt3D &p) {
- glTranslatef(p.x, p.y, p.z);
- }
-
- void glNormalP3D(const segl::Punkt3D &p) {
- glNormal3f(p.x, p.y, p.z);
- }
-
- void glRotateP3D(const float °, const segl::Punkt3D &vec) {
- glRotatef(deg, vec.x, vec.y, vec.z);
- }
-
- void gluLookAt(const segl::Punkt3D &pos, const segl::Punkt3D &viewport, const segl::Punkt3D &normal) {
- gluLookAt( pos.x, pos.y, pos.z,
- viewport.x, viewport.y, viewport.z,
- normal.x, normal.y, normal.z );
- }
|