protected (bool, float, float, float) TestLocalIntersection(Ray localRay) { Tuple dirCrossE2 = localRay.Direction.Cross(E2); float det = E1.Dot(dirCrossE2); if (Abs(det) < Constants.floatEps) { return(false, 0, 0, 0); } float invDet = 1.0f / det; Tuple p1ToOrigin = localRay.Origin - P1; float u = invDet * p1ToOrigin.Dot(dirCrossE2); if (u < 0 || u > 1) { return(false, 0, 0, 0); } Tuple originCrossE1 = p1ToOrigin.Cross(E1); float v = invDet * localRay.Direction.Dot(originCrossE1); if (v < 0 || (u + v) > 1) { return(false, 0, 0, 0); } float t = invDet * E2.Dot(originCrossE1); return(true, t, u, v); }
protected internal override IntersectionList LocalIntersect(Ray localRay) { Vector directionCrossE2 = localRay.Direction.Cross(E2); double determinant = E1.Dot(directionCrossE2); if (determinant.IsApproximatelyEqual(0)) { return(IntersectionList.Empty); } double f = 1.0 / determinant; Vector p1ToOrigin = localRay.Origin - P1; double u = f * p1ToOrigin.Dot(directionCrossE2); if (u < 0 || u > 1) { return(IntersectionList.Empty); } Vector originCrossE1 = p1ToOrigin.Cross(E1); double v = f * localRay.Direction.Dot(originCrossE1); if (v < 0 || u + v > 1) { return(IntersectionList.Empty); } double t = f * E2.Dot(originCrossE1); return(new IntersectionList(new Intersection(t, this, u, v))); }
protected override Intersections LocalIntersect(Ray ray) { var results = new Intersections(); var dirCrossE2 = ray.Direction.Cross(E2); var det = E1.Dot(dirCrossE2); if (Math.Abs(det) < MathHelper.Epsilon) { return(results); } var f = 1.0 / det; var p1ToOrigin = new Vector(ray.Origin - P1); var u = f * p1ToOrigin.Dot(dirCrossE2); if ((u < 0) || (u > 1)) { return(results); } var originCrossE1 = p1ToOrigin.Cross(E1); var v = f * ray.Direction.Dot(originCrossE1); if ((v < 0) || (u + v > 1)) { return(results); } var t = f * E2.Dot(originCrossE1); results.Add(new Intersection(t, this, u, v)); return(results); }