
저는 GeoSpacw를 사용하여 이 피라미드를 그립니다. TeX으로 이 그림을 그리는 방법은 무엇입니까?
어디:
중세그먼트의 중간 지점입니다.SA;
나세그먼트의 중간 지점입니다.SD;
시간포인트의 프로젝트입니다ㅏ온라인에서그래서;
아브케a는 평행사변형이고;
통과하는 선에스그리고 선과 평행하게AB.
답변1
일반 업데이트
저는 두 가지 답변을 제안할 수 있습니다. 첫 번째 답변은 다음과 같습니다.tikz-3dplot
우리는 피라미드를 3D로 그리고 관점과 관점을 쉽게 변경할 수 있기 때문에 흥미로웠습니다. 두 번째는tkz-euclide
평행 투영을 사용하여 2D로.
첫 번째 계산에서 몇 가지 실수를 했지만 올바른 수치를 그리는 데에는 두 가지 문제가 있습니다. 첫 번째 문제는 E와 K를 배치하는 것이고, 두 번째 문제는 H를 배치하는 것입니다. 방법은 사용되는 도구(3D 또는 평행 투영을 사용하는 2D)에 따라 다릅니다.
K와 E를 배치하는 방법
BK는 평면 SCD에 직교하고 ABKE는 평행사변형이므로 AE||BK, AE는 SCD에 직교합니다. AE는 평면 ASD에서 SD에 수직입니다. 이 방법은 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의 답변 코드를 사용했습니다.이 질문). 평면의 방정식을 안다면 이 평면 위의 점의 직교 투영을 결정하는 것이 가능합니다. K의 좌표를 결정했기 때문에 Caramdir의 흥미로운 코드를 피할 수 있습니다.
주목: SCD는 여기서 (AB)에 평행하고 S와 D에서 축을 절단하는 간단한 방정식을 가지고 있습니다 sqrt(2)y+z = sqrt(2)\s
. caramdir의 코드로 K를 얻는 것은 쉽습니다.
H를 배치하는 방법
H는 OS에서 A의 직교 투영입니다. OAS는 ABCD와 직교합니다. ABBCD에서 H의 직교 투영은 선 OA 위의 점 Q입니다. 아래에서는 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}
.
파트 B)tkz-euclide
TikZ만 사용하려면 Gonzalo의 답변을 참조하세요. 문제는 동일하며 구문과 매크로만 다릅니다. 그러나 대답은 비슷합니다. 2D 방법으로 3D 개체를 표시하는 것은 그리 쉽지 않습니다.
E를 얻기 위해 SD에서 A의 투영을 사용하지만 좌표를 얻는 것도 가능합니다. 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}