Changeset 26

Show
Ignore:
Timestamp:
05/15/08 00:13:52 (8 months ago)
Author:
jpv
Message:

Ajout du chanfreinage

Files:

Legend:

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

    r25 r26  
    32503250} def 
    32513251 
     3252%%%%% ### ordonnepoints3d ### 
     3253%% syntaxe : array1 M ordonnepoints3d --> array2 
     3254%% array1 = tableau de points 3d coplanaires (plan P) 
     3255%% M = point3d indiquant la direction de la normale a P 
     3256%% array2 = les indices des points de depart, ranges dans le  
     3257%% sens trigo par rapport a la normale 
     3258/ordonnepoints3d { 
     32595 dict begin 
     3260   /M defpoint3d 
     3261   /table exch def 
     3262   table isobarycentre3d /G defpoint3d 
     3263   %% calcul de la normale 
     3264   table 0 getp3d /ptref defpoint3d 
     3265   table 1 getp3d /A defpoint3d 
     3266   G ptref vecteur3d 
     3267   G A vecteur3d 
     3268   vectprod3d /vecteurnormal defpoint3d 
     3269   vecteurnormal G M vecteur3d scalprod3d 0 lt { 
     3270      vecteurnormal -1 mulv3d /vecteurnormal defpoint3d 
     3271   } if 
     3272   %% la table des angles 
     3273   table duparray exch pop 
     3274   {1 dict begin 
     3275      /M defpoint3d 
     3276      G ptref vecteur3d 
     3277      G M vecteur3d 
     3278      vecteurnormal angle3doriente 
     3279   end} papply3d 
     3280   [0 1 table length 3 idiv 1 sub {} for] 
     3281   exch doublebubblesort pop 
     3282end 
     3283} def 
     3284 
    32523285%%%%% ### fin insertion ### 
    32533286 
     
    50125045%%%%     operations sur des solides particuliers        %%%% 
    50135046%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
     5047 
     5048%%%%% ### solidchanfreine ### 
     5049%% syntaxe : solid coeff i s@lidaffineface 
     5050/solidchanfreine { 
     505110 dict begin 
     5052   /coeff exch def 
     5053   /solid exch def 
     5054   /result newsolid def 
     5055   solid issolid not { 
     5056      (Erreur : mauvais type d argument dans solidchanfreine) == 
     5057      quit 
     5058   } if 
     5059   /n solid solidnombresommets def 
     5060   /nf solid solidnombrefaces def 
     5061 
     5062   %% ajout des faces reduites 
     5063   0 1 nf 1 sub { 
     5064      /i exch def 
     5065      /Fsommets solid i solidgetsommetsface def 
     5066      /Findex solid i solidgetface def 
     5067      /ns Fsommets length 3 idiv def 
     5068      /couleurfaceorigine solid i solidgetfcolor def 
     5069      Fsommets isobarycentre3d /G defpoint3d 
     5070      %% on ajoute les nouveaux sommets 
     5071      /Sindex [] def 
     5072      0 1 ns 1 sub { 
     5073         /j exch def 
     5074         /Sindex [ Sindex aload pop 
     5075            Fsommets j getp3d /M defpoint3d 
     5076            result M G coeff hompoint3d solidaddsommet 
     5077         ] store 
     5078      } for 
     5079      %% Sindex contient les indices des nouveaux sommets 
     5080      result Sindex couleurfaceorigine solidaddface 
     5081   } for 
     5082 
     5083   %% ajout des faces rectangulaires entre faces d'origines adjacentes 
     5084   %% pour chaque face de depart 
     5085   0 1 nf 2 sub { 
     5086      /i exch def 
     5087      /F solid i solidgetface def 
     5088      /couleurfaceorigine solid i solidgetfcolor def 
     5089      /Fres result i solidgetface def 
     5090      %% pour chaque arete de la face 
     5091      0 1 F length 1 sub { 
     5092         /j exch def 
     5093         /trouve false def 
     5094         /indice1 F j get def 
     5095         /indice2 F j 1 add F length mod get def 
     5096         /a1 j def 
     5097         /a2 j 1  add F length mod def 
     5098         %% on regarde toutes les autres faces 
     5099         i 1 add 1 nf 1 sub { 
     5100            /k exch def 
     5101            /Ftest solid k solidgetface def 
     5102            indice1 Ftest in {pop true} {false} ifelse 
     5103            indice2 Ftest in {pop true} {false} ifelse 
     5104            and { 
     5105               /indiceFadj k def 
     5106               indice1 Ftest in pop /k1 exch def 
     5107               indice2 Ftest in pop /k2 exch def 
     5108               /trouve true def 
     5109            exit 
     5110            } if 
     5111         } for 
     5112         trouve { 
     5113            /Fadj solid indiceFadj solidgetface def 
     5114            result [ 
     5115               Fres a1 get 
     5116               result indiceFadj solidgetface k1 get 
     5117               result indiceFadj solidgetface k2 get 
     5118               Fres a2 get 
     5119            ] couleurfaceorigine solidaddface 
     5120         } if 
     5121      } for 
     5122   } for 
     5123 
     5124   %% pour chaque face 
     5125   0 1 nf 2 sub { 
     5126      /i exch def 
     5127      /F solid i solidgetface def 
     5128      /couleurfaceorigine solid i solidgetfcolor def 
     5129      %% et pour chaque sommet de cette face 
     5130      0 1 F length 1 sub { 
     5131         /j exch def 
     5132         /k F j get def 
     5133         solid k solidfacesadjsommet /adj exch def 
     5134         %% adj est le tableau des indices des faces adjacentes 
     5135         %% au sommet d'indice k 
     5136         %% rque : toutes les faces d'indice strict inferieur a i 
     5137         %% sont deja traitees 
     5138         %% Pour chaque face adjacente, on repere l'indice du sommet concerne dans 
     5139         %% la face 
     5140         adj min i lt not { 
     5141            /indadj [] def 
     5142            0 1 adj length 1 sub { 
     5143               /m exch def 
     5144               k solid adj m get solidgetface in { 
     5145                  /ok exch def 
     5146                  /indadj [indadj aload pop ok] store 
     5147               } if 
     5148            } for 
     5149          
     5150            /aajouter [ 
     5151               0 1 adj length 1 sub { 
     5152                  /m exch def 
     5153                  result adj m get solidgetface indadj m get get 
     5154               } for 
     5155            ] def 
     5156 
     5157            %% la table des sommets 
     5158            [0 1 aajouter length 1 sub { 
     5159               /m exch def 
     5160               result aajouter m get solidgetsommet 
     5161            } for] 
     5162            solid k solidgetsommet %% le point indiquant la direction de la normale 
     5163            ordonnepoints3d 
     5164            /indicestries exch def 
     5165 
     5166            result [ 
     5167               0 1 indicestries length 1 sub { 
     5168                  /m exch def 
     5169                  aajouter indicestries m get get 
     5170               } for 
     5171            ] couleurfaceorigine solidaddface 
     5172         } if 
     5173      } for 
     5174   } for 
     5175 
     5176   result 
     5177end 
     5178} def 
    50145179 
    50155180%%%%% ### solidplansection ### 
     
    71827347      /y exch def 
    71837348      /x exch def 
    7184       lefichier x chaine cvs writestring 
     7349      lefichier z chaine cvs writestring 
    71857350      lefichier 32 write %% espace 
    71867351      lefichier y chaine cvs writestring 
    71877352      lefichier 32 write %% espace 
    7188       lefichier z chaine cvs writestring 
     7353      lefichier x chaine cvs writestring 
    71897354      lefichier 10 write %% CR 
    71907355   } for 
     
    72487413   [ns { 
    72497414      offfile str readline pop numstr2array aload pop 
     7415      3 1 roll 
    72507416   } repeat] 
    72517417   /S exch def 
     
    72567422      1 1 table length 1 sub { 
    72577423         /i exch def 
    7258         table i get 
     7424        table i get 
    72597425      } for 
    72607426      ]