2011-09-15 42 views
0

我已經在java中成功繪製了Quad2D或Bezier曲線。我有相同的方程。但是我需要確定一個特定點(x,y)是否位於曲線上。我嘗試使用Quad2D.contains和一些GeneralPath API,我無法準確獲得結果。如何確定一個點是否位於Quad2DCurve

有人可以幫助找出解決方案嗎?

回答

0

我想你的意思是QuadCurve2D類,它是二次貝塞爾曲線。 對此,似乎沒有現成的方法,問題是從點到貝塞爾曲線的距離。 讓我們的P0將成爲你的觀點,P1是一個起點,P2 - 一個控制點,P3是你的曲線的終點。 然後在曲線上點將由

P = B(t) 

給予有這樣t,爲此PP0之間的距離將是最小的。

F(t) = (B(t)_x - P0_x)^2 + (B(t)_y - P0_y)^2 -> min 

如果距離爲0或小於一定的誤差,則P 0是在曲線上。 噸可以用Netwon迭代法通過最小化成本函數

t_n = t_n-1 + F'(t)/F''(t) 

其中F'是成本函數的一階導數和F''是其二階導數被發現。

F'(t) = 2 * (B(t)_x - P0_x) * B'(t)_x + 2 * (B(t)_y - P0_y) * B'(t)_y 
F''(t) = 2 * B'(t)_x * B'(t)_x + 2 * (B(t)_x - P0_x) * B''(t)_x + 
     2 * B'(t)_y * B'(t)_y + 2 * (B(t)_y - P0_x) * B''(t)_y 

二次貝塞爾曲線B'(t)的一階導數是線段與起始點(P2 - P1)和終點(P3 - P2)。二階導數B''(t)是一個點P3 - 2 * P2 + P1

將所有東西封在一起會給t一個公式,其中F(t)是最小的。

相關問題