Changeset 4

Show
Ignore:
Timestamp:
02/14/08 21:07:33 (1 year ago)
Author:
jpv
Message:

Ajout de writeobjfile, tronque, champfrein, tube

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/solides.pro

    r3 r4  
    5454/stockcurrentcpath {} def 
    5555/newarrowpath {} def 
     56/chaine 15 string def 
    5657 
    5758%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
     
    12521253end 
    12531254} def 
     1255%% syntaxe : a n modulo 
     1256/modulo { 
     12572 dict begin 
     1258   /n exch def 
     1259   /a exch def 
     1260   { 
     1261      a 0 lt { 
     1262         /a a n add store 
     1263      } { 
     1264         exit 
     1265      } ifelse 
     1266   } loop 
     1267   a n mod 
     1268end 
     1269} def 
    12541270 
    12551271%%%%% ### max ### 
     
    12851301   /elt exch def 
    12861302   /i 0 def 
    1287    0 false                      %% la reponse a priori 
     1303   false                        %% la reponse a priori 
    12881304   liste length { 
    12891305      liste i get elt eq { 
    1290          pop pop                %% en enleve la reponse 
     1306         pop                    %% en enleve la reponse 
    12911307         i true                 %% pour mettre la bonne 
    12921308         exit 
     
    22162232} def 
    22172233 
     2234%%%%% ### exch ### 
     2235/exchp { 
     2236   4 -1 roll 
     2237   4 -1 roll 
     2238} def 
     2239/exchc { 
     2240   6 -1 roll 
     2241   6 -1 roll 
     2242   6 -1 roll 
     2243} def 
     2244/exchd { 
     2245   4 {8 -1 roll} repeat 
     2246} def 
     2247/exchp3d { 
     2248   6 -1 roll 
     2249   6 -1 roll 
     2250   6 -1 roll 
     2251} def 
     2252 
     2253%%%%% ### ABpoint3d ### 
     2254%% syntaxe : A B k ABpoint3d --> M 
     2255%% M tel que vect(AM) = k vect (AB) 
     2256/ABpoint3d { 
     22573 dict begin 
     2258   /k exch def 
     2259   /B defpoint3d 
     2260   /A defpoint3d 
     2261   A B vecteur3d 
     2262   k mulv3d 
     2263   A addv3d  
     2264end 
     2265} def 
     2266 
     2267%%%%% ### angle3doriente ### 
     2268%% syntaxe : vect1 vect2 vect3 angle3d 
     2269%% vect3 est la normale au plan (vect1, vect2) 
     2270/angle3doriente { 
     22714 dict begin 
     2272   normalize3d /vect3 defpoint3d 
     2273   normalize3d /vect2 defpoint3d 
     2274   normalize3d /vect1 defpoint3d 
     2275   /cosalpha vect1 vect2 scalprod3d def 
     2276   /sinalpha vect1 vect2 vectprod3d vect3 scalprod3d def 
     2277   sinalpha cosalpha atan 
     2278end 
     2279} def 
     2280 
     2281%%%%% ### points3dalignes ### 
     2282%% syntaxe : A B C points3dalignes -> bool 
     2283/points3dalignes { 
     22843 dict begin 
     2285   /C defpoint3d 
     2286   /B defpoint3d 
     2287   /A defpoint3d 
     2288   A B vecteur3d /u defpoint3d 
     2289   A C vecteur3d /v defpoint3d 
     2290   u v vectprod3d norme3d 1E-7 lt 
     2291end 
     2292} def 
     2293 
     2294%% syntaxe : M A B point3dsursegment --> true si M in [AB], false sinon 
     2295/point3dsursegment { 
     22963 dict begin 
     2297   /B defpoint3d 
     2298   /A defpoint3d 
     2299   /M defpoint3d 
     2300   M A B points3dalignes { 
     2301      M A vecteur3d 
     2302      M B vecteur3d 
     2303      scalprod3d 0 lt { 
     2304         true 
     2305      } { 
     2306         false 
     2307      } ifelse 
     2308   } { 
     2309      false 
     2310   } ifelse 
     2311end 
     2312} def 
     2313 
    22182314%%%%% ### fin insertion ### 
    22192315 
     
    24382534%%%%% ### solide ### 
    24392535%% solid = [Sommets Faces Colors_Faces InOut_Table] 
    2440 /solidgetpointstable
     2536/solidgetsommets
    24412537   0 get 
    24422538} def 
     2539/solidgetpointstable {solidgetsommets} def 
    24432540 
    24442541/solidgetfaces { 
     
    24782575} def 
    24792576 
    2480 /solidputpointstable
     2577/solidputsommets
    24812578   0 exch put 
    24822579} def 
     2580/solidputpointstable {solidputsommets} def 
    24832581 
    24842582/solidputfaces { 
     
    251626145 dict begin 
    25172615   /solid exch def 
    2518    /S solid solidgetpointstable def 
     2616   /S solid solidgetsommets def 
    25192617   /F solid solidgetfaces def 
    25202618   /FC solid solidgetfcolors def 
     
    25492647} def 
    25502648 
     2649%% %% syntaxe : solid array solidputoutfaces --> - 
     2650%% /solidputoutfaces { 
     2651%% 4 dict begin 
     2652%%    /facesexternes exch def 
     2653%%    /solid exch def 
     2654%%    /n1 facesexternes length def 
     2655%%    /IO solid solidgetinouttable def 
     2656%%    /facesinternes solid solidgetinfaces def 
     2657%%    /n2 facesinternes length def 
     2658%%    solid 
     2659%%       [facesexternes aload pop facesinternes aload pop] 
     2660%%       solidputfaces 
     2661%%    IO 0 0 put 
     2662%%    IO 1 n1 1 sub put 
     2663%%    IO 2 n1 put 
     2664%%    IO 3 n1 n2 add 1 sub put 
     2665%% end 
     2666%% } def 
     2667 
    25512668%% syntaxe : solid array solidputoutfaces --> - 
    25522669/solidputoutfaces { 
     
    25682685} def 
    25692686 
    2570 %% syntaxe : solid array solidputoutfaces --> - 
    2571 /solidputoutfaces { 
    2572 4 dict begin 
    2573    /facesexternes exch def 
    2574    /solid exch def 
    2575    /n1 facesexternes length def 
    2576    /IO solid solidgetinouttable def 
    2577    /facesinternes solid solidgetinfaces def 
    2578    /n2 facesinternes length def 
    2579    solid 
    2580       [facesexternes aload pop facesinternes aload pop] 
    2581       solidputfaces 
    2582    IO 0 0 put 
    2583    IO 1 n1 1 sub put 
    2584    IO 2 n1 put 
    2585    IO 3 n1 n2 add 1 sub put 
    2586 end 
    2587 } def 
    2588  
    25892687/solidnombreinfaces { 
    259026881 dict begin 
     
    26422740   /n n2 n1 sub 1 add def 
    26432741   F n1 n getinterval 
     2742end 
     2743} def 
     2744 
     2745/tracelignedeniveau? false def 
     2746/hauteurlignedeniveau 1 def 
     2747/couleurlignedeniveau {rouge} def 
     2748/linewidthlignedeniveau 4 def 
     2749 
     2750/solidgrid true def 
     2751/aretescachees true def 
     2752/defaultsolidmode 2 def 
     2753/solidgridOn { 
     2754   /solidgrid true def 
     2755} def 
     2756/solidgridOff { 
     2757   /solidgrid false def 
     2758} def 
     2759 
     2760%% syntaxe : solid i string solidputfcolor 
     2761%% syntaxe : solid str outputcolors 
     2762%% syntaxe : solid str1 str2 inoutputcolors 
     2763%% syntaxe : solid string n solidputncolors 
     2764%% syntaxe : solid array solidputincolors --> - 
     2765%% syntaxe : solid array solidputoutcolors --> - 
     2766%% syntaxe : solid solidgetincolors --> array 
     2767%% syntaxe : solid solidgetoutcolors --> array 
     2768 
     2769%% syntaxe : solid array solidputinfaces --> - 
     2770%% syntaxe : solid array solidputoutfaces --> - 
     2771%% syntaxe : solid solidgetinfaces --> array 
     2772%% syntaxe : solid solidgetoutfaces --> array 
     2773 
     2774%% syntaxe : solid1 solid2 solidfuz -> solid 
     2775 
     2776%% syntaxe : solid i solidgetsommetsface -> array 
     2777%% array = tableau de points 3d 
     2778/solidgetsommetsface { 
     27791 dict begin 
     2780   /i exch def 
     2781   /solid exch def 
     2782   /F solid i solidgetface def 
     2783   [ 
     2784      0 1 F length 1 sub { 
     2785         /k exch def 
     2786         solid F k get solidgetsommet 
     2787      } for 
     2788   ] 
     2789end 
     2790} def 
     2791 
     2792%% syntaxe : solid index table solidputface -> - 
     2793/solidputface { 
     27941 dict begin 
     2795   /table exch def 
     2796   /i exch def 
     2797   solidgetfaces i table put 
     2798end 
     2799} def 
     2800 
     2801%% syntaxe : solid table solidaddface -> - 
     2802%% on ne se preoccupe pas des faces internes 
     2803/solidaddface { 
     28041 dict begin 
     2805   /table exch def 
     2806   /solid exch def 
     2807   /IO solid solidgetinouttable def 
     2808   /n2 IO 1 get def 
     2809   /FC solid solidgetoutcolors def 
     2810   IO 1 n2 1 add put 
     2811   solid [ solid solidgetfaces aload pop table ] solidputfaces 
     2812   solid IO solidputinouttable 
     2813%   solid solidnombrefaces 
     2814    solid [ 
     2815      FC aload pop ()  
     2816    ] solidputoutcolors  
     2817end 
     2818} def 
     2819 
     2820/solidnombrefaces { 
     28211 dict begin 
     2822   /solid exch def 
     2823   solid solidnombreinfaces 
     2824   solid solidnombreoutfaces 
     2825   add  
     2826end 
     2827} def 
     2828 
     2829%% syntaxe : solid M solidaddsommetexterne -> - 
     2830%% on ajoute le sommet sans se preoccuper de rien 
     2831/solidaddsommetexterne { 
     28322 dict begin 
     2833   /M defpoint3d 
     2834   /solid exch def 
     2835   solid 
     2836   [ solid solidgetsommets aload pop M ] 
     2837   solidputsommets 
     2838end 
     2839} def 
     2840 
     2841%% syntaxe : solid array solidaddsommets -> - 
     2842/solidaddsommets { 
     28432 dict begin 
     2844   /table exch def 
     2845   /solid exch def 
     2846   /n table length 3 idiv def 
     2847   0 1 0 { 
     2848      /i exch def 
     2849      solid table i getp3d solidaddsommet pop 
     2850   } for 
     2851end 
     2852} def 
     2853 
     2854%% syntaxe : solid M solidaddsommet -> k 
     2855%% on ajoute le sommet M. Si il est deja sur une arete, 
     2856%% on l incorpore a la face concernee  
     2857%% s il est deja present, on ne le rajoute pas. 
     2858%% Renvoie l indice du sommet rajoute. 
     2859/solidaddsommet { 
     286010 dict begin 
     2861   /M defpoint3d 
     2862   /solid exch def 
     2863   /nbf solid solidnombrefaces def 
     2864   /N solid solidnombresommets def 
     2865   /sortie -1 def 
     2866   %% le sommet est-il deja dans la structure 
     2867   0 1 N 1 sub { 
     2868      /i exch def 
     2869%%       (addsommet) == 
     2870%%       solid i solidgetsommet == == ==  
     2871%%       M == == == 
     2872%%       solid i solidgetsommet M eqp3d == 
     2873    
     2874%      solid i solidgetsommet M eqp3d { 
     2875      solid i solidgetsommet M distance3d 1e-7 le { 
     2876         %% oui => c est fini 
     2877         /sortie i store 
     2878      } if 
     2879   } for 
     2880   sortie 0 lt { 
     2881      %% non => on le rajoute 
     2882      /sortie N def 
     2883      solid M solidaddsommetexterne 
     2884      %% est il sur une arete deja codee 
     2885      0 1 nbf 1 sub { 
     2886         %% face d indice i 
     2887         /i exch def 
     2888         solid i solidgetface /F exch def 
     2889         /nbsf F length def 
     2890         0 1 nbsf 1 sub { 
     2891            /j exch def 
     2892            M 
     2893            solid j i solidgetsommetface  
     2894            solid j 1 add nbsf mod i solidgetsommetface  
     2895            point3dsursegment { 
     2896               %% il est sur l arete concernee 
     2897               solid i [ 
     2898                  0 1 j { 
     2899                     /k exch def 
     2900                     F k get 
     2901                  } for 
     2902                  N 
     2903                  j 1 add nbsf mod dup 0 eq { 
     2904                     pop 
     2905                  } { 
     2906                     1 nbsf 1 sub { 
     2907                        /k exch def 
     2908                        F k get 
     2909                     } for 
     2910                  } ifelse 
     2911               ]  solidputface 
     2912               exit 
     2913            } if 
     2914         } for  
     2915      } for 
     2916   } if 
     2917   sortie 
     2918end 
     2919} def 
     2920 
     2921%%%%% ### solidrmsommet ### 
     2922%% syntaxe : solid i solidrmsommet -> - 
     2923/solidrmsommet { 
     29245 dict begin 
     2925   /i exch def 
     2926   /solid exch def 
     2927   solid issolid not { 
     2928      (Erreur : mauvais type d argument dans solidrmsommet) == 
     2929      quit  
     2930   } if 
     2931   solid i solidsommetsadjsommet length 0 gt { 
     2932      (Erreur : sommet non isole dans solidrmsommet) == 
     2933      quit  
     2934   } if 
     2935 
     2936   %% on s occupe des sommets 
     2937   /n solid solidnombresommets def 
     2938   /S [ 
     2939      0 1 n 1 sub { 
     2940         /j exch def 
     2941         j i ne { 
     2942            solid j solidgetsommet 
     2943         } if 
     2944      } for 
     2945   ] def 
     2946   solid S solidputsommets 
     2947   %% on s occupe des faces 
     2948   /n solid solidnombrefaces def 
     2949   /F [ 
     2950      0 1 n 1 sub { 
     2951         %% face d indice j 
     2952         /j exch def 
     2953         /Fj solid j solidgetface def 
     2954         [0 1 Fj length 1 sub { 
     2955            %% sommet d indice k de la face Fj 
     2956            /k exch def 
     2957            Fj k get dup i gt { 
     2958               1 sub 
     2959            } if 
     2960         } for] 
     2961      } for 
     2962   ] def 
     2963   solid F solidputfaces 
     2964end 
     2965} def 
     2966 
     2967%%%%% ### solidsommetsadjsommet ### 
     2968%% syntaxe : solid i solidsommetsadjsommet --> array 
     2969%% array est le tableau des indices des sommets adjacents au 
     2970%% sommet d indice i 
     2971/solidsommetsadjsommet { 
     29726 dict begin 
     2973   /no exch def 
     2974   /solid exch def 
     2975   solid no solidfacesadjsommet /facesadj exch def 
     2976   /sommetsadj [] def 
     2977   /nbadj facesadj length def 
     2978   0 1 nbadj 1 sub { 
     2979      /j exch def 
     2980      %% examen de la jieme face 
     2981      %/j 0 def 
     2982      /F solid facesadj j get solidgetface def 
     2983      /nbsommetsface F length def 
     2984      no F in { 
     2985         /index exch def 
     2986         /i1 F index 1 sub nbsommetsface modulo get def 
     2987         /i2 F index 1 add nbsommetsface mod get def 
     2988         %% si i1 n est pas deja note, on le rajoute 
     2989         i1 sommetsadj in { 
     2990            pop 
     2991         } { 
     2992            /sommetsadj [ sommetsadj aload pop i1 ] store 
     2993         } ifelse 
     2994         %% si i2 n est pas deja note, on le rajoute 
     2995         i2 sommetsadj in { 
     2996            pop 
     2997         } { 
     2998            /sommetsadj [ sommetsadj aload pop i2 ] store 
     2999         } ifelse 
     3000      } { 
     3001         (Error : bug dans solidsommetsadjsommet) == 
     3002         quit 
     3003      } ifelse 
     3004   } for 
     3005   sommetsadj 
     3006end 
     3007} def 
     3008 
     3009%%%%% ### solidfacesadjsommet ### 
     3010%% syntaxe : solid i solidfacesadjsommet --> array 
     3011%% array est le tableau des indices des faces adjacentes au 
     3012%% sommet d indice i 
     3013/solidfacesadjsommet { 
     30146 dict begin 
     3015   /no exch def 
     3016   /solid exch def 
     3017   /n solid solidnombrefaces def 
     3018   /indicesfacesadj [] def 
     3019   0 1 n 1 sub { 
     3020      /j exch def 
     3021      /F solid j solidgetface def 
     3022      no F in { 
     3023         pop 
     3024         /indicesfacesadj [ indicesfacesadj aload pop j ] store 
     3025      } if 
     3026   } for 
     3027   indicesfacesadj 
    26443028end 
    26453029} def 
     
    26803064      quit 
    26813065   } if 
    2682    candidat solidgetpointstable length 0 eq { 
     3066   candidat solidgetsommets length 0 eq { 
    26833067      true 
    26843068   } { 
     
    27563140   } if 
    27573141   /table_faces solid solidgetfaces def 
    2758    /table_sommets solid solidgetpointstable def 
     3142   /table_sommets solid solidgetsommets def 
    27593143   /k table_faces j get i get def 
    27603144   table_sommets k getp3d 
     
    27733157   } if 
    27743158   /table_faces solid solidgetfaces def 
    2775    /table_sommets solid solidgetpointstable def 
     3159   /table_sommets solid solidgetsommets def 
    27763160   /table_indices table_faces i get def 
    27773161   [ 
     
    27933177      quit 
    27943178   } if 
    2795    /table_sommets solid solidgetpointstable def 
     3179   /table_sommets solid solidgetsommets def 
    27963180   table_sommets i getp3d 
    27973181end 
     
    28063190%%%%% ### solidnombre ### 
    28073191/solidnombresommets { 
    2808    solidgetpointstable length 3 idiv 
     3192   solidgetsommets length 3 idiv 
    28093193} def 
    28103194 
     
    28413225/solidnumsommets { 
    284232268 dict begin 
    2843    Font findfont 10 scalefont setfont 
     3227%   Font findfont 10 scalefont setfont 
    28443228   dup issolid not { 
    28453229      %% on a un argument 
     
    28603244      0 1 m 1 sub { 
    28613245         /j exch def %% indice de la face examinee 
    2862          i sol j solidgetface in exch pop
     3246         i sol j solidgetface in
    28633247            %% le sommet i est dans la face j 
     3248            pop 
    28643249            exit 
    28653250         } if 
     
    29143299   /solid2 exch def 
    29153300   /solid1 exch def 
    2916    /S1 solid1 solidgetpointstable def 
    2917    /S2 solid2 solidgetpointstable def 
     3301   /S1 solid1 solidgetsommets def 
     3302   /S2 solid2 solidgetsommets def 
    29183303   /n S1 length 3 idiv def 
    29193304 
     
    30043389   } if 
    30053390   /les_sommets 
    3006       solid solidgetpointstable {f} papply3d 
     3391      solid solidgetsommets {f} papply3d 
    30073392   def 
    3008    solid les_sommets solidputpointstable 
     3393   solid les_sommets solidputsommets 
    30093394   solid 
    30103395end 
     
    30593444   /n2 IO 1 get def 
    30603445   /n n2 n1 sub 1 add def 
    3061    fcol n1 n getinterval 
     3446   fcol n1 n getinterval  
    30623447end 
    30633448} def 
     
    31453530   solid colin inputcolors 
    31463531   solid colout outputcolors 
     3532end 
     3533} def 
     3534 
     3535%% syntaxe : solid array solidputoutcolors --> - 
     3536/solidputoutcolors { 
     35374 dict begin 
     3538   /newcolorstable exch def 
     3539   /solid exch def 
     3540   solid issolid not { 
     3541      (Error : mauvais type d argument dans solidputoutcolors) == 
     3542      quit 
     3543   } if 
     3544   /n newcolorstable length def 
     3545   n solid solidnombreoutfaces ne { 
     3546      (Error : mauvaise longueur de tableau dans solidputoutcolors) == 
     3547      quit 
     3548   } if 
     3549   n 0 ne { 
     3550      /FC solid solidgetfcolors def 
     3551      /IO solid solidgetinouttable def 
     3552      /n1 IO 0 get def 
     3553      FC length n n1 add lt { 
     3554         solid newcolorstable solidputfcolors 
     3555      } { 
     3556         FC n1 newcolorstable putinterval 
     3557      } ifelse 
     3558   } if 
    31473559end 
    31483560} def 
     
    33713783      IO 2 n put 
    33723784      IO 3 2 n mul 1 sub put 
     3785      solid IO solidputinouttable 
    33733786      %% on inverse chaque face 
    33743787      /FI FE {reverse} apply def 
     
    33763789      %% et on rajoute autant de couleurs vides que de faces 
    33773790      /FEC solid solidgetfcolors def 
    3378       /FIC [FI length {()} repeat] def 
    3379       solid FEC FIC append solidputfcolors 
    3380       solid IO solidputinouttable 
     3791%      /FIC [FI length {()} repeat] def 
     3792%      solid FEC FIC append solidputfcolors 
     3793      solid FEC duparray append solidputfcolors 
    33813794   } if  
    33823795end 
     
    34783891   ligne_de_vue normale_plan scalprod3d 0 gt 
    34793892end 
     3893} def 
     3894 
     3895%%%%% ### solidlight ### 
     3896%/lightintensity 1 def 
     3897%/lightsrc {10 15 20} def 
     3898 
     3899/setlightintensity { 
     3900   /lightintensity exch def 
     3901} def 
     3902 
     3903/setlightsrc { 
     3904   /lightsrc defpoint3d 
     3905} def 
     3906 
     3907/setlight { 
     39081 dict begin 
     3909gsave 
     3910   exec 
     3911   [ currentrgbcolor ] /lightcolor exch  
     3912grestore 
     3913end 
     3914def 
    34803915} def 
    34813916 
     
    35403975 
    35413976   /F solid solidgetfaces def 
    3542    /S solid solidgetpointstable def 
     3977   /S solid solidgetsommets def 
    35433978 
    35443979   solid i solidfacevisible? not { 
     
    35694004%% syntaxe : A solid i dessinefacevisible 
    35704005/dessinefacevisible { 
    3571 7 dict begin 
     40068 dict begin 
    35724007   /i exch def 
    35734008   /solid exch def 
     
    35784013   } if 
    35794014   /F solid solidgetfaces def 
    3580    /S solid solidgetpointstable def 
     4015   /S solid solidgetsommets def 
    35814016 
    35824017   solid i solidfacevisible? { 
     
    37064141      solid solidgetfaces 
    37074142      /F exch def 
    3708       solid solidgetpointstable 
     4143      solid solidgetsommets 
    37094144      /S exch def 
    37104145      /n S length 3 idiv def 
     
    38014236%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
    38024237 
    3803 %%%%% ### tronquecube ### 
    3804 %% syntaxe : solid n tronque_cube --> solid (tronque)  
    3805 /tronque_cube {  
    3806 6 dict begin  
    3807    /d exch def  
    3808    /solid exch def  
     4238%%%%% ### dualpolyedreregulier ### 
     4239%% syntaxe : solid dualpolyedreregulier --> solid 
     4240%% syntaxe : solid r dualpolyedreregulier --> solid 
     4241%% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r 
     4242/dualpolyedreregulier { 
     424320 dict begin 
     4244   dup isnum { 
     4245      /r exch def 
     4246      /projection true def 
     4247   } { 
     4248      /projection false def 
     4249   } ifelse 
     4250   /solid exch def 
     4251   solid dupsolid /result exch def pop 
     4252   /n solid solidnombrefaces def 
     4253   /N solid solidnombresommets def 
     4254   /facesaenlever [] def 
     4255   %% pour chacun des sommets 
     4256   0 1 N 1 sub { 
     4257      %% sommet d indice i 
     4258      /i exch def 
     4259      %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i 
     4260      /indicesfacesadj solid i solidfacesadjsommet def 
     4261      %% on recupere les centres des faces concernees 
     4262      /nouveauxsommets [ 
     4263         0 1 indicesfacesadj length 1 sub { 
     4264            /k exch def  
     4265            solid indicesfacesadj k get solidgetsommetsface isobarycentre3d 
     4266         } for 
     4267      ] def 
     4268      %% et on pose G = barycentre de ces points 
     4269      nouveauxsommets isobarycentre3d /G defpoint3d 
     4270      %% il faut ordonner ces sommets 
     4271      nouveauxsommets 0 getp3d /ptref defpoint3d 
     4272      G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d 
     4273      nouveauxsommets duparray exch pop 
     4274      {1 dict begin 
     4275         /M defpoint3d 
     4276         G ptref vecteur3d 
     4277         G M vecteur3d 
     4278         vecteurnormal angle3doriente 
     4279      end} papply3d 
     4280      doublebubblesort pop 
     4281      %% nos sommets sont tries 
     4282      /indicesommetstries exch def 
     4283      projection { 
     4284         %% on projette les sommets sur la sphere 
     4285         /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store 
     4286      } if 
     4287      %% puis on les rajoute au solide 
     4288      /nouveauxindices [ 
     4289         0 1 nouveauxsommets length 3 idiv 1 sub { 
     4290            /k exch def 
     4291            result nouveauxsommets k getp3d solidaddsommet 
     4292         } for 
     4293      ] def 
     4294      %% ainsi que la face concernee 
     4295      result [ 
     4296         0 1 indicesommetstries length 1 sub { 
     4297            /k exch def 
     4298         nouveauxindices indicesommetstries k get get 
     4299         } for  
     4300      ] solidaddface 
     4301      /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store 
     4302   } for 
     4303   result [0 1 n 1 sub {} for] solidrmfaces 
     4304   [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply 
     4305   result 
     4306end 
     4307} def 
     4308 
     4309%%%%% ### solidchampfreine ### 
     4310%% syntaxe : solid coeff i solidchampfreine -> - 
     4311%% syntaxe : solid coeff array solidchampfreine -> - 
     4312%% syntaxe : solid coeff solidchampfreine -> - 
     4313%% syntaxe : solid coeff str solidchampfreine -> - 
     4314%% syntaxe : solid coeff bool solidchampfreine -> - 
     4315/solidchampfreine { 
     431610 dict begin 
     4317   dup isbool { 
     4318      /rmfacecentrale exch def 
     4319   } { 
     4320      /rmfacecentrale true def 
     4321   } ifelse 
     4322   dup isstring { 
     4323      /couleurface exch def 
     4324   } if 
     4325   2 copy pop issolid { 
     4326      %% 2 arguments --> on champfreine tout 
     4327      2 copy pop solidnombrefaces /n exch def 
     4328      /table [n 1 sub -1 0 {} for] def  
     4329   } { 
     4330      %% 1 tableau --> il donne les faces a enlever 
     4331      dup isarray { 
     4332         /table exch bubblesort reverse def 
     4333      } { 
     4334      %% 1 seule face a enlever 
     4335         [ exch ] /table exch def 
     4336      } ifelse 
     4337   } ifelse 
     4338   /coeff exch def 
     4339   /solid exch def 
     4340   0 1 table length 1 sub { 
     4341      /i exch def 
     4342      solid coeff table i get  
     4343      currentdict /couleurface known { 
     4344         couleurface  
     4345      } if 
     4346      rmfacecentrale s@lidchampfreineface 
     4347   } for 
     4348end 
     4349} def 
     4350 
     4351%% syntaxe : solid coeff i s@lidchampfreineface 
     4352 /s@lidchampfreineface { 
     435310 dict begin 
     4354   /rmfacecentrale exch def 
     4355   dup isstring { 
     4356      /couleurface exch def 
     4357   } if 
     4358   /indice_a_chamfreiner exch def 
     4359   /i indice_a_chamfreiner def 
     4360   /coeff exch def 
     4361   /solid exch def 
    38094362   solid issolid not { 
    3810       (Error : mauvais type d argument dans tronque_cube) ==  
     4363      (Erreur : mauvais type d argument dans champfreine) == 
    38114364      quit 
    38124365   } if 
    3813    solid solidgetpointstable  
    3814    /S exch def  
    3815    /co [   
    3816       3 4 1 % 1 3 4 % voisins du sommet 0  
    3817       0 5 2 % 0 2 5 %                de 1  
    3818       1 6 3 % 1 3 6 %                de 2  
    3819       2 7 0 % 0 2 7 %                de 3  
    3820       7 0 5 % 0 5 7 %                de 4  
    3821       4 1 6 % 1 4 6 %                de 5  
    3822       5 2 7 % 2 5 7 %                de 6  
    3823       6 3 4 % 3 4 6 %                de 7  
    3824    ] def                          
    3825   
    3826    /dd {d 1 sub} bind def  
    3827    /i 0 def  
    3828    /les_sommets [  % les coordonnees des sommets du cube tronque  
    3829       0 3 21 {  
    3830           /j exch def  
    3831           %% sommet d indice i = A1  
    3832           solid i solidgetsommet /A1 defpoint3d 
    3833         
    3834           %% k = indice du sommet voisin no 1  
    3835           co j get /k exch def  
    3836           %% sommet d indice k = A2  
    3837           solid k solidgetsommet /A2 defpoint3d 
    3838           %% barycentre {(A1, d) (A2, 1)}  
    3839           A1 d A2 1 barycentre3d       
    3840   
    3841           %% k = indice du sommet voisin no 2  
    3842           co j 1 add get /k exch def  
    3843           %% sommet d indice k = A2  
    3844           solid k solidgetsommet /A2 defpoint3d 
    3845           %% barycentre {(A1, d) (A2, 1)}  
    3846           A1 d A2 1 barycentre3d       
    3847         
    3848           %% k = indice du sommet voisin no 2  
    3849           co j 2 add get /k exch def  
    3850           %% sommet d indice k = A2  
    3851           solid k solidgetsommet /A2 defpoint3d 
    3852           %% barycentre {(A1, d) (A2, 1)}  
    3853           A1 d A2 1 barycentre3d       
    3854  
    3855           /i i 1 add store  
    3856       } for  
    3857    ] def  
    3858   
    3859    /les_faces [  
    3860       [11 10 22 23 12 13 1 0]  
    3861       [2 1 13 14 15 16 4 3]  
    3862       [8 7 19 20 21 22 10 9]  
    3863       [14 12 23 21 20 18 17 15]  
    3864       [3 5 6 8 9 11 0 2]  
    3865       [5 4 16 17 18 19 7 6]  
    3866       [0 1 2]  
    3867       [3 4 5]  
    3868       [6 7 8]  
    3869       [9 10 11]  
    3870       [12 14 13]  
    3871       [15 17 16]  
    3872       [18 20 19]  
    3873       [21 23 22]  
    3874    ] def  
    3875    
    3876    solid les_sommets solidputpointstable  
    3877    solid les_faces solidputfaces  
    3878    solid dup solidgetfcolors [8 {()} repeat] append solidputfcolors 
    3879    solid  
    3880 end  
    3881 } def  
     4366   /n solid solidnombresommets def 
     4367   /F solid i solidgetsommetsface def 
     4368   /Findex solid i solidgetface def 
     4369   /ni F length 3 idiv def 
     4370   /couleurfaceorigine solid i solidgetfcolor def 
     4371   F isobarycentre3d /G defpoint3d 
     4372   %% on ajoute les nouveaux sommets 
     4373   /Sindex [] def 
     4374   0 1 ni 1 sub { 
     4375      /j exch def 
     4376      /Sindex [ Sindex aload pop 
     4377         solid G F j getp3d vecteur3d coeff mulv3d G addv3d solidaddsommet 
     4378      ] store 
     4379   } for 
     4380   %% Sindex contient les indices des nouveaux sommets 
     4381   %% on prepare les faces a ajouter 
     4382   /facestoadd [] def 
     4383   /facestoadd [facestoadd aload pop 
     4384   0 1 ni 1 sub { 
     4385      /j exch def 
     4386      [Findex j get 
     4387      Findex j 1 add ni mod get 
     4388      Sindex j 1 add ni mod get 
     4389      Sindex j get] 
     4390   } for 
     4391   ] store 
     4392   0 1 ni 1 sub { 
     4393      /i exch def 
     4394      solid facestoadd i get solidaddface 
     4395   } for 
     4396   %% on enleve la face d origine 
     4397   solid indice_a_chamfreiner solidrmface 
     4398   %% on ajuste les couleurs des nouvelles faces 
     4399   /N solid solidnombrefaces def 
     4400   0 1 ni 1 sub { 
     4401      /i exch def 
     4402      solid N 1 sub i sub couleurfaceorigine solidputfcolor 
     4403   } for 
     4404   %% puis on ajoute eventuellement la face centrale 
     4405   rmfacecentrale not { 
     4406      solid 
     4407      [0 1 ni 1 sub { 
     4408         /j exch def 
     4409         Sindex j get 
     4410      } for] 
     4411      solidaddface 
     4412      %% en ajustant la couleur de cette derniere 
     4413      solid N 
     4414      currentdict /couleurface known { 
     4415            couleurface  
     4416      } { 
     4417         couleurfaceorigine 
     4418      } ifelse 
     4419      solidputfcolor 
     4420   } if 
     4421end 
     4422} def 
     4423 
     4424%%%%% ### solidtronque ### 
     4425%% syntaxe : solid indicesommet k solidtronque --> solid 
     4426%% syntaxe : solid array k solidtronque --> solid 
     4427%% syntaxe : solid k solidtronque --> solid 
     4428%% k entier > 0, array = tableau des indices des sommets 
     4429/solidtronque { 
     443010 dict begin 
     4431   /coeff exch def 
     4432   dup issolid { 
     4433      dup solidnombresommets /N exch def 
     4434      /table [0 1 N 1 sub {} for] def 
     4435   } { 
     4436      dup isarray { 
     4437         /table exch def 
     4438      } { 
     4439         [ exch ] /table exch def 
     4440      } ifelse 
     4441   } ifelse 
     4442   /solid exch def 
     4443   solid dupsolid /result exch def pop 
     4444   /n solid solidnombrefaces def 
     4445   0 1 table length 1 sub { 
     4446      table exch get /no exch def 
     4447      result no solidgetsommet /sommetvise defpoint3d 
     4448      %% on recup les sommets adjacents au sommet vise 
     4449      /sommetsadj solid no solidsommetsadjsommet def 
     4450      %% on calcule les nouveaux sommets 
     4451      /nouveauxsommets [ 
     4452         0 1 sommetsadj length 1 sub { 
     4453            /i exch def 
     4454            solid sommetsadj i get solidgetsommet 
     4455         } for 
     4456      ] {sommetvise exchp3d coeff ABpoint3d} papply3d def  
     4457      %% on pose G = barycentre de ces points 
     4458      nouveauxsommets isobarycentre3d /G defpoint3d 
     4459      %% il faut ordonner ces sommets 
     4460      nouveauxsommets 0 getp3d /ptref defpoint3d 
     4461      G result no solidgetsommet vecteur3d /vecteurnormal defpoint3d 
     4462      %% on construit le tableau des angles ordonnes par rapport 
     4463      %% a la normale 
     4464      nouveauxsommets duparray exch pop 
     4465      {1 dict begin 
     4466         /M defpoint3d 
     4467         G ptref vecteur3d 
     4468         G M vecteur3d 
     4469         vecteurnormal angle3doriente 
     4470      end} papply3d 
     4471      doublebubblesort pop 
     4472      %% nos sommets sont tries 
     4473      /indicesommetstries exch def 
     4474      %% on rajoute les sommets au solide, et on note les nouveaux indices 
     4475      /nouveauxindices [ 
     4476         0 1 nouveauxsommets length 3 idiv 1 sub { 
     4477            /k exch def 
     4478            result nouveauxsommets k getp3d solidaddsommet 
     4479         } for 
     4480      ] def 
     4481      %% on ajoute la face concernee 
     4482      result [ 
     4483         0 1 indicesommetstries length 1 sub { 
     4484            /k exch def 
     4485         nouveauxindices indicesommetstries k get get 
     4486         } for  
     4487      ] solidaddface 
     4488      result no solidfacesadjsommet /lesfaces exch def 
     4489      %% on examine la face d indice i, et on elimine le 
     4490      %% sommet vise 
     4491      0 1 lesfaces length 1 sub { 
     4492         /i exch def 
     4493         /j lesfaces i get def 
     4494         /F result j solidgetface def  
     4495         result [ 
     4496            0 1 F length 1 sub { 
     4497               /k exch def  
     4498               F k get dup no eq {pop} if 
     4499            } for 
     4500         ] j exch solidputface  
     4501      } for 
     4502   } for 
     4503   table bubblesort reverse {result exch solidrmsommet} apply 
     4504   result 
     4505end 
     4506} def 
     4507 
     4508%%%%% ### dualpolyedre ### 
     4509%% syntaxe : solid dualpolyedreregulier --> solid 
     4510%% syntaxe : solid r dualpolyedreregulier --> solid 
     4511%% si le nombre r est present, projette les nouveaux sommets sur la sphere de centre O , de rayon r 
     4512/dualpolyedreregulier { 
     451320 dict begin 
     4514   dup isnum { 
     4515      /r exch def 
     4516      /projection true def 
     4517   } { 
     4518      /projection false def 
     4519   } ifelse 
     4520   /solid exch def 
     4521   solid dupsolid /result exch def pop 
     4522   /n solid solidnombrefaces def 
     4523   /N solid solidnombresommets def 
     4524   /facesaenlever [] def 
     4525   %% pour chacun des sommets 
     4526   0 1 N 1 sub { 
     4527      %% sommet d indice i 
     4528      /i exch def 
     4529      %% indicesfacesadj = liste des indices des faces ou on trouve le sommet i 
     4530      /indicesfacesadj solid i solidfacesadjsommet def 
     4531      %% on recupere les centres des faces concernees 
     4532      /nouveauxsommets [ 
     4533         0 1 indicesfacesadj length 1 sub { 
     4534            /k exch def  
     4535            solid indicesfacesadj k get solidgetsommetsface isobarycentre3d 
     4536         } for 
     4537      ] def 
     4538      %% et on pose G = barycentre de ces points 
     4539      nouveauxsommets isobarycentre3d /G defpoint3d 
     4540      %% il faut ordonner ces sommets 
     4541      nouveauxsommets 0 getp3d /ptref defpoint3d 
     4542      G solid i solidgetsommet vecteur3d /vecteurnormal defpoint3d 
     4543      nouveauxsommets duparray exch pop 
     4544      {1 dict begin 
     4545         /M defpoint3d 
     4546         G ptref vecteur3d 
     4547         G M vecteur3d 
     4548         vecteurnormal angle3doriente 
     4549      end} papply3d 
     4550      doublebubblesort pop 
     4551      %% nos sommets sont tries 
     4552      /indicesommetstries exch def 
     4553      projection { 
     4554         %% on projette les sommets sur la sphere 
     4555         /nouveauxsommets [ nouveauxsommets {normalize3d r mulv3d} papply3d aload pop ] store 
     4556      } if 
     4557      %% puis on les rajoute au solide 
     4558      /nouveauxindices [ 
     4559         0 1 nouveauxsommets length 3 idiv 1 sub { 
     4560            /k exch def 
     4561            result nouveauxsommets k getp3d solidaddsommet 
     4562         } for 
     4563      ] def 
     4564      %% ainsi que la face concernee 
     4565      result [ 
     4566         0 1 indicesommetstries length 1 sub { 
     4567            /k exch def 
     4568         nouveauxindices indicesommetstries k get get 
     4569         } for  
     4570      ] solidaddface 
     4571      /facesaenlever [ facesaenlever aload pop indicesfacesadj aload pop ] store 
     4572   } for 
     4573   result [0 1 n 1 sub {} for] solidrmfaces 
     4574   [N 1 sub -1 0 {} for] {result exch solidrmsommet} apply 
     4575   result 
     4576end 
     4577} def 
     4578 
     4579%%%%% ### newgeode ### 
     4580%% syntaxe : solid r newgeode --> solid 
     4581%% syntaxe : N r newgeode --> solid 
     4582%% N in {3,4,5} -> polyhedre de depart, r = niveau de recursion 
     4583/newgeode { 
     45842 dict begin 
     4585   /r exch def 
     4586   dup issolid not { 
     4587      /N exch def 
     4588      N 3 eq { 
     4589         1 newtetraedre 
     4590      } { 
     4591         N 4 eq { 
     4592            1 newoctaedre 
     4593         } { 
     4594            1 newicosaedre 
     4595         } ifelse 
     4596      } ifelse 
     4597   } if 
     4598 
     4599   r { 
     4600      15 dict begin    
     4601         /solid exch def 
     4602         solid dupsolid /result exch def pop 
     4603         /n solid solidnombrefaces def 
     4604         n 1 sub -1 0 { 
     4605            /i exch def 
     4606            %% la face d indice i 
     4607            solid i solidgetface /F exch def 
     4608            /i0 F 0 get def 
     4609            /i1 F 1 get def 
     4610            /i2 F 2 get def 
     4611            solid i0 solidgetsommet /A0 defpoint3d 
     4612            solid i1 solidgetsommet /A1 defpoint3d 
     4613            solid i2 solidgetsommet /A2 defpoint3d 
     4614            A0 A1 milieu3d normalize3d /A01 defpoint3d 
     4615            A1 A2 milieu3d normalize3d /A12 defpoint3d 
     4616            A2 A0 milieu3d normalize3d /A20 defpoint3d 
     4617            result A01 solidaddsommet /i01 exch def 
     4618            result A