通过点平滑曲线,仅使用水平、垂直线和固定半径弧

Posted

技术标签:

【中文标题】通过点平滑曲线,仅使用水平、垂直线和固定半径弧【英文标题】:smooth curve through points, using only horizontal, vertical lines and fixed-radius arcs 【发布时间】:2012-07-07 00:45:25 【问题描述】:

给定一个有序的点列表,我想绘制一条通过所有点的平滑曲线。曲线的每一部分可以是水平的、垂直的或具有给定半径 r 的弧(所有弧都将具有相同的半径)。过渡应该是平滑的,即一个部分末尾的标题应该与下一部分开头的标题相同。任意两个连续输入点之间可以有任意数量的圆弧或直线段。

这有点像火车轨道,应该正交或沿着具有固定曲率的部分运行。

有没有好的算法来构造这样的曲线? (或者,如果这样的行是不可能的,我想知道。)

我研究了 Bezier 曲线,但这似乎有点过头了,而且我找不到强制执行约束的好方法。

【问题讨论】:

【参考方案1】:

您在上面的要求对我来说意味着您寻求曲线跨点的切线连续性(类似于在节点处具有切线连续性的样条曲线)。火车轨道类比至少传达了这一要求。鉴于直线和固定半径圆弧的严格限制,我相当肯定你将无法做到这一点。如果您需要这种平滑度,为什么不考虑对点进行样条插值呢? 要了解为什么考虑以下图片:

考虑用圆弧替换 B 和 C 之间的线段。您可以这样做以使连接连续,但要使其 切线 连续,您需要很大的运气,因为只有 一个 圆是切线连续的到也接触点 C 的线段 AB。该圆在 C 处的切线与线 CD 的切线相匹配的可能性很小。您的数据可能会像这样排列,但您不能依赖它。

如果我误解了你的问题,请告诉我,我会调整答案。

【讨论】:

谢谢,我应该提到这一点:这些点相对于给定的半径 r 不会很密集,所以在大多数情况下这种类型的布局应该是可能的。 即便如此,除非您的点满足一些非常严格的标准,否则您将难以获得切线连续性。您可能会拟合一条看起来像切线连续的曲线,但我怀疑它会是。但只有您可以决定这是否足以满足您的需求。祝你好运! 啊,我想我明白了我需要澄清的内容:在每对点之间,可以有多个直线段或弧线。例如,在您的图像中,您可以从 A 向上的垂直线开始,向 B 倾斜 90 度的弧线,然后向 B 倾斜水平线。然后从 B 开始,您可以从水平线段开始,然后向 C 向下弯曲, 等等。抱歉文字说明,但我认为我不能在评论中添加图片。 @marcopolo1010 我明白你现在的意思了。您想从直线和圆弧生成自己的曲线,以便生成的构造对您的数据进行插值。好吧,我想这是可能的,但一个潜在的问题是这样的配置不太可能是唯一的——我已经可以想象很多这样的曲线可能只是上图。真的,除非您真的必须只有弧线和线,否则我会选择样条插值法。我当然从来没有听说过一种算法可以做你想做的事,但祝你好运! 我的猜测是 OP 正在运行一个只能做弧线和直线的 CNC 工具,因此他的要求。

以上是关于通过点平滑曲线,仅使用水平、垂直线和固定半径弧的主要内容,如果未能解决你的问题,请参考以下文章

canvas绘图详解-09-曲线的绘制原理

如何确定与切线垂直的弧上一点的距离?

border-radius

CAD中椭圆弧如何标注尺寸?

如何通过 Python 3 中的真实数据点绘制平滑曲线?

如何使用javascript HTML5画布通过N个点绘制平滑曲线?