我有一個具有2個控制點的三次貝塞爾曲線。起點和控制點是已知的。在給定控制點,起點和終點的情況下,需要獲得曲線的所有點。 我想要實現的是給定一個從1到曲線長度的值。獲得每個點在該位置的X和Y以及alpha(角度)。 我找不到一個很好的參考或工作代碼。 我使用的是javascript。在javascript中查找三次貝塞爾曲線的所有點
回答
如果我理解正確,您正試圖確定Bezier在每個點上的位置和斜率(曲線的切線)。我們假設你的起點是(ax,ay),終點是(dx,dy),你的控制點是(bx,by)和(cx,cy)。
位置很簡單。首先,計算混合函數。這些控制曲線上控制點的「效果」。
B0_t = (1-t)^3
B1_t = 3 * t * (1-t)^2
B2_t = 3 * t^2 * (1-t)
B3_t = t^3
請注意,當t爲0(且其他一切爲零)時,B0_t是1。此外,當t是1時(並且其他一切都爲零),B3_t是1。所以曲線從(ax,ay)開始,到(dx,dy)結束。
任何中間點(px_t,py_t)將通過以下給出(變化噸從0到1,在一個循環內小的增量):
px_t = (B0_t * ax) + (B1_t * bx) + (B2_t * cx) + (B3_t * dx)
py_t = (B0_t * ay) + (B1_t * by) + (B2_t * cy) + (B3_t * dy)
斜率也是容易做到的。使用https://stackoverflow.com/a/4091430/1384030
B0_dt = -3(1-t)^2
B1_dt = 3(1-t)^2 -6t(1-t)
B2_dt = - 3t^2 + 6t(1-t)
B3_dt = 3t^2
給出的方法,所以x和y的變化率是:
px_dt = (B0_dt * ax) + (B1_dt * bx) + (B2_dt * cx) + (B3_dt * dx)
py_dt = (B0_dt * ay) + (B1_dt * by) + (B2_dt * cy) + (B3_dt * dy)
然後用Math.atan2(py_dt,px_dt)
得到角(弧度)。
De Casteljau algorithm更具數值穩定性。這裏還有一個額外的好處,就是它可以計算切點(即切線角度)作爲計算該點前的步驟。
但是,它按照參數值工作,而不是長度。作爲繪製曲線的一部分,最好按參數計算點數,而不是數值。參數的範圍將分別爲,0
對應的起始點和1
曲線的終點。
是的,它有三個優點。 *適用於任何程度的樣條,無需修改。 *它不需要電源功能。 *最有價值的是結果具有參數「t」的切線和點,因此,對於需要解析公式在計算上更簡單的情況。 – divanov 2013-04-03 20:07:02
此庫也可能有幫助。
- 1. 繪製橢圓與二次貝塞爾曲線和三次貝塞爾曲線
- 2. 通過三點的貝塞爾曲線
- 3. 尋找貝塞爾曲線的頂點
- 4. 在多個點處拆分三次貝塞爾曲線
- 5. 在分段二次貝塞爾曲線上找到控制點
- 6. 在Actionscript中繪製三次貝塞爾曲線?
- 7. arbor.js邊緣點狀貝塞爾曲線
- 8. n階貝塞爾曲線?
- 9. 平滑貝塞爾曲線
- 10. 貝塞爾三次曲線:以勻加速度移動
- 11. 貝塞爾曲線和法國曲線
- 12. 如何沿貝塞爾曲線返回所有點?
- 13. 基於三點繪製貝塞爾曲線?
- 14. 查找畫布中貝塞爾曲線的高度
- 15. WPF中的貝塞爾曲線
- 16. As3中的貝塞爾曲線
- 17. matlab中的連續貝塞爾曲線
- 18. OpenGL中的厚貝塞爾曲線
- 19. 通過立方和/或二次貝塞爾曲線逼近n級貝塞爾
- 20. 找到貝塞爾曲線上的點。 (GDI +)
- 21. 如何查找貝塞爾曲線的方向?
- 22. 如何找到二次貝塞爾曲線的最佳控制點?
- 23. 基於點的曲線變換。貝塞爾曲線在Android中的變換
- 24. 如何使用iText繪製拋物線的一部分?或者我如何從三次貝塞爾曲線創建二次貝塞爾曲線?
- 25. 活潑的貝塞爾曲線
- 26. 貝塞爾曲線上的鼠標
- 27. 逼近貝塞爾曲線的N度
- 28. 具有已知端點的貝塞爾曲線擬合
- 29. 查找三次Bezier曲線
- 30. 二次貝塞爾曲線:計算切線
那裏尋找:http://stackoverflow.com/questions/4089443/find-the-tangent-of-a-point-on-a-cubic-bezier-curve-on-an-iphone – XDnl 2013-03-13 22:46:48