Saltar al contenido

Dibuja un prisma en TikZ o PSTricks

Nuestro team redactor ha estado mucho tiempo buscando para dar solución a tu búsqueda, te dejamos la respuesta por eso esperamos serte de gran apoyo.

Solución:

Versión 1

Tu defines xy y para ser correcto a y k. No es la forma única y también es posible reducir el código con un macro.

documentclass[]scrartcl
usepackagetikz
usetikzlibrary3d
begindocument

begintikzpicture[x  = (-0.65cm,-0.45cm),
                    y  = (0.65cm,-0.45cm),
                    z  = (0cm,0.8cm),
                    scale = 2] 

beginscope[canvas is zy plane at x=5]
  draw (0,0) coordinate (a1) 
     -- (3,2) coordinate (a2)
     -- (3,4) coordinate (a3)
     -- (2,5) coordinate (a4)
     -- (0,4) coordinate (a5)--cycle ;
endscope 

beginscope[canvas is zy plane at x=0]
  path (0,0) coordinate (b1) 
        (3,2) coordinate (b2)
        (3,4) coordinate (b3)
        (2,5) coordinate (b4)
        (0,4) coordinate (b5);
endscope 


draw (b2)--(b3)--(b4)--(b5); 

foreach i in 2,...,5
draw (ai)--(bi);

draw[dashed] (b5)--(b1)--(b2) (a1)--(b1);
 endtikzpicture   
enddocument 

Versión 2 Cambié el nombre de los nodos. Bi para los vértices de la cara de fondo y Fi para los vértices de la cara frontal. Ahora creé un macro para definir los puntos. Debe dar las coordenadas, el coeficiente y el alfa (l’angle de fuite).

ingrese la descripción de la imagen aquí

El código de la primera imagen es

begintikzpicture[scale=1.6] 
definePrism(0,0),
             (1,0),
             (1,1),
             (0,1)01.530
beginscope[x  = (0cm,1cm),
              y  = (1cm,0),
              z  = (-ordz cm,-absz cm)]   
beginscope[canvas is yz plane at x=0] 
draw[dotted] (0,0) circle (1cm);
draw[<->] (1,0) arc (0:-90:1cm);
draw[dotted,blue] (0,0)--(0,-1);
node[text width=2cm] at (0.5,-2) fuite\ $alpha=30^circ$;      
node[text width=2cm] at (-0.6,0.2) $ -kcos(alpha)$\
$ -ksin(alpha)$;
     endscope 
endscope  
endtikzpicture  

Ahora un ejemplo completo

documentclass[]scrartcl
usepackagetikz
usetikzlibrary3d 

newcommand definePrism[5]
pgfmathsetmacroabsz#4*sin(#5) pgfmathsetmacroordz#4*cos(#5) 
beginscope[x  = (0cm,1cm),
              y  = (1cm,0),
              z  = (-ordz cm,-absz cm)] 
    beginscope[canvas is xy plane at z=#2]
    path foreach coord [count=ni] in #1 coord coordinate (Bni);    
    endscope
    beginscope[canvas is xy plane at z=#3]
     path  foreach coord [count=ni] in #1 coord coordinate (Fni);
    endscope  
endscope  
   
begindocument

begintikzpicture[scale=1] 

definePrism(0,0),
             (3,2),
             (3,4),
             (2,5),
             (0,2)08.745 

draw (F1) foreach i in 2,...,5 --(Fi) -- cycle;  
draw (B2)--(B3)--(B4); 
draw[dashed] (B4)--(B5)--(B1)--(B2);

draw          (F2)--(B2)
               (F3)--(B3)
               (F4)--(B4);
draw[dashed]  (F1)--(B1) 
               (F5)--(B5);  
 endtikzpicture   
enddocument

ingrese la descripción de la imagen aquí

versión 2 con macro definePrism

 definePrism[options]list 1list 2  
  options angle (default=45) coeff (default=.5) zB (default=0) zF (default=2)
  list 1 (x1,y1),(x2,y2),...,(xn,yn)
  list 2  s1,s2,...,sn with sn = 0 or 1---> 0 if  Bn is hidden
  coordinates defined : B1,B2,...,Bn and F1,F2,...,Fn

El único problema: cómo determinar s1, s2, …, sn automáticamente. Conozco algunos algoritmos pero demasiado complicados con TeX

documentclass[]scrartcl
usepackagetikz
usetikzlibrary3d 

pgfkeys
/definePrism/.cd,
angle/.code                = defdpangle#1,
coeff/.code                = defdpcoeff#1,
zB/.code                    = defzB#1,
zF/.code                    = defzF#1, 
makeatletter
defdefinePrism[email protected][[email protected][email protected][]
def[email protected][#1]#2#3%
begingroup
pgfkeys/definePrism/.cd, angle=45,coeff=.5,zB=0,zF=2
pgfqkeys/definePrism#1 
pgfmathsetmacroabszdpcoeff*sin(dpangle) 
pgfmathsetmacroordzdpcoeff*cos(dpangle) 
beginscope[x  = (0cm,1cm),
              y  = (1cm,0),
              z  = (-ordz cm,-absz cm)] 
  beginscope[canvas is xy plane at z=zB]
    path foreach coord [count=ni] in #2 %
                   coord   coordinate  (Bni)
                   ;
  endscope
  beginscope[canvas is xy plane at z=zF]
    path  foreach coord [count=ni] in #2 %
                    coord coordinate (Fni)
                    ;
   endscope  
endscope 

foreach k [count=ni] in #3 %
            globalletnbni
            globalletlastik    
draw (F1) foreach i in 2,...,nb --(Fi) -- cycle; 

foreach i  [count=ni,count=si from nb] in #3 
    ifnum ni > nb pgfmathtruncatemacroni1 fi   
    ifnum si > nb pgfmathtruncatemacrosi1 fi   
    ifnum i  = 0 
       draw[dashed] (Bsi)--(Bni)--(Fni); 
    else
        draw (Fni)--(Bni);
        ifnum lasti=1 
               draw (Bsi)--(Bni); 
        else 
               draw[dashed] (Bsi)--(Bni);
        fi 
    fi
    globalletlastii
    %    
endgroup  
begindocument

begintikzpicture[scale=1] 
definePrism[angle=30,zF=8](0,0),(4,1),(3,4),(2,3),(0,2)0,1,1,1,1  
endtikzpicture  
begintikzpicture[scale=1] 
definePrism[angle=30](0,0),(0,2),(2,2),(2,0)0,1,1,1  
endtikzpicture
enddocument 

ingrese la descripción de la imagen aquí

base contiene la lista de coordenadas del polígono x / y y axe define el vector de dirección “xyz” del prisma, que es por defecto axe=0 0 1

documentclassarticle
usepackagepst-solides3d
begindocument

pssetunit=0.5,lightsrc=10 5 50,viewpoint=50 20 30 rtp2xyz,Decran=50 
beginpspicture*(-6,-4)(6,9)               
psframe(-6,-4)(6,9)          
psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!30]
psSolid[object=prisme,h=6,fillcolor=blue!10,
         base=0 1 -1 0 0 -2 1 -1 0 0]
 axesIIID(4,4,6)(4.5,4.5,8)
endpspicture*
%
beginpspicture*(-6,-4)(6,9)
psframe(-6,-4)(6,9)
psSolid[object=grille,base=-4 4 -4 4,fillcolor=red!30]
psSolid[object=prisme,fillcolor=blue!10,
         axe=0 1 2,h=8,base=0 -2 1 -1 0 0 0 1 -1 0]
psPoint(0,4.2,8.4)V
psline[linecolor=blue,arrowscale=2]->(0,0)(V)
axesIIID(4,4,4)(4.5,4.5,8)
endpspicture*

enddocument

ingrese la descripción de la imagen aquí

Cajas simples con pst-3dplot

documentclassarticle
usepackagepst-3dplot
begindocument   
pssetcoorType=1,Alpha=135
beginpspicture(-1,-2)(5,2.25)
%pstThreeDCoor[xMin=-1,xMax=4,yMin=-1,yMax=4,zMin=-1,zMax=4]
pstThreeDBox[hiddenLine=false](0,0,0)(0,0,3)(3,0,0)(0,3,0)
endpspicture
%
pssetcoorType=2
beginpspicture(-3,-2)(2,2.25)
%pstThreeDCoor[xMin=-1,xMax=4,yMin=-1,yMax=4,zMin=-1,zMax=4]
pstThreeDBox[hiddenLine](0,0,0)(0,0,3)(3,0,0)(0,3,0)
endpspicture

enddocument

ingrese la descripción de la imagen aquí

documentclassarticle
usepackagepst-3dplot
begindocument

pssetcoorType=2
beginpspicture(-2,-2.25)(2,5)
pstThreeDCoor[xMin=-2,xMax=2,yMin=-2,yMax=5,zMin=-2,zMax=6]
pstThreeDLine(0,0,0)(0,3,0)(-2,0,0)(0,-3,0)(1,-3,0)(0,0,0)
pstThreeDLine(1,2,5)(1,5,5)(-1,2,5)(1,-1,5)(2,-1,5)(1,2,5)
pstThreeDLine(0,0,0)(1,2,5)
pstThreeDLine(0,3,0)(1,5,5)
pstThreeDLine[linestyle=dashed](-2,0,0)(-1,2,5)
pstThreeDLine[linestyle=dashed](0,-3,0)(1,-1,5)
pstThreeDLine(1,-3,0)(2,-1,5)
endpspicture

enddocument

ingrese la descripción de la imagen aquí

y una solución automática que necesita lo último pst-3dplot.tex de http://texnik.dante.de/tex/generic/pst-3dplot/. La macro psThreeDPrism Me trasladaré más tarde a CTAN y también muy después me daré cuenta de las líneas ocultas. move=x y es el vector de traslación para el polígono superior

documentclassarticle
usepackagepst-3dplot
begindocument

pssetcoorType=2
beginpspicture(-3,-2)(2,5)
pstThreeDCoor[xMin=-2,xMax=2,yMin=-2,yMax=5,zMin=-2,zMax=7]
pstThreeDPrism[height=6,move=1 2](0,0,0)(0.5,3,0)(-2,0,0)(0,-3,0)(1,-3,0)(0,0,0)
endpspicture

enddocument

ingrese la descripción de la imagen aquí

Reseñas y calificaciones del artículo

No se te olvide dar difusión a este post si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *