示例#1
0
        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);
        }
示例#2
0
        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)));
        }
示例#3
0
        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);
        }