如何在 METAPOST 中获取圆弧和三角形的交点?

如何在 METAPOST 中获取圆弧和三角形的交点?

希望有适合非数学家的 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}

相关内容