
Eu desenho esta pirâmide com GeoSpacw. Como desenhar essa figura com TeX?
Onde:
Mé o ponto médio do segmentoSA;
EUé o ponto médio do segmentoSD;
Hé projeto do pontoAna linhaENTÃO;
ABKEé a é um paralelogramo;
A linha que passaSe paralelo à linhaAB.
Responder1
Atualização Geral
Posso sugerir duas respostas, a primeira comtikz-3dplot
interessante porque desenhamos a pirâmide em 3D e podemos facilmente mudar o ponto de vista e a perspectiva; o segundo comtkz-euclide
em 2D com projeção paralela.
Cometi alguns erros nos meus primeiros cálculos, mas há dois problemas para traçar um número correto. O primeiro problema é colocar E e K, o segundo é colocar H. Os métodos dependem das ferramentas utilizadas, 3D ou 2D com projeção paralela.
Como colocar K e E
BK é ortogonal ao plano SCD, ABKE é um paralelogramo, então AE||BK então AE é ortogonal a SCD. AE é perpendicular a SD no plano ASD. Este método é útil com projeção paralela porque ASD é a frente principal e está no plano principal. Podemos usar uma projeção num plano para colocar E.
Em 3D, por exemplo, tikz-3dplot
precisamos calcular a coordenada de E. Chamei \a
o lado do quadrado ABCD.
As coordenadas de E são (0,2*\a/3,sqrt(2)/3*\a)
.
Observação: Se as coordenadas de K são, (xK,yK,zK)
então as coordenadas de E são (0,yK,zK)
. Ou xK = xB, então K é definido por (\a,2*\a/3,sqrt(2)/3*\a)
.
Sobre K. Na primeira resposta, usei o código da resposta do Caramdir (deessa questão). Se você conhece a equação de um plano, é possível determinar a projeção ortognal de um ponto neste plano. Determinei as coordenadas de K, para poder evitar o interessante código do Caramdir.
Observação: SCD tem uma equação simples aqui, sqrt(2)y+z = sqrt(2)\s
é paralelo a (AB) e corta o eixo em S e D. É fácil obter K com o código do caramdir.
Como colocar H
H é a projeção ortogonal de A em OS. OAS é ortogonal ao ABCD. A projeção ortognal de H em ABBCD é um ponto Q na reta OA. Abaixo determinei as coordenadas de Q (2/5 \a,2/5 /a,0)
e depois determinei as coordenadas de H. Não é possível usar a projeção ortogonal de TikZ.
Parte 1) Comtikz-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}
Se você quiser mudar o ponto de vista, você pode tentar \tdplotsetmaincoords{60}{120}
.
Parte B) comtkz-euclide
Se você quiser usar apenas o TikZ, veja a resposta do Gonzalo. O problema é o mesmo, apenas a sintaxe e as macros são diferentes. Mas as respostas são semelhantes. Não é muito fácil mostrar objetos 3D com métodos 2D.
Eu uso a projeção de A em SD para obter E mas também é possível obter as coordenadas. É mais difícil conseguir H, usei aqui o fato 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}
Responder2
Com PSTricks.
\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}
Responder3
Asymptote
versão 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 obter uma pyramid.pdf
execução independente asy -f pdf pyramid.asy
.
Responder4
Aqui está uma versão metapost, infelizmente sem alterar o pacote pronto para uso luamplib
, não consigo desenhar linhas tracejadas, então as substituí por linhas mais claras.
\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}