Al ser un lechón para las pruebas de intersección rápidas, sólo tenía que tratar de optimizar de trombón y mi rayo-triángulo se cruza o se presentan en la revista de herramientas gráficas (JGT) en 1997. Eric Haines y me di esto (y algunas otras optimizaciones para el caso 2D) en un pequeño artículo para el Diario del Dr. Dobb. Sin embargo, no había espacio suficiente para discutir todos los detalles, por lo tanto, esta página exists.First de todo, pensé que sería interesante ver lo que sucede con el tiempo de cruce como el número de visitas aumenta del 0% al 100%. En segundo lugar, como ya dijimos en nuestro artículo JGT, la división (después de todo, la división es bastante caro, por lo que nos preocupamos por ella) podría ser empujado lejos adelante en el código, haciendo diferentes pruebas dependiendo del signo del determinante . Por lo tanto, he implementado esto, y creo que el código es aún más limpio ahora (por ejemplo, acaba de quitar el "else if" y usted tiene una prueba para la eliminación selectiva cara pintada de negro) En tercer lugar, he intentado un montón de diferentes maneras de ordenar los cálculos en el código, y finalmente se estableció en tres versiones diferentes: 1) Tener la brecha en el end.2) Tener la brecha temprano en la Código.3) Tener la brecha temprano en el código más mover un producto cruzado hacia fuera del "si -else si "-case. (Versión número 0 es simplemente el código original de JGT) .El código de estas cuatro versiones están disponibles abajo. Tengo mi programa de prueba (compilado con "-O2 de gcc") en tres equipos diferentes: un SGI Octane con una MHz R10K 175, un Sun UltraSPARC-III a 333 MHz, y en un PC Linux con un procesador Pentium III de 700 MHz para hacer que el prueba y los tiempos razonables (por lo menos en algunos aspectos), lo primero que asignó al azar a 1000 pares diferentes de rayos-triángulo y poner estas en una lista. Entonces empecé el reloj por primera optimización, y correr a través de la lista de 10.000 veces, y luego se detuvo el reloj. Hacerlo de esta manera, creo que evitar golpes de rendimiento de predicción de saltos, que yo pueda conseguir si repito la misma prueba por un par de rayos-triángulo 10.000 veces seguidas (y luego el siguiente par, y así sucesivamente). Todo esto se hizo para las cuatro versiones del código. 1. Utilizando el método ComputeIntersectionBox (...), que toma un rayo y una caja como argumentos y calcula la intersección más cercana del rayo y la caja. Este método funciona mediante la formación de un avión con cada una de las caras de la caja y la búsqueda de una intersección con cada uno de los planos. Una vez que se encuentra una intersección, se hace una comprobación si el punto está en la superficie de la caja por la comprobación de que el punto de intersección se encuentra entre los puntos de esquina. Cuando miro a los rayos después de ejecutar este algoritmo en dos cajas diferentes, puedo obtener las intersecciones correctas. 2. Utilizando el método ComputeIntersectionScene (...) sin necesidad de utilizar las transformaciones de matriz en una escena que tiene dos esferas, un dodecaedro (una malla triangular), y dos cajas. ComputeIntersectionScene (...) de forma recursiva atraviesa todos los nodos del gráfico de escena y calcula la intersección más cercana con el rayo dado. Esta prueba en particular, no se aplica ningún transformaciones que pueden tener nodos padre, que también necesita ser aplicada a sus hijos. Con esta prueba, yo también obtener las intersecciones correctas. 3. Utilizando el método ComputeIntersectionScene (...) con las transformaciones de matriz. Esta prueba funciona como el de arriba, excepto que antes de encontrar una intersección entre el rayo y un nodo en la escena, el rayo se transforma en, esta intersección del marco de coordenadas utilizando la inversa de la matriz de transformación del nodo y después de la intersección ha sido calculado el nodo se transforma de nuevo en el mundo coordina mediante la aplicación de la matriz de transformación hasta el punto de intersección.