| | 2742 | end |
|---|
| | 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 { |
|---|
| | 2779 | 1 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 | ] |
|---|
| | 2789 | end |
|---|
| | 2790 | } def |
|---|
| | 2791 | |
|---|
| | 2792 | %% syntaxe : solid index table solidputface -> - |
|---|
| | 2793 | /solidputface { |
|---|
| | 2794 | 1 dict begin |
|---|
| | 2795 | /table exch def |
|---|
| | 2796 | /i exch def |
|---|
| | 2797 | solidgetfaces i table put |
|---|
| | 2798 | end |
|---|
| | 2799 | } def |
|---|
| | 2800 | |
|---|
| | 2801 | %% syntaxe : solid table solidaddface -> - |
|---|
| | 2802 | %% on ne se preoccupe pas des faces internes |
|---|
| | 2803 | /solidaddface { |
|---|
| | 2804 | 1 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 |
|---|
| | 2817 | end |
|---|
| | 2818 | } def |
|---|
| | 2819 | |
|---|
| | 2820 | /solidnombrefaces { |
|---|
| | 2821 | 1 dict begin |
|---|
| | 2822 | /solid exch def |
|---|
| | 2823 | solid solidnombreinfaces |
|---|
| | 2824 | solid solidnombreoutfaces |
|---|
| | 2825 | add |
|---|
| | 2826 | end |
|---|
| | 2827 | } def |
|---|
| | 2828 | |
|---|
| | 2829 | %% syntaxe : solid M solidaddsommetexterne -> - |
|---|
| | 2830 | %% on ajoute le sommet sans se preoccuper de rien |
|---|
| | 2831 | /solidaddsommetexterne { |
|---|
| | 2832 | 2 dict begin |
|---|
| | 2833 | /M defpoint3d |
|---|
| | 2834 | /solid exch def |
|---|
| | 2835 | solid |
|---|
| | 2836 | [ solid solidgetsommets aload pop M ] |
|---|
| | 2837 | solidputsommets |
|---|
| | 2838 | end |
|---|
| | 2839 | } def |
|---|
| | 2840 | |
|---|
| | 2841 | %% syntaxe : solid array solidaddsommets -> - |
|---|
| | 2842 | /solidaddsommets { |
|---|
| | 2843 | 2 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 |
|---|
| | 2851 | end |
|---|
| | 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 { |
|---|
| | 2860 | 10 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 |
|---|
| | 2918 | end |
|---|
| | 2919 | } def |
|---|
| | 2920 | |
|---|
| | 2921 | %%%%% ### solidrmsommet ### |
|---|
| | 2922 | %% syntaxe : solid i solidrmsommet -> - |
|---|
| | 2923 | /solidrmsommet { |
|---|
| | 2924 | 5 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 |
|---|
| | 2964 | end |
|---|
| | 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 { |
|---|
| | 2972 | 6 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 |
|---|
| | 3006 | end |
|---|
| | 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 { |
|---|
| | 3014 | 6 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 |
|---|
| 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 { |
|---|
| | 4243 | 20 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 |
|---|
| | 4306 | end |
|---|
| | 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 { |
|---|
| | 4316 | 10 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 |
|---|
| | 4348 | end |
|---|
| | 4349 | } def |
|---|
| | 4350 | |
|---|
| | 4351 | %% syntaxe : solid coeff i s@lidchampfreineface |
|---|
| | 4352 | /s@lidchampfreineface { |
|---|
| | 4353 | 10 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 |
|---|
| 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 |
|---|
| | 4421 | end |
|---|
| | 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 { |
|---|
| | 4430 | 10 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 |
|---|
| | 4505 | end |
|---|
| | 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 { |
|---|
| | 4513 | 20 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 |
|---|
| | 4576 | end |
|---|
| | 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 { |
|---|
| | 4584 | 2 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 |
|---|