00001 #ifndef PLANE_HPP 00002 #define PLANE_HPP 00003 00004 #include <TRTK/Coordinate.hpp> 00005 #include <math.h> 00006 #include <Line3D.hpp> 00007 #include <Eigen/Dense> 00008 #include <Eigen/Core> 00009 using namespace Eigen; 00010 00011 namespace TRTK 00012 { 00013 template <class T> 00014 class Plane 00015 { 00016 public: 00017 typedef T value_type; 00018 00019 Plane<T>(const Plane<T>&); 00020 Plane<T>(const Coordinate<T>&, const Coordinate<T>&, const Coordinate<T>&); 00021 Plane<T>(const Line3D<T>&, const Line3D<T>&); 00022 Plane<T>(const Coordinate<T>&, const Coordinate<T>&); 00023 Plane<T>(const Line3D<T>&, const Coordinate<T>&); 00024 00025 Coordinate<T> pointOnPlane; 00026 Coordinate<T> normalVector; 00027 00028 Coordinate<T> getPoint() const; 00029 Coordinate<T> getNormalVector() const; 00030 00031 void setPointOnPlane(const Coordinate<T> point) const; 00032 void setNormalVector(const Coordinate<T> vector) const; 00033 // void set(const Coordinate<T> point, const Coordinate<T> vector) const; 00034 bool isParallel(const Plane<T>&) const; 00035 bool isIntersecting(const Plane<T>&); 00036 00037 00038 double getDistancePoint(const Coordinate<T>&) const; 00039 double getDistansePlane(const Plane<T>&) const; 00040 00041 00042 Line3D<T> getIntersectingLine(const Plane<T>&) const; 00043 double getAngleBetweenPlanes(const Plane<T>&) const; 00044 double getAngleBetweenPlaneAndLine(const Line3D<T>&) const; 00045 Coordinate<T> intersectionLineAndPlane(const Line3D<T>&) const; 00046 //void Ausgleichsebene(const Coordinate<T>&, const Coordinate<T>&); ///< 00047 }; 00048 00049 00055 template <class T> //Three points 00056 Plane<T>::Plane(const Plane<T>& plane) 00057 { 00058 this->pointOnPlane = plane.pointOnPlane; 00059 this->normalVector = plane.normalVector; 00060 00061 } 00062 00069 template <class T> //Three points 00070 Plane<T>::Plane(const Coordinate<T>& pointA, const Coordinate<T>& pointB, const Coordinate<T>& pointC) 00071 { 00072 this->pointOnPlane = pointA; //Ortsvektor 00073 Coordinate<T> ab = pointA - pointB; // Richtungsvektor1 00074 Coordinate<T> bc = pointB - pointC; // Richtungsvektor2 00075 Coordinate<T> normalVector = ab.cross(bc); 00076 this->normalVector = normalVector; 00077 00078 } 00079 00085 template <class T> //Two Lines 00086 Plane<T>::Plane(const Line3D<T>& line1, const Line3D<T>& line2) 00087 { 00088 //Gegeben sind zwei Geraden, die nicht windschief sind, sondern sich schneiden oder parrallel zu einander sind 00089 if (line1.isParallel(line2) || line1.isIntersecting(line2)){ 00090 // Man wählt sich den Schnittpunkt der beiden Geraden als Stützvektor 00091 //und fügt beide Richtungsvektoren der Gleichungen als Spannvektoren hinzu und erhällt die Paramerterform der Ebene. 00092 this->pointOnPlane = line1.point; 00093 this->normalVector = line1.direction.cross(line2.direction); 00094 } 00095 else{ 00096 //Geraden sind windschief 00097 std::stringstream os; 00098 os << "***\nFunction: " << __FUNCTION__ << " failed in File: " << __FILE__ << " Line: " << __LINE__ << "Lines are croocked 0\n"; 00099 ErrorObj error; 00100 error.setClassName("Line3D"); 00101 error.setFunctionName(__FUNCTION__); 00102 error.setErrorMessage(os.str()); 00103 throw error; 00104 } 00105 } 00106 00112 template <class T> //Point and normalvector 00113 Plane<T>::Plane(const Coordinate<T>& point, const Coordinate<T>& normalvector) 00114 { 00115 pointOnPlane = point; //Ortsvektor 00116 normalVector = normalvector; 00117 } 00118 00124 template <class T>// One line and one point 00125 Plane<T>::Plane(const Line3D<T>& line, const Coordinate<T>& pointA) 00126 { 00127 // //Aus einem Punkt und einer Gerade lassen sich schnell drei Punkte erstellen.Ein Punkt ist uns schon durch A gegeben. Die anderen beiden wählen wir uns aus der Gerade. 00128 this->pointOnPlane = pointA; //Ortsvektor 00129 Coordinate<T> pointB = line.point + 1 * line.direction; 00130 Coordinate<T> pointC = line.point + 2 * line.direction; 00131 00132 Coordinate<T> AB = pointA - pointB; // Richtungsvektor1 00133 Coordinate<T> BC = pointB - pointC; // Richtungsvektor2 00134 00135 Coordinate<T> normalVector = AB.cross(BC); 00136 this->normalVector = normalVector; 00137 00138 } 00139 00140 00147 template <class T> 00148 double Plane<T>::getDistancePoint(const Coordinate<T>& point) const{ 00149 // lege eine Gerade durch den Punkt und suche den Durchstoeungspunkt 00150 Line3D<T> line2(point, normalVector.normalized()); 00151 Coordinate<T> vHelpPoint = intersectionLineAndPlane(line2); 00152 // bilde Differenz von vHelpPoint und vPoint 00153 Coordinate<T> vDiff = vHelpPoint - point; 00154 // bilde den Betrag und damit die Entfernung 00155 double dist = vDiff.norm(); 00156 return dist; 00157 } 00158 00165 template <class T> 00166 double Plane<T>::getDistansePlane(const Plane<T>& plane2) const{ 00167 //Hesse-Normalform bestimmen: 00168 Coordinate<T> m_result1 = pointOnPlane*normalVector; 00169 double result = (m_result1.x() + m_result1.y() + m_result1.z()) * (-1); 00170 double normalVector1 = std::sqrt(normalVector.norm()); 00171 double normalVector2 = std::sqrt(plane2.normalVector.norm()); 00172 Coordinate<T> m_point2(0, 0, result / normalVector.z()); 00173 //Punkt in Hesse-Normalform einsetzen: 00174 double dist = normalVector.x()*m_point2.x() - normalVector.y()*m_point2.x() - normalVector.z()*m_point2.z() - result; 00175 return dist; 00176 } 00177 00184 template <class T> 00185 bool Plane<T>::isIntersecting(const Plane<T>& plane2) { 00186 if (getDistansePlane(plane2) == 0){ 00187 return true; 00188 } 00189 else { 00190 return false; 00191 } 00192 } 00193 00200 template <class T> 00201 bool Plane<T>::isParallel(const Plane<T>& plane2) const{ 00202 double r1 = normalVector.x() / plane2.normalVector.x(); 00203 double r2 = normalVector.y() / plane2.normalVector.y(); 00204 double r3 = normalVector.z() / plane2.normalVector.z(); 00205 if (r1 == r2 && r2 == r3){ 00206 return true; 00207 } 00208 else{ 00209 return false; 00210 } 00211 } 00212 00219 template <class T> 00220 Line3D<T> Plane<T>::getIntersectingLine(const Plane<T>& plane2) const{ 00221 // Wir haben zwei Ebenen in Paramatherform 00222 00223 //Der Richtungsvektor der Geraden berechnet sich dann durch: 00224 Coordinate<T> norm_line = plane2.normalVector.cross(normalVector); 00225 //Wir benötigen jetzt noch den Stützvektor. 00226 //Dazu formen wir, wie oben erwähnt, die Ebenendarstellungen von der Normalenform in die allgemeine Ebenenform 00227 00228 00229 00230 double result1 = (m_result1.x() + m_result1.y() + m_result1.z()); 00231 Coordinate<T> m_result2 = plane2.pointOnPlane*plane2.normalVector; 00232 double result2 = (m_result2.x() + m_result2.y() + m_result2.z()); 00233 00234 //Ein Richtungsvektor ergibt sich daher aus dem Vektorprodukt der beiden Normalenvektoren. 00235 Coordinate<T> normalSchnitt = normalVector.cross(plane2.normalVector); 00236 double normalVector1 = normalVector.norm(); 00237 double normalVector2 = plane2.normalVector.norm(); 00239 return normalSchnitt; 00240 } 00241 00242 00249 template <class T> 00250 double Plane<T>::getAngleBetweenPlanes(const Plane<T>& plane2) const{ 00251 Coordinate<T> sum = plane2.normalVector * normalVector; 00252 double CoordinSumme = sum.x() + sum.y() + sum.z(); 00253 double ret = CoordinSumme / (normalVector.norm() *plane2.normalVector.norm()); 00254 return (ret); 00255 } 00262 template <class T>double Plane<T>::getAngleBetweenPlaneAndLine(const Line3D<T>& line2)const{ 00263 Coordinate<T> sum = line2.direction * normalVector; 00264 double CoordinSumme = sum.x() + sum.y() + sum.z(); 00265 double ret = CoordinSumme / (normalVector.norm() *line2.direction.norm()); 00266 return ret; 00267 } 00274 template <class T> 00275 Coordinate<T> Plane<T>::intersectionLineAndPlane(const Line3D<T> & line2) const{ 00276 // gucken, dass Line nicht parallel zu Ebene liegt 00277 if (line2.direction.dot(normalVector) != 0){ 00278 double dLambda = pointOnPlane.dot(normalVector) - line2.point.dot(line2.direction) / (normalVector.dot(line2.direction)); 00279 Coordinate<double> vIntersection = (pointOnPlane + dLambda * normalVector); 00280 return vIntersection; 00281 } 00282 else{ 00283 std::stringstream os; 00284 os << "***\nFunction: " << __FUNCTION__ << " failed in File: " << __FILE__ << " Line: " << __LINE__ << "Line and Plane are parallel 0\n"; 00285 ErrorObj error; 00286 error.setClassName("Line3D"); 00287 error.setFunctionName(__FUNCTION__); 00288 error.setErrorMessage(os.str()); 00289 throw error; 00290 } 00291 } 00292 00294 template <class T> 00295 Coordinate<T> Plane<T>::getPoint() const{ 00296 return pointOnPlane; 00297 } 00298 00300 template <class T> 00301 Coordinate<T> Plane<T>::getNormalVector() const{ 00302 return normalVector; 00303 } 00304 template <class T> 00305 void Plane<T>::setPointOnPlane(const Coordinate<T> point) const{ 00306 pointOnPlane = point; 00307 } 00308 template <class T> 00309 void Plane<T>::setNormalVector(const Coordinate<T> vector) const{ 00310 normalVector = vector; 00311 } 00312 00313 //template <class T> 00314 //void Plane<T>::set(const Coordinate<T> point, const Coordinate<T> vector) const{ 00315 // normalVector = vector; 00316 // pointOnPlane = point; 00317 //} 00318 } //End of the namespace TRTK 00319 00320 #endif 00321
Documentation generated by Doxygen