コード例 #1
0
        /// <summary>
        /// Clasifica un punto respecto de un Cuerpo Convexo de N caras.
        /// Puede devolver OUTSIDE o INSIDE (si es coincidente se considera como INSIDE).
        /// Los planos del Cuerpo Convexo deben apuntar hacia adentro.
        /// </summary>
        /// <param name="q">Punto a clasificar</param>
        /// <param name="polyhedron">Cuerpo Convexo</param>
        /// <returns>Resultado de la clasificación</returns>
        public static ConvexPolyhedronResult classifyPointConvexPolyhedron(Vector3 q, TgcConvexPolyhedron polyhedron)
        {
            bool             fistTime = true;
            PointPlaneResult lastC    = PointPlaneResult.BEHIND;
            PointPlaneResult c;

            for (int i = 0; i < polyhedron.Planes.Length; i++)
            {
                c = TgcCollisionUtils.classifyPointPlane(q, polyhedron.Planes[i]);

                if (c == PointPlaneResult.COINCIDENT)
                {
                    continue;
                }

                //guardar clasif para primera vez
                if (fistTime)
                {
                    fistTime = false;
                    lastC    = c;
                }


                //comparar con ultima clasif
                if (c != lastC)
                {
                    //basta con que haya una distinta para que este Afuera
                    return(ConvexPolyhedronResult.OUTSIDE);
                }
            }

            //Si todos dieron el mismo resultado, entonces esta adentro
            return(ConvexPolyhedronResult.INSIDE);
        }
コード例 #2
0
 /// <summary>
 /// Indica si un punto se encuentra dentro de un Cuerpo Convexo.
 /// Los planos del Cuerpo Convexo deben apuntar hacia adentro.
 /// Es más ágil que llamar a classifyPointConvexPolyhedron()
 /// </summary>
 /// <param name="q">Punto a clasificar</param>
 /// <param name="polyhedron">Cuerpo Convexo</param>
 /// <returns>True si se encuentra adentro.</returns>
 public static bool testPointConvexPolyhedron(Vector3 q, TgcConvexPolyhedron polyhedron)
 {
     for (int i = 0; i < polyhedron.Planes.Length; i++)
     {
         //Si el punto está detrás de algún plano, entonces está afuera
         if (TgcCollisionUtils.classifyPointPlane(q, polyhedron.Planes[i]) == PointPlaneResult.BEHIND)
         {
             return(false);
         }
     }
     //Si está delante de todos los planos, entonces está adentro.
     return(true);
 }