kick
/Users/morten/Programmering/cpp/kick/src/kick/math/plane.cpp
00001 //
00002 // Created by Morten Nobel-Jørgensen on 01/08/14.
00003 //
00004 
00005 #include "plane.h"
00006 #include "ray.h"
00007 
00008 namespace kick {
00009 
00010     Plane::Plane() : plane{1,0,0,0} {
00011     }
00012 
00013     Plane::Plane(glm::vec3 normal_, glm::vec3 pointInPlane)
00014     :plane(normal_, -dot(normal_, pointInPlane))
00015     {
00016     }
00017 
00018     Plane::Plane(float x, float y, float z, float offset) : plane{x,y,z, offset} {
00019     }
00020 
00021     Plane::Plane(glm::vec3 normal_, float offset)
00022             : plane{normal_, offset} {
00023     }
00024 
00025 
00026     glm::vec3 Plane::normal() const {
00027         return (glm::vec3)plane;
00028     }
00029 
00030     void Plane::setNormal(glm::vec3 p) {
00031         for (int i=0;i<3;i++){
00032             plane[i] = p[i];
00033         }
00034     }
00035 
00036     float Plane::offset() const {
00037         return plane.w;
00038     }
00039 
00040     void Plane::setOffset(float d) {
00041         plane.w = d;
00042     }
00043 
00044     glm::vec3 Plane::pointOnPlane() const {
00045         return normal() * -offset();
00046     }
00047 
00048     float Plane::distanceToPlane(glm::vec3 point) const {
00049         return glm::dot(normal(), point) + offset();
00050     }
00051 
00052     float Plane::intersection(const Ray& line) const {
00053         using namespace std;
00054         glm::vec3 v0 = pointOnPlane();
00055         glm::vec3 n = glm::normalize(normal());
00056         glm::vec3 u = glm::normalize(line.point(1) - line.origin());
00057         const double epsilon = 1e-10;
00058         double uDotN = glm::dot(u, n);
00059         if (abs(uDotN) < epsilon){
00060             return NAN;
00061         }
00062 
00063         return glm::dot(n, (v0- line.origin())) / uDotN;
00064     }
00065 
00066     glm::vec3 Plane::intersectionPoint(const Ray& line) const {
00067         float res = intersection(line);
00068         return line.point(res);
00069     }
00070 }
 All Classes Functions Variables