Una forma de hacerlo es comenzar con un sólido platónico con lados triangulares, un octaedro , por ejemplo. Luego, toma cada triángulo y divídelo recursivamente en triángulos más pequeños, así:
Una vez que tenga una cantidad suficiente de puntos, normalice sus vectores para que todos estén a una distancia constante del centro del sólido. Esto hace que los lados se abulten en una forma que se asemeja a una esfera, con una suavidad creciente a medida que aumenta el número de puntos.
La normalización aquí significa mover un punto para que su ángulo en relación con otro punto sea el mismo, pero la distancia entre ellos sea diferente. Aquí hay un ejemplo bidimensional.
A y B están separados por 6 unidades. Pero suponga que queremos encontrar un punto en la línea AB que esté a 12 unidades de A.
Podemos decir que C es la forma normalizada de B con respecto a A, con distancia 12. Podemos obtener C con código como este:
#returns a point collinear to A and B, a given distance away from A.
function normalize(a, b, length):
#get the distance between a and b along the x and y axes
dx = b.x - a.x
dy = b.y - a.y
#right now, sqrt(dx^2 + dy^2) = distance(a,b).
#we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
dx = dx * length / distance(a,b)
dy = dy * length / distance(a,b)
point c = new point
c.x = a.x + dx
c.y = a.y + dy
return c
Si hacemos este proceso de normalización en muchos puntos, todos con respecto al mismo punto A y con la misma distancia R, entonces los puntos normalizados estarán todos en el arco de un círculo con centro A y radio R.
Aquí, los puntos negros comienzan en una línea y "sobresalen" en un arco.
Este proceso se puede extender a tres dimensiones, en cuyo caso se obtiene una esfera en lugar de un círculo. Simplemente agregue un componente dz a la función normalizar.
Si miras la esfera en Epcot , puedes ver esta técnica en funcionamiento. es un dodecaedro con caras abultadas para que parezca más redondo.