![如何使用 Tikz 渲染斜投影图形?](https://linux22.com/image/408245/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Tikz%20%E6%B8%B2%E6%9F%93%E6%96%9C%E6%8A%95%E5%BD%B1%E5%9B%BE%E5%BD%A2%EF%BC%9F.png)
我想用斜投影渲染下图以保留三角形底座的初始形状。
\documentclass[border=10pt, multi, tikz]{standalone}
\tikzset{pics/prismoid/.style={code={
\tikzset{prismoid/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/prismoid/##1}}
\draw [solid, opacity=.5, pic actions]
%% point o - avant droit
(0,0,0) coordinate (o)
%% point a - avant gauche
(-\pv{scale}*\pv{width},0,0) coordinate (a)
%% point b - arrière central
(-\pv{scale}*\pv{width}/2,\pv{scale}*\pv{depth},0) coordinate (b)
%% point c - haut avant droit
(0,0,\pv{scale}*\pv{height}) coordinate (c)
%% point d - haut avant gauche
(-\pv{scale}*\pv{width},0,\pv{scale}*\pv{height}) coordinate (d)
%% point e - haut arrière central
(-\pv{scale}*\pv{width}/2,\pv{scale}*\pv{depth},\pv{scale}*\pv{height}) coordinate (e)
%% jonction entre les points
%(b) edge[densely dashed] (a)
%edge[densely dashed] (c) edge[densely dashed] (d)
(o) -- (a) -- (d) -- (c) -- (o)
(c) -- (e) -- (d)
(b) edge[densely dashed] (o) edge[densely dashed] (a) edge[densely dashed] (e)
;
}},
prismoid/.cd,
width/.initial=10,
height/.initial=10,
depth/.initial=10,
scale/.initial=.2,
}
\begin{document}
\begin{tikzpicture}[x={(2cm,0cm)},y={(45:1cm)},z={(0cm,2cm)},line cap=round,line join=round]
\pic {prismoid={width=10, height=10, depth=10}};
%\pic {prismoid={width=20, height=10, depth=10}};
%\pic {prismoid={width=10, height=20, depth=10}};
%\pic {prismoid={width=10, height=10, depth=20}};
\end{tikzpicture}
\end{document}
代码来自@Schrödinger's cat,他帮我解决了我之前的帖子。我已经尝试更改 的值\begin{tikzpicture}[x={(2cm,0cm)},y={(45:1cm)},z={(0cm,2cm)}
,或者通过其他可选参数(3d 视图、透视)更改它,但不起作用。我目前正在互联网上搜索,但如果有人有任何想法,我愿意接受任何建议。
答案1
骑士透视(法语)保留了平行性。要制作这样的透视图,只需以消失角完全相同地复制正面即可获得背面。这可以使用 TikZ 完成,就像以传统方式使用尺子、圆规和直角尺制作此构造一样。
这里,我使用了calc
允许添加坐标的库(因此坐标被视为向量)。通过将相同的向量添加到正面的每个顶点,我们获得了背面的顶点。
\documentclass[tikz,border=5mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
% front face
\coordinate (A) at (-1,0);
\coordinate (B) at (0,2);
\coordinate (C) at (1,0);
% vector v defines the leakage angle
\coordinate (v) at (.8,.8);
\draw (A)--(B)--(C)--cycle;
% back face
\coordinate (A') at ($(A)+(v)$);
\coordinate (B') at ($(B)+(v)$);
\coordinate (C') at ($(C)+(v)$);
\draw[dashed] (C')--(A')--(B');
\draw (B')--(C');
\draw[dashed](A)--(A');
\draw(B)--(B');
\draw(C)--(C');
\end{tikzpicture}
\end{document}