/* $Id$ * * Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com). * * This file is part of OpenCAMlib * (see https://github.com/aewallin/opencamlib). * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2.1 of the License, or * (at your option) any later version. * * This program 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef POINT_H #define POINT_H #include #include namespace ocl { class Triangle; /// /// \brief a point or vector in 3D space specified by its coordinates (x, y, z) /// class Point { public: /// create a point at (0,0,0) Point(); /// create a point at (x,y,z) Point(double x, double y, double z); /// create a point at (x,y,0) Point(double x, double y); /// create a point at p Point(const Point &p); /// destructor. empty. virtual ~Point() {}; /// dot product double dot(const Point &p) const; /// cross product Point cross(const Point &p) const; /// norm of vector, or distance from (0,0,0) to *this double norm() const; /// scales vector so that norm()==1.0 void normalize(); /// distance from Point to another Point p in the XY plane double xyDistance(const Point &p) const; /// length of vector in the XY plane double xyNorm() const; /// normalize so that length xyNorm == 1.0 void xyNormalize(); /// return perpendicular in the xy plane, rotated 90 degree to the left Point xyPerp() const; /// move *this along z-axis so it lies on p1-p2 line-segment void z_projectOntoEdge(const Point& p1, const Point& p2); /// rotate point in the xy-plane by angle theta /// inputs are cos(theta) and sin(theta) void xyRotate(double cosa, double sina); /// rotate point in xy-plane bu angle theta (radians or degrees??) void xyRotate(double angle); /// rotate around x-axis void xRotate(double theta); /// rotate around y-axis void yRotate(double theta); /// rotate around z-axis void zRotate(double theta); void matrixRotate(double a,double b, double c, double d,double e, double f, double g,double h, double i); /// distance from Point to infinite line through p1 and p2. In the XY plane. double xyDistanceToLine(const Point &p1, const Point &p2) const; /// return closest Point to line through p1 and p2. in 3D. Point closestPoint(const Point &p1, const Point &p2) const; /// return closest Point to line through p1 and p2. Works in the XY plane. Point xyClosestPoint(const Point &p1, const Point &p2) const; /// returns true if point is right of line through p1 and p2 (works in the XY-plane) bool isRight(const Point &p1, const Point &p2) const; /// returns true if Point *this is inside Triangle t bool isInside(const Triangle &t) const; /// return true if Point within line segment p1-p2 bool isInside(const Point& p1, const Point& p2) const; /// return true if the x and y components are both zero. bool xParallel() const; /// return true if vector parallel to y-axis bool yParallel() const; /// return true if vector parallel to z-axis bool zParallel() const; /// assignment Point &operator=(const Point &p); /// addition Point &operator+=(const Point &p); /// subtraction Point &operator-=(const Point &p); /// addition const Point operator+(const Point &p)const; /// subtraction const Point operator-(const Point &p) const; /// scalar multiplication Point &operator*=(const double &a); // scalar multiplication with Point *= scalar /// Point * scalar const Point operator*(const double &a)const; // Point*scalar /// equality bool operator==(const Point &p) const; /// inequality bool operator!=(const Point &p) const; /// string repr friend std::ostream& operator<<(std::ostream &stream, const Point &p); /// string repr std::string str() const; /// X coordinate double x; /// Y coordinate double y; /// Z coordinate double z; }; /// scalar multiplication scalar*Point const Point operator*(const double &a, const Point &p); } // end namespace #endif // end file point.h