示例#1
0
        public bool Intersects(Rect3 rect)
        {
            //Determinante shit
            //double a = ( (V.Y - V.X) * (W.Z - W.X) - (V.Z - V.X) * (W.Y - W.X)); //*-u.x
            //double b = (-(U.Y - U.X) * (W.Z - W.X) + (U.Z - U.X) * (W.Y - W.X)); //*-v.X
            //double c = ( (U.Y - U.X) * (V.Z - V.X) - (U.Z - U.X) * (V.Y - V.X)); //*-w.x
            Vector3 Normal = Normal ();
            //la recta no toca el plano
            if (Normal.X * rect.Lambdian.X + Normal.Y *rect.Lambdian.Y + Normal.Z * rect.Lambdian.Z == 0)
                return false;
            double d = - Normal.X * U.X - Normal.Y * V.X - Normal.Z * W.X;
            double lambda = (-d - Normal.X * rect.A.X - Normal.Y * rect.A.Y - Normal.Z * rect.A.Z)
                / (Normal.X * rect.Lambdian.X + Normal.Y * rect.Lambdian.Y + Normal.Z * rect.Lambdian.Z);
            if(!rect.Infinite){
                //el punto que toca el plano no se encuentra en el rango de la recta
                if (lambda < 0 || lambda > 1)
                    return false;
            }
            if (!Infinite) {
                //el punto que toca al plano
                Vector3 p = rect.Lambdian * lambda;
                //los triangulos formados por U,V,W y p
                Polygon uvp = new Polygon (U, V, p),
                vwp = new Polygon (V, W, p),
                uwp = new Polygon (U, W, p);
                //la suma de las areas de los nuevos triangulos es mayor que la de el triangulo original
                if (uvp.Area () + vwp.Area () + uwp.Area () > this.Area ())
                    return false;
            }

            return true;
        }