원점을 향한 선분이 있는 3D 축 및 다면체

원점을 향한 선분이 있는 3D 축 및 다면체

3D 축과 볼록한 다면체 또는 그 이상을 포함하는 3D 플롯을 만들고 싶습니다. 십이 면체

스크린샷

상단에 있는 경계 가장자리 지점 중 하나에 주석이 달린 양수 \hat{x}측면(예: "선택" 또는 "선택")을 표시하고 해당 레이블이 지정된 지점에서 원점을 향해 선분을 그립니다. 그런 다음 이 선분이 정십이면체의 볼록 껍질과 교차하는 위치를 강조 표시하고 주석을 답니다. TikZ를 사용하면 악몽이 될까요?

그런데 TikZ를 완전히 배우는 가장 좋은 방법은 무엇인가요? 좋은 책 있어요? 나는 항상 어떤 식으로든 TikZ를 소비하게 됩니다 :(

업데이트: 실제로 문서화해야 하는 알고리즘의 동작을 자세히 설명하려면 동일한 아이디어에 대한 여러 플롯이 필요합니다. 이 사건이 어떻게 진행되는지 확인함으로써 일반화하고 다른 사건을 스스로 수행할 수 있기를 바랍니다. TikZ가 얼마나 어려운지 알면서도 ... :(

답변1

\documentclass{article}
\usepackage[dvipsnames]{pstricks}
\usepackage{pst-solides3d}
\begin{document}

\begin{pspicture}[solidmemory,fontsize=20](-4,-4)(4,4)
\psset{Decran=30,viewpoint=20 40 30 rtp2xyz, lightsrc=viewpoint}
\psSolid[object=dodecahedron,a=2.5,action=draw*,name=my_dodecahedron,
         fillcolor=green!50!white]
\psSolid[object=point,definition=solidgetsommet,
  args=my_dodecahedron 0,linecolor=blue,text=A,pos=uc,name=A]
\psSolid[object=point,definition=solidgetsommet,
  args=my_dodecahedron 4,linecolor=blue,text=B,pos=uc,name=B]
\psSolid[object=line,args=A B,linecolor=blue]
\psSolid[object=vecteur,args=A,linecolor=blue]
\psSolid[object=vecteur,args=B,linecolor=blue]
\axesIIID(2.5,2.5,2.5)(3.5,3,3)
\end{pspicture}
%
\begin{pspicture}[solidmemory,fontsize=20](-4,-4)(4,4)
\psset{Decran=30,viewpoint=20 40 35 rtp2xyz, lightsrc=viewpoint}
\psSolid[object=dodecahedron,a=2.5,action=draw*,RotX=22.5,RotY=22.5,
  fillcolor=red!50!white,name=my_dodecahedron,action=draw**,
%  numfaces=all,num=all,
]
\psSolid[object=point,definition=solidcentreface,
   args=my_dodecahedron 2,linecolor=white,text=Centre face 2,pos=uc]
\psSolid[object=point,definition=solidgetsommet,
  args=my_dodecahedron 0,linecolor=white,text=A,pos=cl,name=A]
\psSolid[object=point,definition=solidgetsommet,
  args=my_dodecahedron 4,linecolor=white,text=B,pos=cl,name=B]
\psSolid[object=line,args=A B,linecolor=white]
\end{pspicture}

\end{document}

여기에 이미지 설명을 입력하세요

답변2

여기TikZ시작점, 모든 꼭지점, 가장자리 및 면은 독립적으로 정의되므로 이를 추가 마법에 사용할 수 있습니다.

암호

\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}

\begin{document}

% golden ratio and inverse golden ratio
\pgfmathsetmacro{\gr}{(1+sqrt(5))/2}
\pgfmathsetmacro{\igr}{2/(1+sqrt(5))}

%choose axis angles
\newcommand{\xangle}{0}
\newcommand{\yangle}{90}
\newcommand{\zangle}{225}

%choose axis lengths
\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{0.5}

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
    y={(\yx cm,\yy cm)},
    z={(\zx cm,\zy cm)},
    scale=2,
    every path/.style={thick}
]

% coordinates of the vertices (see wikipedia page)
    % vertices of inscribed cube
    \coordinate (pd1) at (-1,-1,-1);
    \coordinate (pd2) at (-1,-1,1);
    \coordinate (pd3) at (-1,1,-1);
    \coordinate (pd4) at (-1,1,1);
    \coordinate (pd5) at (1,-1,-1);
    \coordinate (pd6) at (1,-1,1);
    \coordinate (pd7) at (1,1,-1);
    \coordinate (pd8) at (1,1,1);
    % "front/back" "outside of cube" points
    \coordinate (pd9) at (0,-\igr,-\gr);
    \coordinate (pd10) at (0,-\igr,\gr);
    \coordinate (pd11) at (0,\igr,-\gr);
    \coordinate (pd12) at (0,\igr,\gr);
    % "top/bottom" "outside of cube" points
    \coordinate (pd13) at (-\igr,-\gr,0);
    \coordinate (pd14) at (-\igr,\gr,0);
    \coordinate (pd15) at (\igr,-\gr,0);
    \coordinate (pd16) at (\igr,\gr,0);
    % "left/right" "outside of cube" points
    \coordinate (pd17) at (-\gr,0,-\igr);
    \coordinate (pd18) at (-\gr,0,\igr);
    \coordinate (pd19) at (\gr,0,-\igr);
    \coordinate (pd20) at (\gr,0,\igr);

% black background rectangle for contrast (better option: backgrounds library)  
    \fill (-2.2,-2) rectangle (2.2,2);

% mark vertices 
    \foreach \x in {1,...,20}
    {   \fill[white] (pd\x) circle (0.03) node[above right] {\tiny\x};
    }

% draw inscribed cube
\draw[gray, densely dotted] (pd8) -- (pd7) -- (pd3) -- (pd4) -- cycle;
\draw[gray, densely dotted] (pd8) -- (pd6) -- (pd5) -- (pd7) -- cycle;
\draw[gray, densely dotted] (pd5) -- (pd6) -- (pd2) -- (pd1) -- cycle;
\draw[gray, densely dotted] (pd1) -- (pd2) -- (pd4) -- (pd3) -- cycle;

% faces; "back" ones gray, "front" ones red
    \fill[gray,fill opacity=0.2] (pd11) -- (pd9) -- (pd5) -- (pd19) -- (pd7) -- cycle;
    \fill[gray,fill opacity=0.2] (pd11) -- (pd9) -- (pd1) -- (pd17) -- (pd3) -- cycle;
    \fill[gray,fill opacity=0.2] (pd11) -- (pd7) -- (pd16) -- (pd14) -- (pd3) -- cycle;
    \fill[gray,fill opacity=0.2] (pd3) -- (pd14) -- (pd4) -- (pd18) -- (pd17) -- cycle;
    \fill[gray,fill opacity=0.2] (pd1) -- (pd9) -- (pd5) -- (pd15) -- (pd13) -- cycle;
    \fill[gray,fill opacity=0.2] (pd1) -- (pd13) -- (pd2) -- (pd18) -- (pd17) -- cycle;
    \fill[red,fill opacity=0.2] (pd14) -- (pd16) -- (pd8) -- (pd12) -- (pd4) -- cycle;
    \fill[red,fill opacity=0.2] (pd8) -- (pd16) -- (pd7) -- (pd19) -- (pd20) -- cycle;
    \fill[red,fill opacity=0.2] (pd20) -- (pd19) -- (pd5) -- (pd15) -- (pd6) -- cycle;
    \fill[red,fill opacity=0.2] (pd12) -- (pd8) -- (pd20) -- (pd6) -- (pd10) -- cycle;
    \fill[red,fill opacity=0.2] (pd10) -- (pd6) -- (pd15) -- (pd13) -- (pd2) -- cycle;
    \fill[red,fill opacity=0.2] (pd12) -- (pd10) -- (pd2) -- (pd18) -- (pd4) -- cycle;

% edges on "back"    face of inscribes cube
    \draw[red] (pd9) -- (pd11);
    \draw[red] (pd11) -- (pd3);
    \draw[red] (pd11) -- (pd7);
    \draw[red] (pd9) -- (pd1);
    \draw[red] (pd9) -- (pd5);
% edges on "top"     face of inscribes cube
    \draw[blue] (pd14) -- (pd16);
    \draw[blue] (pd16) -- (pd8);
    \draw[blue] (pd16) -- (pd7);
    \draw[blue] (pd14) -- (pd3);
    \draw[blue] (pd14) -- (pd4);
% edges on "left"    face of inscribes cube
    \draw[green] (pd17) -- (pd18);
    \draw[green] (pd17) -- (pd3);
    \draw[green] (pd17) -- (pd1);
    \draw[green] (pd18) -- (pd2);
    \draw[green] (pd18) -- (pd4);
% edges on "bottom"  face of inscribes cube
    \draw[yellow] (pd13) -- (pd15);
    \draw[yellow] (pd13) -- (pd1);
    \draw[yellow] (pd13) -- (pd2);
    \draw[yellow] (pd15) -- (pd5);
    \draw[yellow] (pd15) -- (pd6);
% edges on "front"   face of inscribes cube
    \draw[violet] (pd10) -- (pd12);
    \draw[violet] (pd12) -- (pd4);
    \draw[violet] (pd12) -- (pd8);
    \draw[violet] (pd10) -- (pd2);
    \draw[violet] (pd10) -- (pd6);
% edges on "right"   face of inscribes cube 
    \draw[orange] (pd20) -- (pd19); 
    \draw[orange] (pd19) -- (pd7);
    \draw[orange] (pd19) -- (pd5);
    \draw[orange] (pd20) -- (pd8);
    \draw[orange] (pd20) -- (pd6);
\end{tikzpicture}

\end{document}

결과

여기에 이미지 설명을 입력하세요


편집 1:이 작업에는 몇 가지 문제가 있습니다.TikZ3D 포인트도 내부적으로 2D 포인트에 저장됩니다. 게다가 자동으로 숨겨진 선을 찾을 수 없기 때문에 직접 찾아야 합니다. 말씀하신 문제에는 연결선이 12면 중 어느 면을 통과하는지 아는 문제가 있으므로 보기 쉬운 면을 선택했습니다. 교차점을 결정하기 위해 제가 작성한 매크로는 선이 원점을 통과하는 경우에만 작동합니다.

암호

\documentclass[tikz]{standalone}
\usepackage{xifthen}

\begin{document}

%command to find intersection of plane through abc and line p (through origin)
\newcommand{\planelineinter}[5]% a, b, c, p as {a_x,a_y,a_z}, coordinate name
{   \foreach \a [count=\k] in {#1}
    { \ifthenelse{\k=1}{\xdef\tempxa{\a}}
        \ifthenelse{\k=2}{\xdef\tempya{\a}}
        \ifthenelse{\k=3}{\xdef\tempza{\a}}
    }
    \foreach \b [count=\k] in {#2}
    { \ifthenelse{\k=1}{\xdef\tempxb{\b}}
        \ifthenelse{\k=2}{\xdef\tempyb{\b}}
        \ifthenelse{\k=3}{\xdef\tempzb{\b}}
    }
    \foreach \c [count=\k] in {#3}
    { \ifthenelse{\k=1}{\xdef\tempxc{\c}}
        \ifthenelse{\k=2}{\xdef\tempyc{\c}}
        \ifthenelse{\k=3}{\xdef\tempzc{\c}}
    }
    \foreach \p [count=\k] in {#4}
    { \ifthenelse{\k=1}{\xdef\tempxp{\p}}
        \ifthenelse{\k=2}{\xdef\tempyp{\p}}
        \ifthenelse{\k=3}{\xdef\tempzp{\p}}
    }
    \pgfmathsetmacro{\abx}{\tempxb-\tempxa}
    \pgfmathsetmacro{\aby}{\tempyb-\tempya}
    \pgfmathsetmacro{\abz}{\tempzb-\tempza}
    \pgfmathsetmacro{\acx}{\tempxc-\tempxa}
    \pgfmathsetmacro{\acy}{\tempyc-\tempya}
    \pgfmathsetmacro{\acz}{\tempzc-\tempza}
    \pgfmathsetmacro{\nx}{\aby*\acz-\abz*\acy}
    \pgfmathsetmacro{\ny}{\abz*\acx-\abx*\acz}
    \pgfmathsetmacro{\nz}{\abx*\acy-\aby*\acx}
    \pgfmathsetmacro{\d}{(\nx+\ny+\nz)/(\nx*\tempxp+\ny*\tempyp+\nz*\tempzp)}
    \path (0,0,0) -- (#4) coordinate[pos=\d] (#5);
}

% golden ratio and inverse golden ratio
\pgfmathsetmacro{\gr}{(1+sqrt(5))/2}
\pgfmathsetmacro{\igr}{2/(1+sqrt(5))}

%choose axis angles
\newcommand{\xangle}{0}
\newcommand{\yangle}{90}
\newcommand{\zangle}{225}

%choose axis lengths
\newcommand{\xlength}{1}
\newcommand{\ylength}{1}
\newcommand{\zlength}{0.5}

\pgfmathsetmacro{\xx}{\xlength*cos(\xangle)}
\pgfmathsetmacro{\xy}{\xlength*sin(\xangle)}
\pgfmathsetmacro{\yx}{\ylength*cos(\yangle)}
\pgfmathsetmacro{\yy}{\ylength*sin(\yangle)}
\pgfmathsetmacro{\zx}{\zlength*cos(\zangle)}
\pgfmathsetmacro{\zy}{\zlength*sin(\zangle)}

\begin{tikzpicture}
[   x={(\xx cm,\xy cm)},
  y={(\yx cm,\yy cm)},
  z={(\zx cm,\zy cm)},
  scale=2,
  every path/.style={thick}
]

% coordinates of the vertices (see wikipedia page)
    \node[below left] at (0,0,0) {$\vec{0}$};
    \fill (0,0,0) circle (0.03);
    % vertices of inscribed cube
    \coordinate (pd1) at (-1,-1,-1);
    \coordinate (pd2) at (-1,-1,1);
    \coordinate (pd3) at (-1,1,-1);
    \coordinate (pd4) at (-1,1,1);
    \coordinate (pd5) at (1,-1,-1);
    \coordinate (pd6) at (1,-1,1);
    \coordinate (pd7) at (1,1,-1);
    \coordinate (pd8) at (1,1,1);
    % "front/back" "outside of cube" points
    \coordinate (pd9) at (0,-\igr,-\gr);
    \coordinate (pd10) at (0,-\igr,\gr);
    \coordinate (pd11) at (0,\igr,-\gr);
    \coordinate (pd12) at (0,\igr,\gr);
    % "top/bottom" "outside of cube" points
    \coordinate (pd13) at (-\igr,-\gr,0);
    \coordinate (pd14) at (-\igr,\gr,0);
    \coordinate (pd15) at (\igr,-\gr,0);
    \coordinate (pd16) at (\igr,\gr,0);
    % "left/right" "outside of cube" points
    \coordinate (pd17) at (-\gr,0,-\igr);
    \coordinate (pd18) at (-\gr,0,\igr);
    \coordinate (pd19) at (\gr,0,-\igr);
    \coordinate (pd20) at (\gr,0,\igr);

% ========== the point of interest, part 1
    \coordinate (x) at (4,3,0);
    \planelineinter{1,1,-1}{1,1,1}{\igr,\gr,0}{4,3,0}{interpoint}
    \draw[very thick,red,densely dashed] (0,0) -- (interpoint);

% faces; "back" ones gray, "front" ones red
    \fill[gray,fill opacity=0.4] (pd11) -- (pd9) -- (pd5) -- (pd19) -- (pd7) -- cycle;
    \fill[gray,fill opacity=0.4] (pd11) -- (pd9) -- (pd1) -- (pd17) -- (pd3) -- cycle;
    \fill[gray,fill opacity=0.4] (pd11) -- (pd7) -- (pd16) -- (pd14) -- (pd3) -- cycle;
    \fill[gray,fill opacity=0.4] (pd3) -- (pd14) -- (pd4) -- (pd18) -- (pd17) -- cycle;
    \fill[gray,fill opacity=0.4] (pd1) -- (pd9) -- (pd5) -- (pd15) -- (pd13) -- cycle;
    \fill[gray,fill opacity=0.4] (pd1) -- (pd13) -- (pd2) -- (pd18) -- (pd17) -- cycle;

    \fill[gray,fill opacity=0.4] (pd14) -- (pd16) -- (pd8) -- (pd12) -- (pd4) -- cycle;
    \fill[lime,fill opacity=0.4] (pd8) -- (pd16) -- (pd7) -- (pd19) -- (pd20) -- cycle;
    \fill[gray,fill opacity=0.4] (pd20) -- (pd19) -- (pd5) -- (pd15) -- (pd6) -- cycle;
    \fill[gray,fill opacity=0.4] (pd12) -- (pd8) -- (pd20) -- (pd6) -- (pd10) -- cycle;
    \fill[gray,fill opacity=0.4] (pd10) -- (pd6) -- (pd15) -- (pd13) -- (pd2) -- cycle;
    \fill[gray,fill opacity=0.4] (pd12) -- (pd10) -- (pd2) -- (pd18) -- (pd4) -- cycle;

% edges on "back"    face of inscribes cube; red
    \draw[dashed] (pd9) -- (pd11);
    \draw[dashed] (pd11) -- (pd3);
    \draw[dashed] (pd11) -- (pd7);
    \draw[dashed] (pd9) -- (pd1);
    \draw[dashed] (pd9) -- (pd5);
% edges on "top"     face of inscribes cube
    \draw[] (pd14) -- (pd16);
    \draw[] (pd16) -- (pd8);
    \draw[] (pd16) -- (pd7);
    \draw[dashed] (pd14) -- (pd3);
    \draw[] (pd14) -- (pd4);
% edges on "left"    face of inscribes cube
    \draw[dashed] (pd17) -- (pd18);
    \draw[dashed] (pd17) -- (pd3);
    \draw[dashed] (pd17) -- (pd1);
    \draw[] (pd18) -- (pd2);
    \draw[] (pd18) -- (pd4);
% edges on "bottom"  face of inscribes cube
    \draw[] (pd13) -- (pd15);
    \draw[dashed] (pd13) -- (pd1);
    \draw[] (pd13) -- (pd2);
    \draw[] (pd15) -- (pd5);
    \draw[] (pd15) -- (pd6);
% edges on "front"   face of inscribes cube
    \draw[] (pd10) -- (pd12);
    \draw[] (pd12) -- (pd4);
    \draw[] (pd12) -- (pd8);
    \draw[] (pd10) -- (pd2);
    \draw[] (pd10) -- (pd6);
% edges on "right"   face of inscribes cube 
    \draw[] (pd20) -- (pd19);   
    \draw[] (pd19) -- (pd7);
    \draw[] (pd19) -- (pd5);
    \draw[] (pd20) -- (pd8);
    \draw[] (pd20) -- (pd6);    

% ========== the point of interest, part 2
    \draw[very thick,red] (interpoint) -- (x);
    \fill[blue] (x) circle (0.03) node[above] {$\mathbf{\hat{x}}$};
    \fill[blue] (interpoint) circle (0.03) node[above,fill,white,rounded corners=1mm,fill opacity=0.5,text opacity=1,text=black,above left=1mm] {intersection point};
\end{tikzpicture}

\end{document}

산출

여기에 이미지 설명을 입력하세요

관련 정보