Exemple #1
0
        protected IntersectionCollection LocalIntersect(Ray localRay, Func <double, double, double, Intersection> newIntersection)
        {
            var dirCrossE2 = localRay.Direction.Cross(EdgeVec2);
            var det        = EdgeVec1.Dot(dirCrossE2);

            if (Math.Abs(det) < C.Epsilon)
            {
                return(new IntersectionCollection());
            }

            var f          = 1 / det;
            var p1ToOrigin = localRay.Origin - P1;
            var u          = f * p1ToOrigin.Dot(dirCrossE2);

            if (u < 0 || u > 1)
            {
                return(new IntersectionCollection());
            }

            var originCrossE1 = p1ToOrigin.Cross(EdgeVec1);
            var v             = f * localRay.Direction.Dot(originCrossE1);

            if (v < 0 || u + v > 1)
            {
                return(new IntersectionCollection());
            }

            var t = f * EdgeVec2.Dot(originCrossE1);

            return(new IntersectionCollection(newIntersection(t, u, v)));
        }
Exemple #2
0
 public Triangle(Tuple p1, Tuple p2, Tuple p3)
 {
     P1       = p1;
     P2       = p2;
     P3       = p3;
     EdgeVec1 = p2 - p1;
     EdgeVec2 = p3 - p1;
     Normal   = EdgeVec2.Cross(EdgeVec1).Normalize;
 }