La historia de Vertex

La versión más simple del algorimo para colocar N esferas equidistantes de <0,0,0> a una distancia R1.
Una forma muy simple de hacerlo es calculando la posición de los puntos mediante la función seno y coseno con una sentencia de bucle #while:

#include "math.inc"
#macro Vertex_001(N,R1) #local N_counter=0; #while (N_counter<N)
#
local Vertex =
<sind((360/N)*N_counter)*R1,
0,
cosd((360/N)*N_counter)*R1>; sphere {Vertex,0.1} #local N_counter=N_counter+1;
#end #end
object {
Vertex_001(10,1)
}

Código fuente : Vertex_001.pov
Complicaremos un poco la cosa anidando N anillos de radio Menor, con M esferas cada uno a una distancia Mayor de <0,0,0>.
Utilizamos dos bucles anidados #while e incorporamos el calculo de la posición de las esferas dentro de los "anillos" interiores a la variable Vertex:
#local Vertex =
       <(sind((360/N)*N_counter)*Major)+
       ((cosd((360/M)*M_counter)*Minor)*(sind((360/N)*N_counter))),

(sind((360/M)*M_counter)*Minor),

(cosd((360/N)*N_counter)*Major)+ ((cosd((360/M)*M_counter)*Minor)*(cosd((360/N)*N_counter)))>;

Código fuente: Vertex_002.pov

Más funcionalidades: añadimos parámetros para controlar el arco de circunferencia en grados cubierto por las esferas y anillos (M_deg y N_deg respectivamente) y el ángulo de arranque de las mismas (N_st y M_st):

 #local Vertex =
<(sind(((N_deg/N)*N_count)+N_st)*Major)+
((cosd(((M_deg/M)*M_count)+M_st)*Minor)*(sind(((N_deg/N)*N_count)+N_st))),
(sind(((M_deg/M)*M_count)+M_st)*Minor),
(cosd(((N_deg/N)*N_count)+N_st)*Major)+
((cosd(((M_deg/M)*M_count)+M_st)*Minor)*(cosd(((N_deg/N)*N_count)+N_st)))>;

Código fuente: Vertex_003.pov
Uniendo puntos