Changeset 29

Show
Ignore:
Timestamp:
05/25/08 10:09:46 (8 months ago)
Author:
jpv
Message:

Modif de la section par un plan pour ajouter la face de coupe

Files:

Legend:

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

    r27 r29  
    11%! 
    22% PostScript prologue for pst-solides3d.tex. 
    3 % Version 3.15, 2008/05/18 
     3% Version 3.16, 2008/05/25 
    44% 
    55%% COPYRIGHT 2008 by Jean-Paul Vignault, Manuel Luque 
     
    28522852} def 
    28532853 
     2854%% syntaxe : solid solidfacesreverse -> - 
     2855/solidfacesreverse { 
     28565 dict begin 
     2857   /solid exch def 
     2858   /n solid solidnombrefaces def 
     2859   0 1 n 1 sub { 
     2860      /i exch def 
     2861      /F solid i solidgetface reverse def 
     2862      /m F length def 
     2863      solid i [F aload pop m 0 roll ] solidputface 
     2864   } for 
     2865end 
     2866} def 
     2867 
    28542868/solidputfcolors { 
    28552869   2 exch put 
     
    29152929} def 
    29162930 
    2917 %% %% syntaxe : solid array solidputoutfaces --> - 
    2918 %% /solidputoutfaces { 
    2919 %% 4 dict begin 
    2920 %%    /facesexternes exch def 
    2921 %%    /solid exch def 
    2922 %%    /n1 facesexternes length def 
    2923 %%    /IO solid solidgetinouttable def 
    2924 %%    /facesinternes solid solidgetinfaces def 
    2925 %%    /n2 facesinternes length def 
    2926 %%    solid 
    2927 %%       [facesexternes aload pop facesinternes aload pop] 
    2928 %%       solidputfaces 
    2929 %%    IO 0 0 put 
    2930 %%    IO 1 n1 1 sub put 
    2931 %%    IO 2 n1 put 
    2932 %%    IO 3 n1 n2 add 1 sub put 
    2933 %% end 
    2934 %% } def 
    2935  
    29362931%% syntaxe : solid array solidputoutfaces --> - 
    29372932/solidputoutfaces { 
     
    30113006} def 
    30123007 
    3013 %/solidintersectiontype -1 def 
    3014 %/solidintersectionlinewidth [1 2] def 
    3015 %/solidintersectioncolor [(bleu) (rouge)] def 
    3016 %/solidintersectionplan [[1 0 .5 0] [1 0 .5 -1]] def 
    3017  
    30183008%% /tracelignedeniveau? false def 
    30193009%% /hauteurlignedeniveau 1 def 
     
    30213011%% /linewidthlignedeniveau 4 def 
    30223012 
    3023 /solidgrid true def 
    3024 /aretescachees true def 
    3025 /defaultsolidmode 2 def 
    30263013/solidgridOn { 
    30273014   /solidgrid true def 
     
    33363323      vecteurnormal angle3doriente 
    33373324   end} papply3d 
    3338    [0 1 table length 3 idiv 1 sub {} for] 
    3339    exch doublebubblesort pop 
     3325%   [0 1 table length 3 idiv 1 sub {} for] 
     3326%   exch 
     3327    doublebubblesort pop 
    33403328end 
    33413329} def 
     
    54865474} def 
    54875475 
     5476%% syntaxe : array1 arrayrmdouble --> array2 
     5477%% remplace 2 elts identiques consecutifs par 1 elt 
     5478/arrayrmdouble { 
     54795 dict begin 
     5480   /table exch def 
     5481   /result [table 0 get] def 
     5482   /j 0 def 
     5483   1 1 table length 1 sub { 
     5484      /i exch def 
     5485      table i get 
     5486      result j get 
     5487      eq not { 
     5488         /result [result aload pop table i get] store 
     5489         /j j 1 add store 
     5490      } if 
     5491   } for 
     5492   result 
     5493end 
     5494} def 
     5495 
    54885496%% syntaxe : solid eqplan solidplansection --> solid2 
    54895497/solidplansection { 
     
    54935501   /solid exch def 
    54945502   /aenlever [] def 
     5503   /indnouveauxsommets [] def 
    54955504%(nombre faces) == 
    54965505%solid solidnombrefaces == 
     
    55235532               /k3a -1 def 
    55245533               /k4a -1 def 
     5534               dup 0 getp3d /A defpoint3d 
     5535               1 getp3d /B defpoint3d 
     5536               result A solidaddsommet /a1 exch def 
     5537               result B solidaddsommet /a2 exch def 
     5538               /indnouveauxsommets [ 
     5539                  indnouveauxsommets aload pop a1 a2 
     5540               ] store 
    55255541               exit %% c est deja scinde 
    55265542            } if 
     
    55605576%% k1a == k2a == k3a == k4a == 
    55615577         k1a k2a eq k3 0 lt and { 
     5578            %% 1 pt d'intersection 
    55625579         } { 
    55635580         k1a k2a eq k3 0 ge and { 
     5581            %% 2 pts d'intersection 
    55645582            /k2a k3a def 
    55655583            /k2 k3 def 
    55665584         } if 
    55675585         k1a k3a eq k4 0 ge and { 
     5586            %% 2 pts d'intersection 
    55685587            /k2a k4a def 
    55695588            /k2 k4 def 
     
    55795598            ] 
    55805599            result exch lacouleur solidaddface 
     5600            /indnouveauxsommets [indnouveauxsommets aload pop k1a k2a] store 
    55815601            [ 
    55825602               k2a F k2 1 add n mod get ne { 
     
    55975617   } for 
    55985618   result aenlever solidrmfaces 
     5619 
     5620   indnouveauxsommets bubblesort arrayrmdouble 
     5621   /indnouveauxsommets exch def 
     5622   %% maintenant, on ajoute la face de plan de coupe 
     5623   /nouveauxsommets [ 
     5624      0 1 indnouveauxsommets length 1 sub { 
     5625         /i exch def 
     5626         result indnouveauxsommets i get solidgetsommet 
     5627      } for 
     5628   ] def 
     5629 
     5630   0 0 0 eqplan pointeqplan 0 eq { 
     5631      /ptref {0 1 1} def 
     5632   } { 
     5633      /ptref {0 0 0} def 
     5634   } ifelse 
     5635 
     5636 
     5637   %% restera a traiter le cas limite ou la nouvelle face existe deja 
     5638   %% tester si max(indicestries) < nb sommets avant section 
     5639   nouveauxsommets ptref ordonnepoints3d 
     5640   /indicestries exch def 
     5641   /nvelleface [ 
     5642      0 1 indicestries length 1 sub { 
     5643         /m exch def 
     5644         indnouveauxsommets indicestries m get get 
     5645      } for 
     5646   ] def 
     5647   /F result solidgetfaces def 
     5648   /FC result solidgetfcolors def 
     5649   /IO result solidgetinouttable def 
     5650   IO dup 1 get 1 add 1 exch put 
     5651   result [nvelleface F aload pop] solidputfaces 
     5652   result [lacouleur FC aload pop] solidputfcolors 
    55995653   result  
     5654   result 
    56005655end     
    56015656} def 
     
    56085663   /solid exch def 
    56095664   /n solid solidnombrefaces def 
    5610    /lesneg [] def 
    5611    /lespos [] def 
     5665   /facecoupe solid 0 solidgetface def 
     5666   /couleurfacecoupe solid 0 solidgetfcolor def 
     5667   solid 0 solidrmface 
     5668   /n n 1 sub store 
     5669   /lesneg [] def %% indices des faces "positives" 
     5670   /lespos [] def %% indices des faces negatives" 
    56125671   0 1 n 1 sub { 
    56135672      /i exch def 
     
    56205679            /lesneg [lesneg aload pop i] store 
    56215680         } { 
    5622             /lesneg [lesneg aload pop i] store 
    5623             /lespos [lespos aload pop i] store 
     5681%           /lesneg [lesneg aload pop i] store 
     5682%           /lespos [lespos aload pop i] store 
    56245683         } ifelse 
    56255684      } ifelse 
    56265685   } for 
    56275686   solid 
    5628    dupsolid dup lesneg solidrmfaces  
     5687   dupsolid dup lesneg solidrmfaces 
    56295688   /result1 exch def 
    56305689   dupsolid dup lespos solidrmfaces 
    56315690   /result2 exch def 
    56325691   pop 
     5692   %% on rajoute maintenant la face du plan de coupe 
     5693   result1 facecoupe couleurfacecoupe solidaddface 
     5694   %% et on verifie l'orientation 
     5695   result1 dup solidnombrefaces 1 sub solidnormaleface  
     5696   result1 dup solidnombrefaces 1 sub solidcentreface addv3d 
     5697   eqplan pointeqplan 0 gt { 
     5698      %% l'orientation est mauvaise 
     5699      result1 dup solidnombrefaces 1 sub solidrmface  
     5700      result2 facecoupe couleurfacecoupe solidaddface 
     5701      result1 facecoupe reverse couleurfacecoupe solidaddface 
     5702   } { 
     5703      %% l'orientation est ok 
     5704      result2 facecoupe reverse solidaddface 
     5705   } ifelse 
     5706    
    56335707   /sommetspos [] def 
    56345708   /sommetsneg [] def 
     
    56745748   } for 
    56755749   sommetspos bubblesort reverse {result2 exch solidrmsommet} apply 
    5676  
     5750    
    56775751   result1 result2 
    56785752end 
  • trunk/tests/test_10.tex

    r18 r29  
    2626\psframe(-5,-4)(6,9) 
    2727\codejps{ 
    28 { 
    2928-2 1 2 [5 12] newcylindre 
     29dup (jaune) (vert) inoutputcolors 
    3030[1 1 1 0] solideqplansepare 
    31 } exec 
    32 dup videsolid 
    33 dup (jaune) (vert) inoutputcolors 
     31%dup videsolid 
    3432exch 
    3533{0 0 60 rotateOpoint3d} solidtransform 
    3634{0 2 0 translatepoint3d} solidtransform 
    37 dup videsolid 
    38 dup (jaune) (vert) inoutputcolors 
    39 solidfuz  
     35drawsolid** 
    4036drawsolid** 
    4137}