2017-10-16 196 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涵蓋了這一點。 –