我一整天都在尝试这样做。基本上,我有一条线和一个点。我希望线弯曲并通过该点,但我不想要平滑的曲线。我不想像这样定义曲线中的步数(当心粗糙的 mspaint 绘图):
等等。我尝试了各种方法,比如从初始线的中心取角度,然后在角度引导的点处分割线,但我对长度有疑问。我只是将初始长度除以我所处的步数,但这不太正确。
有谁知道这样做的方法吗?
谢谢。
最佳答案
你可以反其道而行之:首先找到一条匹配曲线,然后使用曲线上的点绘制直线。例如:
该图是通过以下方式获得的:
假设您有三个起点 {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 点在中间,结果会更好:
关于c# - 迭代平滑曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4120839/