Changeset 39

Show
Ignore:
Timestamp:
06/07/08 16:08:11 (7 months ago)
Author:
jpv
Message:

Reprise des sections par un plan en séparant les différentes
composantes connexes d'une face de coup

Files:

Legend:

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

    r38 r39  
    11%! 
    22% PostScript prologue for pst-solides3d.tex. 
    3 % Version 3.24, 2008/06/06 
     3% Version 3.25, 2008/06/07 
    44% 
    55%% COPYRIGHT 2008 by Jean-Paul Vignault, Manuel Luque 
     
    15501550} def 
    15511551 
     1552%% cherche si un elt donne appartient au tableau donne 
     1553%% syntaxe : elt array in --> boolean 
     1554/In { 
     15553 dict begin 
     1556   /liste exch def 
     1557   /elt exch def 
     1558   /i 0 def 
     1559   false                        %% la reponse a priori 
     1560   liste length { 
     1561      liste i get elt eq { 
     1562         pop                    %% en enleve la reponse 
     1563         true                 %% pour mettre la bonne 
     1564         exit 
     1565      } if 
     1566      /i i 1 add store 
     1567   } repeat 
     1568end 
     1569} def 
     1570 
    15521571%%%%% ### starfill ### 
    15531572%% la procedure pour les objets "star" 
     
    32673286    
    32683287%      solid i solidgetsommet M eqp3d { 
    3269       solid i solidgetsommet M distance3d 1e-7 le { 
     3288      solid i solidgetsommet M distance3d 1e-5 le { 
    32703289         %% oui => c est fini 
    32713290         /sortie i store 
     
    56875706/solidplansection { 
    5688570710 dict begin 
     5708   dup isbool { 
     5709      /tr@nsmit exch def 
     5710   } { 
     5711      /tr@nsmit false def 
     5712   } ifelse 
    56895713   dup isplan { 
    56905714      plan2eqplan 
     
    56975721   /aenlever [] def 
    56985722   /indnouveauxsommets [] def 
    5699 %(nombre faces) == 
    5700 %solid solidnombrefaces == 
     5723   /nouvellesaretes [] def 
     5724 
     5725   %% pour chaque face d'indice i 
    57015726   0 1 solid solidnombrefaces 1 sub { 
    57025727      /i exch def 
    57035728      /lacouleur solid i solidgetfcolor def 
    5704 %(NOUVELLE FACE) == i == 
    5705       /F solid i solidgetface def %% table des indices 
     5729      /F solid i solidgetface def %% table des indices des sommets 
    57065730      /n F length def %% nb d'aretes 
    57075731      /k1 -1 def 
     
    57145738      0 1 n 1 sub { 
    57155739         /j exch def 
    5716 %(nvell arete) == j == 
     5740         %% arete testee : [j, j+1 mod n] (indices relatifs a la face i) 
    57175741         solid j i solidgetsommetface /A defpoint3d 
    57185742         solid j 1 add n mod i solidgetsommetface /B defpoint3d 
    57195743         %% y a-t-il intersection 
    57205744         A B eqplan segment_inter_plan { 
    5721 %(inter) == 
    5722              dup length 6 eq { 
     5745            %% il y a intersection 
     5746            dup length 6 eq { 
     5747               %% l'intersection, c'est [AB] 
    57235748               /k1 -1 def 
    57245749               /k2 -1 def 
     
    57345759                  indnouveauxsommets aload pop a1 a2 
    57355760               ] store 
     5761               /nouvellesaretes [ 
     5762                  [a1 a2] 
     5763                  nouvellesaretes aload pop 
     5764               ] store 
    57365765               exit %% c est deja scinde 
    57375766            } if 
     5767            %% il y a intersection <> [AB] 
    57385768            k1 0 lt { 
    57395769            %% 1ere intersection de la face 
    5740                /k1 j def 
     5770               /k1 j def %% sommet precedent intersection 1 
    57415771               result exch aload pop solidaddsommet 
    5742                /k1a exch def 
     5772               /k1a exch def %% sommet intersection 1 
    57435773            } { 
    57445774               k2 0 lt { 
    57455775               %% 2eme intersection de la face 
    5746                   /k2 j def 
     5776                  /k2 j def %% sommet precedent intersection 2 
    57475777                  result exch aload pop solidaddsommet 
    5748                   /k2a exch def 
     5778                  /k2a exch def %% sommet intersection 2 
    57495779               } { 
    57505780                  k3 0 lt { 
    57515781                  %% 3eme intersection de la face 
    5752                      /k3 j def 
     5782                     /k3 j def %% sommet precedent intersection 3 
    57535783                     result exch aload pop solidaddsommet 
    5754                      /k3a exch def 
     5784                     /k3a exch def %% sommet intersection 3 
    57555785                  } { 
    57565786                  %% 4eme intersection de la face 
    5757                      /k4 j def 
     5787                     /k4 j def %% sommet precedent intersection 4 
    57585788                     result exch aload pop solidaddsommet 
    5759                      /k4a exch def 
     5789                     /k4a exch def %% sommet intersection 4 
    57605790                  } ifelse 
    57615791               } ifelse 
     
    57635793         } if 
    57645794      } for 
    5765       %% y a-t-il une coupe ? 
     5795       
     5796      %% y a-t-il eu une coupe ? 
     5797      %% si oui, il faut scinder la face d'indice i en cours  
    57665798      k1 0 ge { 
    57675799%% (coupe) == 
     
    57735805            %% 1 pt d'intersection 
    57745806         } { 
    5775          k1a k2a eq k3 0 ge and { 
    5776             %% 2 pts d'intersection 
    5777             /k2a k3a def 
    5778             /k2 k3 def 
    5779          } if 
    5780          k1a k3a eq k4 0 ge and { 
    5781             %% 2 pts d'intersection 
    5782             /k2a k4a def 
    5783             /k2 k4 def 
    5784          } if 
     5807            %% il y a coupe, on cherche a eliminer les 
     5808            %% doublons dans {k1a, k2a, k3a, k4a} 
     5809            k1a k2a eq k3 0 ge and { 
     5810               %% 2 pts d'intersection 
     5811               /k2a k3a def 
     5812               /k2 k3 def 
     5813            } if 
     5814            k1a k3a eq k4 0 ge and { 
     5815               %% 2 pts d'intersection 
     5816               /k2a k4a def 
     5817               /k2 k4 def 
     5818            } if 
     5819            /nouvellesaretes [ 
     5820               [k1a k2a] 
     5821               nouvellesaretes aload pop 
     5822            ] store 
    57855823            [ 
    57865824               k1a F k1 1 add n mod get ne { 
     
    58135851   result aenlever solidrmfaces 
    58145852 
    5815    indnouveauxsommets bubblesort arrayrmdouble 
    5816    /indnouveauxsommets exch def 
    5817    %% maintenant, on ajoute la face de plan de coupe 
    5818    /nouveauxsommets [ 
    5819       0 1 indnouveauxsommets length 1 sub { 
    5820          /i exch def 
    5821          result indnouveauxsommets i get solidgetsommet 
    5822       } for 
    5823    ] def 
    5824  
    5825    0 0 0 eqplan pointeqplan 0 eq { 
    5826       /ptref {0 1 1} def 
    5827    } { 
    5828       /ptref {0 0 0} def 
    5829    } ifelse 
    5830  
    5831    %% restera a traiter le cas limite ou la nouvelle face existe deja 
    5832    %% tester si max(indicestries) < nb sommets avant section 
    5833    nouveauxsommets ptref ordonnepoints3d 
    5834    /indicestries exch def 
    5835    /nvelleface [ 
    5836       0 1 indicestries length 1 sub { 
    5837          /m exch def 
    5838          indnouveauxsommets indicestries m get get 
    5839       } for 
    5840    ] def 
    5841    /F result solidgetfaces def 
    5842    /FC result solidgetfcolors def 
    5843    /IO result solidgetinouttable def 
    5844    IO dup 1 get 1 add 1 exch put 
    5845    result [nvelleface F aload pop] solidputfaces 
    5846    result [lacouleur FC aload pop] solidputfcolors 
    5847    result  
     5853   nouvellesaretes separe_composantes 
     5854   /composantes exch def 
     5855 
     5856   %% pour chacune des composantes 
     5857   0 1 composantes length 1 sub { 
     5858      %% on oriente et on ajoute la face 
     5859      /icomp exch def 
     5860      %indnouveauxsommets bubblesort arrayrmdouble 
     5861      /indnouveauxsommets composantes icomp get def 
     5862      %% maintenant, on ajoute la face de plan de coupe 
     5863      /nouveauxsommets [ 
     5864         0 1 indnouveauxsommets length 1 sub { 
     5865            /i exch def 
     5866            result indnouveauxsommets i get solidgetsommet 
     5867         } for 
     5868      ] def 
     5869    
     5870      0 0 0 eqplan pointeqplan 0 eq { 
     5871         /ptref {0 1 1} def 
     5872      } { 
     5873         /ptref {0 0 0} def 
     5874      } ifelse 
     5875    
     5876      %% restera a traiter le cas limite ou la nouvelle face existe deja 
     5877      %% tester si max(indicestries) < nb sommets avant section 
     5878      nouveauxsommets ptref ordonnepoints3d 
     5879      /indicestries exch def 
     5880      /nvelleface [ 
     5881         0 1 indicestries length 1 sub { 
     5882            /m exch def 
     5883            indnouveauxsommets indicestries m get get 
     5884         } for 
     5885      ] def 
     5886      /F result solidgetfaces def 
     5887      /FC result solidgetfcolors def 
     5888      /IO result solidgetinouttable def 
     5889      IO dup 1 get 1 add 1 exch put 
     5890      result [nvelleface F aload pop] solidputfaces 
     5891      result [lacouleur FC aload pop] solidputfcolors 
     5892   } for 
    58485893   result 
     5894   tr@nsmit { 
     5895      composantes length  
     5896   } if 
    58495897end     
     5898} def 
     5899 
     5900%% syntaxe : elt array compteoccurences 
     5901%% ou array est un tableau du type [ [a1 a2] [b1 b2] [c1 c2] ... ] 
     5902/compteoccurences { 
     59035 dict begin 
     5904   /table exch def 
     5905   /elt exch def 
     5906   /n 0 def 
     5907   0 1 table length 1 sub { 
     5908      /i exch def 
     5909      elt table i get in { 
     5910         pop 
     5911         /n n 1 add store 
     5912      } if 
     5913   } for 
     5914   n 
     5915end 
     5916} def 
     5917 
     5918/separe_composantes { 
     591910 dict begin 
     5920   /result [] def %% les composantes deja faites 
     5921   /table exch def %% ce qui reste a faire 
     5922 
     5923%   (recu) == table {==} apply 
     5924   { 
     5925      /ext1 table 0 get 1 get def 
     5926      /ext0 table 0 get 0 get def 
     5927      /composante [] def 
     5928    
     5929      { %% maintenant on suit les extremites et on epluche une composante 
     5930         /change false def 
     5931         /aenlever [] def 
     5932         0 1 table length 1 sub { 
     5933            /i exch def 
     5934            ext1 table i get In 
     5935            ext0 table i get In or { 
     5936               /aenlever [aenlever aload pop i] store 
     5937               /change true store 
     5938               %% l'arete i contient l'extremite ext0 ou ext1 
     5939               ext0 table i get in { 
     5940                  %% index = 0 ou 1 
     5941                  neg 1 add table i get exch get 
     5942                  /ext0 exch store 
     5943                  ext0 composante In not { 
     5944                     /composante [composante aload pop ext0] store 
     5945                  } if 
     5946                  %% on verifie que ext0 est legitime 
     5947                  ext0 table compteoccurences 2 gt { 
     5948                     /ext0 -1 store 
     5949                  } if 
     5950               } if 
     5951               ext1 table i get in { 
     5952                  %% index = 0 ou 1 
     5953                  neg 1 add table i get exch get 
     5954                  /ext1 exch store 
     5955                  ext1 composante In not { 
     5956                     /composante [composante aload pop ext1] store 
     5957                  } if 
     5958                  %% on verifie que ext1 est legitime 
     5959                  ext1 table compteoccurences 2 gt { 
     5960                     /ext1 -1 store 
     5961                  } if 
     5962               } if 
     5963            } if 
     5964         } for 
     5965         %% il faut reconstruire table 
     5966         /table [ 
     5967            0 1 table length 1 sub { 
     5968               /i exch def 
     5969               i aenlever in { 
     5970                  pop 
     5971               } { 
     5972                  table i get 
     5973               } ifelse 
     5974            } for 
     5975         ] store 
     5976         change not {exit} if 
     5977      } loop 
     5978      %% on vient de finir une composante 
     5979      /result [result aload pop composante] store 
     5980      %% (nouvelle comp) == composante {==} apply 
     5981      table length 0 eq {exit} if 
     5982   } loop 
     5983   result 
     5984%   (renvoie) == result {==} apply 
     5985end 
    58505986} def 
    58515987 
     
    58615997      /eqplan exch def 
    58625998   } ifelse 
    5863    eqplan solidplansection 
     5999   eqplan true solidplansection 
     6000   /nbcomposantes exch def 
    58646001   /solid exch def 
    58656002   /n solid solidnombrefaces def 
    5866    /facecoupe solid 0 solidgetface def 
    5867    /couleurfacecoupe solid 0 solidgetfcolor def 
    5868    solid 0 solidrmface 
    5869    /n n 1 sub store 
     6003 
     6004   /F [] def 
     6005   /FC [] def 
     6006   %% on retire les faces de coupe 
     6007   0 1 nbcomposantes 1 sub { 
     6008      /i exch def 
     6009      /F [F aload pop solid i solidgetface] store 
     6010      /FC [FC aload pop solid i solidgetfcolor] store 
     6011   } for 
     6012   solid [0 1 nbcomposantes 1 sub {} for] solidrmfaces 
     6013   /n n nbcomposantes sub store 
     6014 
     6015   %% on separe les autres faces en 2 parties 
    58706016   /lesneg [] def %% indices des faces "positives" 
    58716017   /lespos [] def %% indices des faces negatives" 
     
    58916037   /result2 exch def 
    58926038   pop 
    5893    %% on rajoute maintenant la face du plan de coupe 
    5894    result1 facecoupe couleurfacecoupe solidaddface 
    5895    %% et on verifie l'orientation 
    5896    result1 dup solidnombrefaces 1 sub solidnormaleface  
    5897    result1 dup solidnombrefaces 1 sub solidcentreface addv3d 
    5898    eqplan pointeqplan 0 gt { 
    5899       %% l'orientation est mauvaise 
    5900       result1 dup solidnombrefaces 1 sub solidrmface  
    5901       result2 facecoupe couleurfacecoupe solidaddface 
    5902       result1 facecoupe reverse couleurfacecoupe solidaddface 
    5903    } { 
    5904       %% l'orientation est ok 
    5905       result2 facecoupe reverse solidaddface 
    5906    } ifelse 
     6039 
     6040   0 1 nbcomposantes 1 sub { 
     6041      /i exch def 
     6042      /facecoupe F i get def 
     6043      /couleurfacecoupe FC i get def 
     6044      /lesfaces1 result1 solidgetfaces def 
     6045      /lescouleurs1 result1 solidgetfcolors def 
     6046      /lesfaces2 result2 solidgetfaces def 
     6047      /lescouleurs2 result2 solidgetfcolors def 
     6048      %% on rajoute maintenant la face du plan de coupe 
     6049%      result1 facecoupe couleurfacecoupe solidaddface 
     6050      result1 [facecoupe lesfaces1 aload pop] solidputfaces 
     6051      result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors 
     6052      %% et on verifie l'orientation 
     6053%      result1 dup solidnombrefaces 1 sub solidnormaleface  
     6054%      result1 dup solidnombrefaces 1 sub solidcentreface addv3d 
     6055      result1 0 solidnormaleface  
     6056      result1 0 solidcentreface addv3d 
     6057      eqplan pointeqplan 0 gt { 
     6058         %% l'orientation est mauvaise 
     6059         result1 0 solidrmface  
     6060         result2 [facecoupe lesfaces2 aload pop] solidputfaces 
     6061         result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors 
     6062         result1 [facecoupe reverse lesfaces1 aload pop] solidputfaces 
     6063         result1 [couleurfacecoupe lescouleurs1 aload pop] solidputfcolors 
     6064      } { 
     6065         %% l'orientation est ok 
     6066         result2 [facecoupe reverse lesfaces2 aload pop] solidputfaces 
     6067         result2 [couleurfacecoupe lescouleurs2 aload pop] solidputfcolors 
     6068      } ifelse 
     6069   } for 
    59076070    
     6071   %% maintenant on enleve les sommets isoles 
    59086072   /sommetspos [] def 
    59096073   /sommetsneg [] def 
     
    82568420      tx@Dict /solidname known { 
    82578421         solidname (1) append cvlit exch def 
    8258          solidname (0) append cvlit exch def 
     8422         dup solidname (0) append cvlit exch def 
    82598423         tx@Dict /solidname undef 
    82608424      } {