// Triangle3d methods bool Triangle3d::Intof(const Line& l, Point3d& intof)const { // returns intersection triangle to line in intof // funtion returns true for intersection, false for no intersection // method based on Möller & Trumbore(1997) (Barycentric coordinates) // based on incorrect Pseudo code from "Geometric Tools for Computer Graphics" p.487 if(box.outside(l.box) == true) return false; Vector3d line(l.v); line.normalise(); Vector3d p = line ^ v1; // cross product double tmp = p * v0; // dot product if(FEQZ(tmp)) return false; tmp = 1 / tmp; Vector3d s(vert1, l.p0); double u = tmp * (s * p); // barycentric coordinate if(u < 0 || u > 1) return false; // not inside triangle Vector3d q = s ^ v0; double v = tmp * (line * q); // barycentric coordinate if(v < 0 || v > 1) return false; // not inside triangle if( u + v > 1) return false; // not inside triangle double t = tmp * (v1 * q); intof = line * t + l.p0; return true; }
bool Line::atZ(double z, Point3d& p)const { // returns p at z on line if(FEQZ(this->v.getz())) return false; double t = (z - this->p0.z) / this->v.getz(); p = Point3d(this->p0.x + t * this->v.getx(), this->p0.y + t * this->v.gety(), z); return true; }
// vector Vector2d::Vector2d(const Vector3d &v){ if(FEQZ(v.getz())) FAILURE(L"Converting Vector3d to Vector2d illegal"); dx = v.getx(); dy = v.gety(); }