2017-10-16 2953 views
0

我想写一个遗传算法与曲率作为优化参数之一。我想根据贝塞尔曲线的控制点来计算曲率。我有一个我想要优化的最小曲率半径。我一直在参考这篇论文:https://arxiv.org/pdf/1503.01524.pdf给定控制点计算贝塞尔曲线的曲率半径

在这篇文章里有一个函数,它用三角形的边长来得到我已经实现的隐含的曲率半径。这里是我当前的代码:

// Computes the curvature implied by 3 control points of a bezier curve 
float curvature(float4 p0, float4 p1, float4 p2) { 

    // Get the triangle side lengths 
    float a = distance(p0, p1); 
    float b = distance(p1, p2); 
    float c = distance(p2, p0); 

    // Do the curvature calculation 
    float num = a * b * c; 
    float denom = (a + b + c) * (b + c - a) * (a - b + c) * (a + b - c); 

    return num/sqrt(denom); 

} 

此函数的结果似乎是不正确的。我为路径中的每个点运行此函数,保存最后两个,然后从所有点中获取最小半径。当我绘制路径时,这个函数的计算和我可以看到的东西之间似乎有很大差异。什么是正确的方法来做到这一点?

编辑: 我正在寻找计算三个控制点之间的曲率半径,而不是在曲线中给定的点,如果这不清楚道歉。

+1

您已经实现的功能似乎不符合参数平面曲线曲率半径的实际函数。 –

+0

@ Mike'Pomax'Kamermans是这就是我在想什么,我正在使用的这篇论文使用了这个函数。 – BlueSpud

回答

1

的曲率半径R(t)的半径是等于1 /κ(t),其中κ(t)是时刻t的曲线,这对于a parametric planar curve是的曲率:

  x'y" - y'x" 
κ(t) = -------------------- 
     (x'² + y'²)^(3/2) 

(如果^(3/2)确实是3/2,但是不能在代码块中使用html进行上标格式化,并且(t)部分已经被x和y的函数忽略,因为这会使事情变得不必要地难以阅读)

因此,对于具有对照P 1,P 2和P 3的二次贝塞尔曲线,the first and second derivatives use the following control points

B(t)': P₁' = 2(P₁ - P₂), and P₂' = 2(P₂ - P₃) 
B(t)": P₁" = (P'₁ - P'₂) 

评估这些x和y是真的只是 “使用的x或y坐标”,所以:

x' = Px₁'(t-1) + Px₂'(t) 
y' = Py₁'(t-1) + Py₂'(t) 
x" = Px₁" 
y" = Py₁" 

注意到X “和y” 仅仅是常数。我们将这些值插入到κ(t)的函数中,前提条件是分母不为零(它表示没有曲率半径的线段),然后我们知道R(t)是什么,因为这是因为只是反向值。

最后,如果你真的想要的是曲线与圆弧近似的只是部分,然后https://pomax.github.io/bezierinfo/#arcapproximation应该包括“如何”为特定用例。

+0

我有点不清楚我在寻找什么问题,我很抱歉。我正在寻找更多的方法来获得曲线中3点的曲率半径,而不是评估曲线上给定点的曲率。 – BlueSpud

+1

你不能,你只能计算Bezier曲线在一个点上的弧的半径,而不是“超过一个间隔”,所以它听起来像你*实际想要的是一种将曲线的部分近似为圆形的方式弧。在这种情况下,https://pomax.github.io/bezierinfo/#arcapproximation涵盖了这一点。 –