¿Cómo dibujar esta pirámide con TeX?

¿Cómo dibujar esta pirámide con TeX?

Dibujo esta pirámide con GeoSpacw. ¿Cómo dibujar esta figura con TeX?

ingrese la descripción de la imagen aquí

Dónde:

  • METROes el punto medio del segmentoSA;

  • Ies el punto medio del segmentoDakota del Sur;

  • hes proyecto del puntoAen la líneaENTONCES;

  • ABKEes un paralelogramo;

  • La línea que pasa porSy paralela a la rectaAB.

Respuesta1

Actualización general

Puedo sugerir dos respuestas, la primera contikz-3dplotinteresante porque dibujamos la pirámide en 3D y podemos cambiar fácilmente el punto de vista y la perspectiva; el segundo contkz-euclideen 2D con proyección paralela.

Cometí algunos errores en mis primeros cálculos pero hay dos problemas para dibujar una figura correcta. El primer problema es colocar E y K, el segundo es colocar H. Los métodos dependen de las herramientas utilizadas, 3D o 2D con proyección paralela.

Cómo colocar K y E

BK es ortogonal al plano SCD, ABKE es un paralelogramo, por lo que AE||BK entonces AE es ortogonal a SCD. AE es perpendicular a SD en el plano ASD. Este método es útil con proyección paralela porque ASD es el frente principal y está en el plano principal. Podemos usar una proyección en un plano para colocar E.

En 3D, por ejemplo, tikz-3dplotnecesitamos calcular la coordenada de E. Llamé \aal lado del cuadrado ABCD.

ingrese la descripción de la imagen aquí

Las coordenadas de E son (0,2*\a/3,sqrt(2)/3*\a). Observación: Si las coordenadas de K son (xK,yK,zK)entonces las coordenadas de E son (0,yK,zK). O xK=xB, entonces K está definido por (\a,2*\a/3,sqrt(2)/3*\a).

Acerca de K. En la primera respuesta, utilicé el código de la respuesta de Caramdir (deesta pregunta). Si conoces la ecuación de un plano, es posible determinar la proyección ortogonal de un punto en ese plano. Determiné las coordenadas de K, para poder evitar el interesante código de Caramdir. Observación: SCD tiene una ecuación simple aquí sqrt(2)y+z = sqrt(2)\ses paralela a (AB) y corta el eje en S y D. Es fácil obtener K con el código de caramdir.

Cómo colocar H

H es la proyección ortogonal de A sobre OS. La OEA es ortogonal a ABCD. La proyección ortogonal de H en ABBCD es un punto Q en la recta OA. A continuación determiné las coordenadas de Q (2/5 \a,2/5 /a,0)y luego determiné las coordenadas de H. No es posible utilizar la proyección ortogonal de TikZ.

ingrese la descripción de la imagen aquí

Parte 1) Contikz-3dplot

 \documentclass{article}
 \usepackage{tikz}
 \usepackage{tikz-3dplot}
 \usetikzlibrary{intersections,calc}


 \tikzset{ hidden/.style = {thin, dotted}}
   \tikzset{%
     add/.style args={#1 and #2}{
         to path={%
  ($(\tikztostart)!-#1!(\tikztotarget)$)--($(\tikztotarget)!-#2!(\tikztostart)$)%
   \tikztonodes}}}

 \begin{document}

 %\tdplotsetmaincoords{60}{120}
  \tdplotsetmaincoords{80}{100} 
 \begin{tikzpicture}[tdplot_main_coords,scale=2]
 \pgfmathsetmacro\a{2}

 % definitions 
    \path (0,0,0)                           coordinate (A) 
          (\a,0,0)                          coordinate (B) 
          (\a,\a,0)                         coordinate (C) 
          (0,\a,0)                          coordinate (D) 
          (0,0,{\a*sqrt(2)})                coordinate (S) 
          (0,0,{0.5*\a*sqrt(2)})            coordinate (M) 
          (0.5*\a,0.5*\a,0)                 coordinate (O) 
          (0,0.5*\a,{0.5*\a*sqrt(2)})       coordinate (I) 
          (2/5*\a,2/5*\a,{sqrt(2)/5*\a})    coordinate (H)
          ($(B)!2!(M)$)                     coordinate (N)
          (0,2*\a/3,{sqrt(2)/3*\a})         coordinate (E)
           (\a,2*\a/3,{sqrt(2)/3*\a})        coordinate (K) ;
 % drawing
 \begin{scope}
    \clip (S) -- (B) -- (D) --cycle;
    \draw[hidden] (B) -- (N);
 \end{scope}
 \begin{scope}
    \clip (S) -- (I) -- (N) --cycle;
    \draw (B) -- (N);
 \end{scope}

 \draw[hidden] 
       (A) -- (C)  (A) -- (B)  (A) -- (D) (A) -- (H) (A) -- (S)
      (A) -- (E) (B) -- (D)  (O) -- (S) (I) -- (M);
 \draw (B) -- (K) -- (E)   (C) -- (N) -- (K)
       (B) --(C) -- (D) (S) -- (D)  (S) -- (B)  (S) -- (C);
 \draw[add = 1 and 1]  (S) to (N); 

 % place black circles and labels
 \foreach \point/\position in {A/left,B/left,C/right,D/right,E/right,H/above,
   I/right,K/right,M/right,N/left,O/right,S/left}
 {
   \fill (\point) circle (.5pt);
   \node[\position=3pt] at (\point) {$\point$};
 }

 \end{tikzpicture}
 \end{document}

ingrese la descripción de la imagen aquí

Si quieres cambiar el punto de vista puedes intentarlo \tdplotsetmaincoords{60}{120}.

ingrese la descripción de la imagen aquí

Parte B) contkz-euclide

Si quieres usar solo TikZ, mira la respuesta de Gonzalo. El problema es el mismo, sólo que la sintaxis y las macros son diferentes. Pero las respuestas son similares. No es muy fácil mostrar objetos 3D con métodos 2D.

Utilizo la proyección de A en SD para obtener E pero también es posible obtener las coordenadas. Es más difícil obtener H, utilicé aquí el hecho SO=5*OH.

 \documentclass{article}
 \usepackage{tkz-euclide,amsmath} 
 \usetkzobj{all} 
 \tikzset{hidden/.style = {thin, dotted}}
 \begin{document}

 \begin{tikzpicture}
  \tkzInit[xmin=-5,xmax=10,ymin=-5,ymax=15]
   \tkzClip
  \pgfmathsetmacro\zs{3+5*sqrt(2)}
  % definition
  \tkzDefPoints{0/0/B,1/3/A,5/0/C,6/3/D,1/\zs/S}
  \tkzDefMidPoint(A,C)                      \tkzGetPoint{O}
  \tkzDefMidPoint(S,A)                      \tkzGetPoint{M}
  \tkzDefMidPoint(S,D)                      \tkzGetPoint{I}
  \tkzDefPointBy[projection=onto S--D](A)   \tkzGetPoint{E} 
  \tkzDefPointWith[colinear= at E](A,B)     \tkzGetPoint{K}
  \tkzDefPointWith[linear,K=2](C,I)         \tkzGetPoint{N}
  \tkzDefPointWith[linear,K=1/5](O,S)       \tkzGetPoint{H}
 % drawing 
  \tkzDrawSegments[hidden](A,B A,D I,M A,C B,D S,O M,E A,E A,S  A,H)
  \tkzDrawSegments(B,C C,D B,S S,D B,K K,E C,N K,N)
   \begin{scope}
       \tkzClipPolygon(S,B,D) 
       \tkzDrawSegments[hidden](B,N)
   \end{scope}
   \begin{scope}
      \tkzClipPolygon(S,I,N) 
       \tkzDrawSegments(B,N)
   \end{scope}
   % labels
    \tkzDrawPoints(A,B,C,D,S,I,M,O,E,K,N,H)
    \tkzLabelPoints(A,B,C,D,K,O)
    \tkzLabelPoints[above](S,E,N,H)
    \tkzLabelPoints[above right](I,M)
    \tkzMarkRightAngles(A,E,D D,A,S)
 \end{tikzpicture}
 \end{document}

ingrese la descripción de la imagen aquí

Respuesta2

Con PSTricks.

ingrese la descripción de la imagen aquí

\documentclass[pstricks]{standalone}
\usepackage{pst-eucl}
\psset{linejoin=1}
\begin{document}
\begin{pspicture}[showgrid=false](-.75,-.75)(5.75,9.75)
    \pstGeonode[PosAngle={-135,-45,0,180,180,0}]
        {B}(4,0){C}(5,2){D}(1,2){A}(1,7){S}([nodesep=1.8]{S}D){E}
    \pstMiddleAB{D}{B}{O}
    \pstTranslation[PosAngle=30]{A}{B}{E}[K]
    \pstProjection{O}{S}{A}[H]
    \pstMiddleAB[PosAngle=-45]{S}{A}{M}
    \pstMiddleAB{S}{D}{I}
    \pstInterLL{B}{M}{C}{I}{N}
    \pstInterLL[PointName=none,PointSymbol=none]{D}{S}{B}{N}{X}
    \psline(B)(C)(D)
    \psline(B)(K)(E)
    \psline(B)(S)(D)
    \psline(C)(N)(K)
    \psline(X)(N)
    \pcline[nodesepA=-2,nodesepB=-.5](S)(N)
    \psset{linestyle=dashed}
    \pspolygon(A)(B)(D)
    \pspolygon(A)(C)(D)
    \psline(A)(S)(O)
    \psline(H)(A)(E)
    \psline(M)(I)
    \psline(B)(X)
\end{pspicture}
\end{document}

Respuesta3

ingrese la descripción de la imagen aquí

Asymptoteversión pyramid.asy:

import three;  // 3D module
import math;
currentprojection=orthographic(camera=(55,144,80),
  up=(0,0,1),target=(0,0,0),zoom=1,center=true);

size(300);
size3(300,300,300);

triple intersectionpoint(triple a,triple b,triple c,triple d){
  real u=((d.x-c.x)*a.y+(c.y-d.y)*a.x+c.x*d.y-d.x*c.y)/
      ((d.y-c.y)*b.x+(c.x-d.x)*b.y+(d.x-c.x)*a.y+(c.y-d.y)*a.x);
  return a*(1.0-u)+b*u;
}

triple A,B,C,D,EE,II,H,K,M,NN,O,SS;  // S,E and N has special meaning in asy:
                                    // as South, East and North or (0,-1), (1,0) and (0,1)
                                    // and I is a sqrt(-1)=(0,1)                                    
real a=40;    // side of the square;
real h=50;    // height, h=AS
real d=sqrt(2)/2*a;  // half of the diagonal

O=(0,0,0);
C=(0,d,0);
B=(d,0,0);
A=(0,-d,0);
D=(-d,0,0);
SS=A+(0,0,h);
M=0.5(SS+A);
II=0.5(SS+D);
NN=intersectionpoint(SS,(SS+A-B),C,II);

real phi=atan(h/a);
real u=a*cos(phi)/sqrt(a^2+h^2);
EE=D*(1-u)+SS*u;
K=EE+B-A;

real psi=atan(h/d);
real u=d*cos(psi)/sqrt(d^2+h^2);
H=O*(1-u)+SS*u;

pair Q=intersectionpoint(project(NN--B),project(SS--D));

pen dashed=linetype(new real[] {5,5}); // set up dashed pattern
pen visLine=darkblue+0.8pt;
pen hidLine=lightblue+dashed+0.8pt;

void Dot(...triple[] v){
  dotfactor=8;
  for(int i=0;i<v.length;++i){
    dot(project(v[i]),UnFill);
  }
}

void Draw3(guide3 g, pen p=currentpen){
  draw(project(g),p);
}

void labelP(string s,triple t,pair p=(0,0)){
  label("$"+s+"$",project(t),p);
}

Draw3(B--A--D,hidLine);
Draw3(H--A--SS,hidLine);
Draw3(M--II,hidLine);
Draw3(EE--A--C,hidLine);
Draw3(B--D,hidLine);
Draw3(SS--O,hidLine);

Draw3(SS--B--C--SS--D--C,visLine);
Draw3(SS--NN--C,visLine);
Draw3(EE--K--B,visLine);
Draw3(NN--K,visLine);

draw(project(NN)--Q,visLine);
draw(project(B)--Q,hidLine);

Dot(A,B,C,D,EE,H,II,K,M,NN,O,SS);

labelP("A",A,NW);
labelP("B",B,SW);
labelP("C",C,E);
labelP("D",D,NE);
labelP("E",EE,NE);
labelP("H",H,NE);
labelP("I",II,NE);
labelP("K",K,SE);
labelP("M",M,W);
labelP("N",NN,W);
labelP("O",O,S);
labelP("S",SS,NW);

Para pyramid.pdfejecutarlo de forma independiente asy -f pdf pyramid.asy.

Respuesta4

Aquí hay una versión de metapost, desafortunadamente sin alterar el paquete original luamplib, parece que no puedo dibujar líneas discontinuas, así que las reemplacé con líneas más claras.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
u:=2cm;
path p[];
pair A,B,C,D,E,H,I,K,M,N,O,S,t;
def de = withcolor .85white enddef;

beginfig(1);
k = 2.5u;
p1 = unitsquare slanted .3 xscaled 2u yscaled u;
B = point 0 of p1;
C = point 1 of p1;
D = point 2 of p1;
A = point 3 of p1;
S = A shifted (0,k*length (A--B));
M = .5[A,S];
O = .5[A,C];
N = whatever[B,M]=whatever[S,B shifted (0,k*length (A--B))];
I = (N--C) intersectionpoint (S--D);
H = whatever[S,O] = A + whatever*((S-O) rotated 90);
E = whatever[S,D] = A + whatever*((S-D) rotated 90);
K = E shifted (B-A);
t = (B--N) intersectionpoint (S--D);

draw O--A--S--O--B--A--D--O--C de;
draw A--E de;
draw M--I de;
draw A--H de;
draw B--t de;
draw S--C--B--K--E--S--N--C--D;
draw B--S--D;
draw t--N--K;

dotlabel.llft("B",B);
dotlabel.urt("D",D);
dotlabel.lrt("C",C);
dotlabel.ulft("A",A);
dotlabel.ulft("S",S);
dotlabel.top("N",N);
dotlabel.bot("O",O);
dotlabel.rt("I",I);
dotlabel.ulft("H",H);
dotlabel.urt("E",E);
dotlabel.lrt("K",K);
dotlabel.lrt("M",M);

endfig;
end;

\end{mplibcode}
\end{document}

información relacionada