这是可以绘制矢量的 tikz 代码。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-3dplot}
\usepackage{amsmath}
\begin{document}
\tdplotsetmaincoords{60}{120}
\begin{tikzpicture}[tdplot_main_coords]
% Axes
\draw [->] (0,0,0) -- (3,0,0) node [below left] {$x$};
\draw [->] (0,0,0) -- (0,3,0) node [right] {$y$};
\draw [->] (0,0,0) -- (0,0,3) node [above] {$z$};
% Vectors
\draw [->, thick] (0,0,0) -- (2,2,0);
\draw [->, thick] (0,0,0) -- (2,0,1);
% Labels
\node [below right] at (2,2,0) {$(2,0,1)$};
\node [above left] at (2,0,1) {$(2,0,1)$};
\end{tikzpicture}
\end{document}
是否可以使用 luamplib 包绘制矢量?我正在寻找任何基于 lua 的解决方案来解决这个问题。
答案1
“普通”Metapost 或“metafun”格式没有对 3D 坐标的“内置”支持,但您可以对其进行编程以执行或多或少的任何事情。
如果你想要一个简单的等距投影,那么你可以采用我上周展示的方法这个答案。我所做的是创建一个p(x, y, z)
从三维等距投影到二维的宏。但缺点是 (a) 您必须记住p(x,y,z)
一直输入而不是只使用三重(x, y, z)
,并且 (b) 等距投影看起来不太逼真。
如果你想要更复杂的东西,那么看看这些:
但请注意,在 3D 中绘制精美的图像非常困难,并且没有简单的方法可以将 3D 理念与一些核心 MP 概念相协调。例如:
- 封闭路径的概念会发生什么变化?立方体是封闭的吗?
- 您应该如何渲染每条线的粗细?如果线条距离“观察者的眼睛”越近,线条是否应该更粗?
- 我们究竟如何在 3D 中计算贝塞尔样条曲线?
等等。
一个可行的例子
无论如何,这是使用我的isometric_projection.mp
文件的代码版本:
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
input isometric_projection
set_projection(30, -50);
ipscale := 42;
ahangle := 30;
beginfig(1);
% Axes
drawarrow p(0,0,0) -- p(3,0,0); label.rt("$x$", p(3,0,0));
drawarrow p(0,0,0) -- p(0,3,0); label.top("$y$", p(0,3,0));
drawarrow p(0,0,0) -- p(0,0,3); label.urt("$z$", p(0,0,3));
% Vectors
drawarrow p(0,0,0) -- p(2,2,0) withpen pencircle scaled 1;
drawarrow p(0,0,0) -- p(2,0,1) withpen pencircle scaled 1;
% Labels
label.urt("$(2,2,0)$", p(2,2,0));
label.rt("$(2,0,1)$", p(2,0,1));
endfig;
\end{mplibcode}
\end{document}
如果你用它编译它lualatex
(并且你有我的isometric_projection.mp
可用),那么你将得到这个:
等距文件的相关部分如下:
newinternal ipca, ipsa, ipcb, ipsb, ipscale;
def set_projection(expr alpha, beta) =
ipca := cosd(alpha); ipsa := sind(alpha);
ipcb := cosd(beta); ipsb := sind(beta);
enddef;
ipscale := 20;
vardef p(expr x, y, z) =
(x * ipcb - z * ipsb, y * ipca + x * ipsa * ipsb + z * ipsa * ipcb) scaled ipscale
enddef;
isometric_projection.mp
您可以直接将其包含在您的 MP 源中,也可以将其保存在输入路径中某处名为的文件中,input
如上所示。