Point3d Point3d::operator+(const Vector3d &v)const{ return Point3d(x + v.getx(), y + v.gety(), z + v.getz()); }
// vector Vector2d::Vector2d(const Vector3d &v){ if(FEQZ(v.getz())) FAILURE(L"Converting Vector3d to Vector2d illegal"); dx = v.getx(); dy = v.gety(); }
Point3d::Point3d(const Vector3d& v) { x = v.getx(); y = v.gety(); z = v.getz();// ok = true; }
int Intof(const Line& l0, const Line& l1, Point3d& intof) { /* intersection of 2 vectors returns 0 for intercept but not within either vector returns 1 for intercept on both vectors note that this routine always returns 0 for parallel vectors method: x = x0 + dx0 * t0 for l0 ... ... x = x1 + dx1 * t1 for l1 ... ... x0 + dx0 * t0 = x1 + dx1 * t1 dx0 * t0 - dx1 * t1 + x0 - x1 = 0 setup 3 x 3 determinent for a0 t0 + b0 t1 + c0 = 0 a1 t0 + b1 t1 + c1 = 0 a2 t0 + b2 t1 + c2 = 0 from above a = l0.v b = -l1.v c = Vector3d(l1, l0) */ // Vector3d a = l0.v; if(l0.box.outside(l1.box) == true) return 0; Vector3d b = -l1.v; Vector3d c = Vector3d(l1.p0, l0.p0); Vector3d det = l0.v ^ b; Vector3d t = b ^ c; // choose largest determinant & corresponding parameter for accuracy double t0 = t.getx(); double d = det.getx(); if(fabs(det.getz()) > fabs(det.gety())) { if(fabs(det.getz()) > fabs(det.getx())) { t0 = t.getz(); d = det.getz(); } } else { if(fabs(det.gety()) > fabs(det.getx())) { t0 = t.gety(); d = det.gety(); } } if(fabs(d) < 1.0e-06) return 0; t0 /= d; intof = l0.v * t0 + l0.p0; Point3d other; double t1; if(Dist(l1, intof, other, t1) > geoff_geometry::TOLERANCE) return 0; t0 *= l0.length; if( t0 < -geoff_geometry::TOLERANCE || t0 > l0.length + geoff_geometry::TOLERANCE || t1 < -geoff_geometry::TOLERANCE || t1 > l1.length + geoff_geometry::TOLERANCE ) return 0; return 1; }