%% syntaxe : solid dualpolyedreregulier --> solid
%% syntaxe : solid r dualpolyedreregulier --> solid
%% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r
/dualpolyedreregulier {
20 dict begin
dup isnum {
/r exch def
/projection true def
} {
/projection false def
} ifelse
/solid exch def
solid dupsolid /result exch def pop
/n solid solidnombrefaces def
/N solid solidnombresommets def
/facesaenlever [] def
%% pour chacun des sommets
0 1 N 1 sub {
%% sommet d indice i
/i exch def
%% indicesfacesadj = liste des indices des faces ou on trouve le sommet i
/indicesfacesadj solid i solidfacesadjsommet def
%% on recupere les centres des faces concernees
/nouveauxsommets [
0 1 indicesfacesadj length 1 sub {
/k exch def
solid indicesfacesadj k get solidgetsommetsface isobarycentre3d
} for
] def
%% et on pose G = barycentre de ces points
nouveauxsommets isobarycentre3d /G defpoint3d
%% il faut ordonner ces sommets
nouveauxsommets 0 getp3d /ptref defpoint3d
G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d
nouveauxsommets duparray exch pop
{1 dict begin
/M defpoint3d
G ptref vecteur3d
G M vecteur3d
vecteurnormal angle3doriente
end} papply3d
doublebubblesort pop
%% nos sommets sont tries
/indicesommetstries exch def
projection {
%% on projette les sommets sur la sphere
/nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store
} if
%% puis on les rajoute au solide
/nouveauxindices [
0 1 nouveauxsommets length 3 idiv 1 sub {
/k exch def
result nouveauxsommets k getp3d solidaddsommet
} for
] def
%% ainsi que la face concernee
result [
0 1 indicesommetstries length 1 sub {
/k exch def
nouveauxindices indicesommetstries k get get
} for
] solidaddface
/facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store
} for
result [0 1 n 1 sub {} for] solidrmfaces
[N 1 sub -1 0 {} for] {result exch solidrmsommet} apply
result
end
} def
|