Source PostScript (dualpolyedre.pps)

Retour Texte non formaté
%% 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