3D 軸と原点に向かう線分を持つ多面体

3D 軸と原点に向かう線分を持つ多面体

3D軸と凸多面体を含む3Dプロット、またはより良いものを作成したいです 十二面体

スクリーンショット

上面の境界エッジ ポイントの 1 つに注釈 (例: \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

こちらはティックZ開始点では、すべての頂点、エッジ、面が独立して定義されるため、これらをさらに魔法のように使用できます。

コード

\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:これを実行するにはいくつかの問題がありますティックZ3D ポイントも内部的には 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}

出力

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

関連情報