希望有适合非数学家的 METAPOST 参考资料(或一个不错的交互式图形界面)
尝试为 CNC 项目制定一些路径,但我根本不明白 METAPOST 中的交叉点是如何工作的。
到目前为止我已经:
\documentclass{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
A=100;
B=133;
M=12.35;
%outer rectangle
draw origin--(B, 0)--(B, A)--(B, 0)--cycle;
%triangle
draw origin--(B, 0)--(B/2, A/2)--cycle;
%inner circle
draw fullcircle scaled M shifted (B/2, A/2);
draw (B/2-M/2, A/2) .. (B/2, A/2-M/2){right}withcolor red;
endfig;
\end{mplibcode}
\end{document}
如何获取三角形和红色圆弧交点的坐标?
答案1
以下是我认为 OP 想要的图形的绘制方法。
\RequirePackage{luatex85}
\documentclass[margin=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
path rectangle, triangle, circle;
numeric A, B, M;
A=89;
B=144;
M=21;
rectangle = unitsquare yscaled A xscaled B;
triangle = subpath (0,1) of rectangle --
center rectangle -- cycle;
circle = fullcircle scaled M shifted center rectangle;
draw rectangle;
draw triangle;
draw circle;
draw subpath (4,6) of circle withcolor red;
pair p;
p = triangle intersectionpoint subpath (4,6) of circle;
dotlabel.lft("$p$", p);
endfig;
\end{mplibcode}
\end{document}
笔记
RequirePackage{luatex85}
避免了 LuaTeX 某些版本中对齐和原点的问题。我认为这在最近的版本中已经得到解决。\mplibtextextlabel{enable}
将命令中的字符串解释label
为 TeX 输入。path
我为想要绘制的三种形状定义了三个变量。我已经明确定义了数字参数。这避免了范围方面的任何问题。
我将矩形定义为内置
unitsquare
路径的缩放版本。center
我使用有用的宏和语法根据矩形定义了三角形(我认为这是 OP 的意图)subpath (x,y) of p
。Aunitsquare
有四个点,从左下角的点 0 开始,subpath (0,1) of rectangle
底部边缘也是如此。我再次使用
subpath
来挑选红色圆弧。一个完整的圆从 3 点开始有 8 个点。pair
最后,我为三角形和圆弧的交点定义了一个变量。
这里有各种介绍和其他有用的学习材料:http://www.tug.org/metapost.html
补充想法
如果您确实想知道交点坐标的值,您可以使用
xpart p
和来获取这些值ypart p
,其中p
是一个pair
变量,如上所述。但是,在普通 MP 中内置了一种更方便的表示法。您无需定义
pair p;
并分配给p
,而是可以分配给z1
,然后 x 部分可用作x1
,y 部分可用作y1
。您不必声明z
-变量。如果你真的想知道交叉点在路径上有多远,那么你应该使用替代运算符
intersectiontimes
。顾名思义,这将返回每条路径上的“时间”。更具体地说,如果你这样做:(t,u) = circle intersectiontimes triangle;
那么交点将在
point t of circle
。当然,它也将在point u of triangle
,尽管 MP 不保证这两个点将在确切地相同。请注意,路径的方向和运算符的顺序在这里很重要。如果你已经完成了
(t,u) = triangle intersectiontimes circle;
那么疼痛
point t of triangle
就会出现在右腿上,而不是左腿上。当有多个交叉点时,MP 会选择哪一个并不总是很明显。一般来说,选择第一条路径上最早的交叉点。你可以强迫 MP 采取行动,方法是挑选一条合适的子路径,而不是使用整个路径,这是我在第一个例子中所做的。
答案2
事实证明,秘诀在于分配数据类型路径:
\documentclass{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
beginfig(1);
A=100;
B=133;
M=12.35;
path p, t, r;
%outer rectangle
draw origin--(B, 0)--(B, A)--(B, 0)--cycle;
%triangle
t := origin--(B/2, A/2);
%draw t;
%inner circle
%draw fullcircle scaled M shifted (B/2, A/2);
r := (B/2-M/2, A/2) .. (B/2, A/2-M/2){right};
%draw r withcolor red;
p := r intersectionpoint t;
draw p;
endfig;
\end{mplibcode}
\end{document}