Eso está muy bien si son 4, 6, 8, 12 o 20 puntos -- que son los vértices de los sólidos platónicos. Pero si son 7, mala suerte. Es un problema tonto, en principio, pero que no tiene solución según leí hace tiempo en los pasatiempos matemáticos de la Scientific American.
En estas dudas tan pedestres estaba yo cuando decidí hacer una simulación para ver qué salía. Es fácil: se reparten n puntos sobre una esfera, se hace que se repelan según la inversa de la distancia (como si fueran cargas electrostáticas) y a ver qué sale. Lo que pasa es que a ver cómo veo luego el resultado.
Nada, nada: tras tanto meterme con swing, me hago un mini-interfaz básico y pinto los puntos en un JFrame desos. Hacía tanto que no tocaba eso, que podía ser divertido y todo. El problema es que los puntos están en tres dimensiones. Vale, pues ¡a bajarse Java3D! ¡Qué diver!
Y volvemos a comprobar lo multiplataforma que es Java: sólo hay versiones para Solaris y Windows, por lo menos hechas por Sun. Otras empresas lo han portado a otros sistemas operativos, pero no hay suerte: no hay para Mac OS X. Demonios.
En fin, qué se le va a hacer. No debe ser tan difícil hacer una representación 3D en Java, al fin y al cabo ya había hecho cosas parecidas con el viejo Atari ST (en ensamblador 68k), aunque aquéllo nunca fue demasiado bien y resultó imposible de depurar: tuve que dejarlo a medias. Pero ahora iría armado de las nuevas técnicas de representación 3D.
Vamos resumiendo, que hay que papear: primero hice una representación esférica (fácil, se dividen x e y por z y te sale lo que lo que se vería con un ojo de pez), pintando sólo los puntos y una esfera de alambres. Luego me atreví a pintar las caras formadas por las partículas, sólo para darme cuenta de que no sabía cómo: si tengo n puntos, ¿cómo saco de ahí las caras que forman? No es sencillo; opté por seguir el camino bestia, pintar todos los triángulos posibles. Como se solapaban, me hice un z-buffer: para cada punto que tengas que pintar, guardas la profundidad en un array aparte; si el siguiente está más cerca de la cámara, lo pintas, y si no lo ignoras.
E iba más lento que el caballo del malo. Con tres puntos hacía menos de 10 imágenes por segundo, a 400x400. Mi siguiente ocurrencia fue pasar del ojo de pez (que te sale todo agüevao) y hacerlo en geometría proyectiva. Suena muy bonito, pero sólo tienes que pintar cuatro vectorzuchos y las proyecciones sobre un plano.
Por último, intenté hacer un algoritmo mejor para dividirlo en caras. Ahora hace entre 10 y 15 imágenes por segundo, casi independiente del número de puntos, pero no funciona bien y me salen picos estraños. ¿Alguien conoce un algoritmo bonito para hacer triángulos a partir de n puntos?