このピラミッドをTeXで描くにはどうすればいいでしょうか?

このピラミッドをTeXで描くにはどうすればいいでしょうか?

このピラミッドを GeoSpacw で描きました。この図を TeX で描くにはどうすればよいでしょうか?

ここに画像の説明を入力してください

どこ:

  • セグメントの中点である南アフリカ;

  • セグメントの中点であるSD;

  • Hポイントのプロジェクトですライン上でそれで;

  • アブケは平行四辺形です。

  • 通過する線そして線に平行AB

答え1

全般的な更新

私は2つの答えを提案できます。1つ目はtikz-3dplotピラミッドを3Dで描くと視点や遠近感を簡単に変えることができるので面白いです。tkz-euclide平行投影による 2D で。

最初の計算ではいくつかミスをしましたが、正しい図を描くには 2 つの問題があります。最初の問題は E と K を配置すること、2 番目の問題は H を配置することです。方法は、使用するツール (3D または平行投影の 2D) によって異なります。

KとEの配置方法

BK は平面 SCD に直交し、ABKE は平行四辺形なので、AE||BK であれば AE は SCD に直交します。AE は平面 ASD で SD に垂直です。この方法は、ASD がメインの前面でありメイン平面内にあるため、平行投影で役立ちます。平面への投影を使用して E を配置できます。

たとえば 3D では、 tikz-3dplotE の座標を計算する必要があります。\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 は、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 を取得するために、A を SD に投影しますが、座標を取得することも可能です。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}

関連情報