c# - 迭代平滑曲线

标签 c# algorithm geometry curve-fitting

我一整天都在尝试这样做。基本上,我有一条线和一个点。我希望线弯曲并通过该点,但我不想要平滑的曲线。我不想像这样定义曲线中的步数(当心粗糙的 mspaint 绘图): curve

等等。我尝试了各种方法,比如从初始线的中心取角度,然后在角度引导的点处分割线,但我对长度有疑问。我只是将初始长度除以我所处的步数,但这不太正确。

有谁知道这样做的方法吗?

谢谢。

最佳答案

你可以反其道而行之:首先找到一条匹配曲线,然后使用曲线上的点绘制直线。例如:

alt text

该图是通过以下方式获得的:

假设您有三个起点 {x0,0},{x1,y1},{x2,0}

然后您会发现两条抛物线曲线在 {x1,y1} 处相交,附加条件是在该点具有最大值(为了平滑过渡)。这些曲线是:

 yLeft[x_] := a x^2 + b x + c; 
 yRight[x_] := d x^2 + e x + f;

我们在哪里找到(经过一些微积分):

   {c -> -((-x0^2 y1 + 2 x0 x1 y1)/(x0 - x1)^2), 
    a -> -(y1/(x0 - x1)^2), 
    b -> (2 x1 y1)/(-x0 + x1)^2}  

   {f -> -((2 x1 x2 y1 - x2^2 y1)/(x1 - x2)^2), 
    d -> -(y1/(x1 - x2)^2), 
    e -> (2 x1 y1)/(x1 - x2)^2}

所以我们有两条曲线。

现在你应该注意到,如果你希望你的点等距,x1/x2 应该是一个有理数。你的步骤选择是有限的。您可以选择从 x0 开始时经过 x1 和 x2 的步骤。 (它们的形式为 x1/(n * x2))

仅此而已。现在根据点 {x,yLeft[x]} 或 {x,yRight[x]} 形成线条,具体取决于您在 x1 的哪一侧。

注意:您可以选择只绘制一条通过您的三个点的抛物线曲线,但在一般情况下会导致高度不对称。

如果 x1 点在中间,结果会更好:

alt text

关于c# - 迭代平滑曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120839/

相关文章:

c# - 在 Robot Framework 中实例化 C# 对象

regex - 将点星正则表达式转换为 NFA

c++ - 我应该使用什么数据结构来支持插入、删除和随机选择?

javascript - 重叠的矩形 JavaScript

javascript - 在圆圈内随机绘制点的最简单方法

c# - 异步数据库查询触发存储过程

c# - 从 javaScript 执行服务器端代码

c# - Func<> 作为函数的可选参数必须是编译时常量?

algorithm - 我可以在我的图中使用 Dijkstra 的最短路径算法吗?

java - Javafx中如何让球从物体上弹开?