在 LaTeX 中使用 lua 或 luamplib 绘制二维和三维矢量

在 LaTeX 中使用 lua 或 luamplib 绘制二维和三维矢量

这是可以绘制矢量的 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如上所示。

相关内容