sources:
BOX.CPP (3.1k)
BOX.H (507 bytes)
RAY.CPP (609 bytes)
RAY.H (604 bytes)
SPHERE.CPP (1.9k)
SPHERE.H (564 bytes)
TRIANGLE.CPP (2.1k)
TRIANGLE.H (1.2k)
UTIL.H (1.7k)
VECTOR.CPP (1.6k)
VECTOR.H (5.0k)
cgapplication.cpp (3.2k)
cgapplication.h (3.5k)
cgraytracer.cpp (18.8k)
cgraytracer.h (1.6k)
shape.h (754 bytes)


binaries:
Release/raytracer.exe (38.0k)


website:
more info here


screenshot:
studies/grafik2/Computergrafik-Code6/Aufgabe17/TRIANGLE.CPP
download file

  1 #include "triangle.h"
  2 #include <iostream.h>
  3 #include <assert.h>
  4 #include <algorithm>
  5
  6 Triangle::Triangle() { }
  7
  8 Triangle::Triangle(const Vector& v0,const Vector& v1, const Vector& v2) {
  9     v_[0] = v0;
 10     v_[1] = v1;
 11     v_[2] = v2;
 12     triNrm_ = makeCWTriangleNormal(v_[0],v_[1],v_[2]);
 13     n_[0] = n_[1] = n_[2] = triNrm_;
 14 }
 15
 16
 17 void Triangle::normalizeNormals() {
 18     n_[0].normalize();
 19     n_[1].normalize();
 20     n_[2].normalize();
 21 }
 22
 23 static inline int MeshMaxIndex(double a, double b, double c) {
 24     return((a > b) ? ((a > c) ? 0 : 2) : ((b > c) ? 1 : 2));
 25 }
 26
 27 bool Triangle::intersect(const Ray& ray,Vector& point,Vector& normal, double& distance) const {
 28     // edges of the triangle
 29     const Vector edge1 = v_[1] - v_[0];
 30     const Vector edge2 = v_[2] - v_[0];
 31
 32     const Vector p    = ray.getDirection() * edge2;
 33     const double detA = dotProduct(p, edge1);
 34
 35     // det(A) != 0
 36     if (detA == 0)
 37         return false;
 38
 39     const double f = 1/detA;
 40     const Vector s = ray.getOrigin() - v_[0];
 41     const double u = f * dotProduct(p, s);
 42
 43     // first barycentric value must be in [0,1]
 44     if (u<0 || u>1)
 45         return false;
 46
 47     const Vector q = s*edge1;
 48     const double v = f * dotProduct(q, ray.getDirection());
 49
 50     // second barycentric value must be in [0,1]
 51     if (v<0 || v>1 || u+v>1)
 52         return false;
 53
 54     const double t = f * dotProduct(q, edge2);
 55
 56     // object on the wrong side of the ray ?
 57     if (t <= 0)
 58         return false;
 59
 60
 61     // intersection found, barycentric coordinates are (u,v,t)
 62     point  = ray.getOrigin() + t*ray.getDirection();
 63
 64     normal = triNrm_;
 65     // invert normal to allow the triangle being viewed from its back side
 66     if (dotProduct(normal, ray.getDirection()) > 0)
 67         normal = -normal;
 68
 69     distance = t;//abs(point-ray.getOrigin());
 70
 71     return true;
 72 }
 73
 74 //
 75 // IO
 76 //
 77
 78 istream& operator>>(istream& s, Triangle& u) {   
 79     Vector t;
 80     for (int i = 0; i < 3; i++) {
 81         if (!(s >> t[0] >> t[1] >> t[2])) {
 82             assert(0);
 83         }
 84         u.v_[i] = t;
 85     }           
 86     u.triNrm_ = makeCWTriangleNormal(u.v_[0],u.v_[1],u.v_[2]);
 87     u.n_[0] = u.n_[1] = u.n_[2] = u.triNrm_;
 88     return s;
 89 }
 90