/// <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); }
/// <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); }