如何用 TeX 绘制这个金字塔?

如何用 TeX 绘制这个金字塔?

我使用 GeoSpacw 绘制了这个金字塔。如何使用 TeX 绘制这个图形?

在此处输入图片描述

在哪里:

  • 是线段的中点南非

  • 是线段的中点标准差

  • H是重点项目A在线上所以

  • 安必克是平行四边形;

  • 穿过的线路年代并平行于线AB

答案1

一般更新

我可以提出两个答案,第一个是tikz-3dplot有趣的是,我们用 3D 绘制金字塔,我们可以轻松地改变视点和视角;第二个tkz-euclide在二维中使用平行投影。

我在第一次计算中犯了一些错误,但要画出正确的图形有两个问题。第一个问题是放置 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 这里有一个简单的方程,sqrt(2)y+z = sqrt(2)\s它平行于(AB)并且与 S 和 D 相交。使用 caramdir 的代码很容易得到 K。

如何放置 H

H 是 A 在 OS 上的正交投影。OAS 与 ABCD 正交。H 在 ABBCD 上的正交投影是直线 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 对象并不容易。

我使用 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

这是一个 metapost 版本,不幸的是,如果不改变开箱即用的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}

相关内容