
Я нарисовал эту пирамиду с помощью GeoSpacw. Как нарисовать эту фигуру с помощью TeX?
Где:
Мявляется средней точкой сегментаСА;
яявляется средней точкой сегментаСД;
ЧАСэто проект точкиАна линииТАК;
АБКЕа — параллелограмм;
Линия, проходящая черезСи параллельно линииАБ.
решение1
Общее обновление
Я могу предложить два ответа, первый сtikz-3dplot
интересно, потому что мы рисуем пирамиду в 3D и можем легко менять точку зрения и перспективу; второй сtkz-euclide
в 2D с параллельной проекцией.
Я допустил некоторые ошибки в своих первых расчетах, но есть две проблемы, чтобы нарисовать правильную фигуру. Первая проблема — разместить E и K, вторая — разместить H. Методы зависят от используемых инструментов, 3D или 2D с параллельной проекцией.
Как разместить K и E
BK ортогонален плоскости SCD, ABKE — параллелограмм, поэтому AE||BK, тогда AE ортогонален SCD. AE перпендикулярен SD в плоскости ASD. Этот метод полезен с параллельной проекцией, поскольку ASD — главный фронт и находится в главной плоскости. Мы можем использовать проекцию в плоскости, чтобы разместить E.
В 3D, например, tikz-3dplot
нам нужно вычислить координату E. Я назвал \a
сторону квадрата ABCD.
Координаты точки E: (0,2*\a/3,sqrt(2)/3*\a)
.
Замечание: Если координаты K равны (xK,yK,zK)
, то координаты E равны (0,yK,zK)
. Или xK=xB, поэтому K определяется как (\a,2*\a/3,sqrt(2)/3*\a)
.
О К. В первом ответе я использовал код из ответа Карамдира (изэтот вопрос). Если вы знаете уравнение плоскости, то можно определить ортогональную проекцию точки на эту плоскость. Я определил координаты K, поэтому я могу избежать интересного кода Caramdir.
Замечание: У SCD есть простое уравнение: sqrt(2)y+z = sqrt(2)\s
оно параллельно (AB) и пересекает оси S и D. Легко получить K с помощью кода caramdir.
Как разместить H
H — проекция, ортогональная A на OS. OAS ортогональна ABCD. Проекция, ортогональная H на ABBCD, — это точка Q на прямой OA. Ниже я определил координаты Q, (2/5 \a,2/5 /a,0)
а затем определил координаты H. Использовать ортогональную проекцию TikZ невозможно.
Часть 1) Сtikz-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}
Если вы хотите изменить точку зрения, вы можете попробовать \tdplotsetmaincoords{60}{120}
.
Часть Б) сtkz-euclide
Если вы хотите использовать только TikZ, см. ответ Гонсало. Проблема та же, только синтаксис и макросы разные. Но ответы похожи. Не очень-то просто показать 3D-объекты с помощью 2D-методов.
Я использую проекцию A на SD, чтобы получить E, но также возможно получить координаты. Получить H сложнее, я использовал здесь факт 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}
решение2
С помощью 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}
решение3
Asymptote
версия 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);
Чтобы получить автономный pyramid.pdf
запуск asy -f pdf pyramid.asy
.
решение4
Вот версия метапоста, к сожалению, без изменения стандартного luamplib
пакета я не могу рисовать пунктирные линии, поэтому я заменил их более тонкими линиями.
\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}