public bool Intersect(NuGenRay3F ray, ref float t, ref float u, ref float v, ref NuGenVec3F normal) { NuGenVec3F e1 = p1 - p0; NuGenVec3F e2 = p2 - p0; NuGenVec3F p = NuGenVec3F.Cross(ray.Direction, e2); float a = NuGenVec3F.Dot(e1, p); if (a > -NuGenVector.TINY_FLOAT && a < NuGenVector.TINY_FLOAT) { return(false); } float f = 1.0f / a; NuGenVec3F s = ray.Point - p0; u = f * NuGenVec3F.Dot(s, p); if (u < 0.0f || u > 1.0f) { return(false); } NuGenVec3F q = NuGenVec3F.Cross(s, e1); v = f * NuGenVec3F.Dot(ray.Direction, q); if (v < 0.0f || (u + v) > 1.0f) { return(false); } t = f * NuGenVec3F.Dot(e2, q); normal = NuGenVec3F.Cross(e1, e2); normal.Normalize(); return(true); }
public bool Intersect(NuGenRay3F ray, ref float t, ref NuGenVec3F normal) { NuGenVec3F l = center - ray.Point; float s = NuGenVec3F.Dot(l, ray.Direction); float l2 = l.SquaredLength; float rr = radius * radius; if (s < 0.0f && l2 > rr) { return(false); } float m2 = l2 - s * s; if (m2 > rr) { return(false); } float q = (float)Math.Sqrt(rr - m2); if (l2 > rr) { t = s - q; } else { t = s + q; } normal = (ray.Point + ray.Direction * t) - center; normal.Normalize(); return(true); }
public bool Intersect(NuGenRay3F ray, ref float t, ref NuGenVec3F normal) { NuGenVec3F l = center - ray.Point; float s = NuGenVec3F.Dot(l, ray.Direction); float l2 = l.SquaredLength; float rr = radius * radius; if (s < 0.0f && l2 > rr) return false; float m2 = l2 - s * s; if (m2 > rr) return false; float q = (float)Math.Sqrt(rr - m2); if (l2 > rr) t = s - q; else t = s + q; normal = (ray.Point + ray.Direction * t) - center; normal.Normalize(); return true; }
public bool Intersect(NuGenRay3F ray, ref float t, ref float u, ref float v, ref NuGenVec3F normal) { NuGenVec3F e1 = p1 - p0; NuGenVec3F e2 = p2 - p0; NuGenVec3F p = NuGenVec3F.Cross(ray.Direction, e2); float a = NuGenVec3F.Dot(e1, p); if (a > -NuGenVector.TINY_FLOAT && a < NuGenVector.TINY_FLOAT) return false; float f = 1.0f / a; NuGenVec3F s = ray.Point - p0; u = f * NuGenVec3F.Dot(s, p); if (u < 0.0f || u > 1.0f) return false; NuGenVec3F q = NuGenVec3F.Cross(s, e1); v = f * NuGenVec3F.Dot(ray.Direction, q); if (v < 0.0f || (u + v) > 1.0f) return false; t = f * NuGenVec3F.Dot(e2, q); normal = NuGenVec3F.Cross(e1, e2); normal.Normalize(); return true; }
public bool Intersect(NuGenRay3F r) { bool inside = true; int[] quadrant = new int[3]; int i; int whichPlane; float[] max = new float[3]; float[] candidatePlane = new float[3]; NuGenVec3D coord = new NuGenVec3D(0, 0, 0); for (i = 0; i < 3; i++) { if (r.Point[i] < lower[i]) { quadrant[i] = 1; candidatePlane[i] = lower[i]; inside = false; } else if (r.Point[i] > upper[i]) { quadrant[i] = 0; candidatePlane[i] = upper[i]; inside = false; } else { quadrant[i] = 2; } } if (inside) { return(true); } for (i = 0; i < 3; i++) { if (quadrant[i] != 2 && r.Direction[i] != 0.0) { max[i] = (candidatePlane[i] - r.Point[i]) / r.Direction[i]; } else { max[i] = -1.0f; } } whichPlane = 0; for (i = 1; i < 3; i++) { if (max[whichPlane] < max[i]) { whichPlane = i; } } if (max[whichPlane] < 0.0) { return(false); } for (i = 0; i < 3; i++) { if (whichPlane != i) { coord[i] = r.Point[i] + max[whichPlane] * r.Direction[i]; if (coord[i] < lower[i] || coord[i] > upper[i]) { return(false); } } else { coord[i] = candidatePlane[i]; } } return(true); }
public bool Intersect(NuGenRay3F r) { bool inside = true; int[] quadrant = new int[3]; int i; int whichPlane; float[] max = new float[3]; float[] candidatePlane = new float[3]; NuGenVec3D coord = new NuGenVec3D(0, 0, 0); for (i = 0; i < 3; i++) { if (r.Point[i] < lower[i]) { quadrant[i] = 1; candidatePlane[i] = lower[i]; inside = false; } else if (r.Point[i] > upper[i]) { quadrant[i] = 0; candidatePlane[i] = upper[i]; inside = false; } else { quadrant[i] = 2; } } if (inside) return true; for (i = 0; i < 3; i++) { if (quadrant[i] != 2 && r.Direction[i] != 0.0) { max[i] = (candidatePlane[i] - r.Point[i]) / r.Direction[i]; } else { max[i] = -1.0f; } } whichPlane = 0; for (i = 1; i < 3; i++) { if (max[whichPlane] < max[i]) whichPlane = i; } if (max[whichPlane] < 0.0) return false; for (i = 0; i < 3; i++) { if (whichPlane != i) { coord[i] = r.Point[i] + max[whichPlane] * r.Direction[i]; if (coord[i] < lower[i] || coord[i] > upper[i]) { return false; } } else { coord[i] = candidatePlane[i]; } } return true; }