2013-06-22 39 views
4

我一直在做很多關於這個話題的研究,並且發現了一些有用的帖子,但是我只是無法做到這一點。給定f(x)的線性函數,如何獲得一個二次貝塞爾控制點

我正在開發一個非常簡單的結構分析應用程序。在這個應用程序中,我需要顯示一個圖形,顯示梁的內部應力。該曲線圖是通過以下公式獲得:

y = (100 * X/2) * (L - X) 

其中L是梁的已知長度(可以說其1爲簡單起見)。而X是一個介於0和Be梁長度之間的值。所以最終的公式將是:

y = (100 * X/2) * (1 - x) where 0 < X < 1. 

假設我的起點和終點都是P0 = (0,0)P2 = (1,0)。我如何獲得P2(控制點)?我一直在尋找的維基百科頁面,但我不確定如何從二次貝塞爾曲線公式得到控制點:

B(t) = (1 - t)^2 * P0 + 2*(1 - t)*t * P1 + t^2 * P2 

我敢肯定,這一定是這樣一個簡單的問題來解決......誰能幫助我出來嗎?

P.S .:我也發現這個,How to find the mathematical function defining a bezier curve,這似乎解釋瞭如何做與我試圖達到的相反。我無法弄清楚如何改變它。

+0

如果你還沒有,你可能想看看Math.SE http://math.stackexchange.com/ – Aboutblank

+0

謝謝!我已經看過數學部分。我只是不知道如何處理「t」值。我試着做同樣的問題,我連接的問題,但「t」仍然存在,所以我留下了一個無用的座標。 – t0t3m

回答

4

我們希望由y定義的二次曲線與由B(t)定義的二次貝塞爾曲線 相匹配。

其中必須匹配的許多要點是發生在x = 0.5的峯值。當x = 0.5

y = (100 * x/2) * (1 - x) 

    100  1  25 
y = ---- * --- = ---- = 12.5 
    4  2  2 

因此,讓我們來安排B(0.5) = (0.5, 12.5)

B(t) = (1-t)^2*(0,0) + 2*(1-t)*t*(Px, Py) + t^2*(1,0) 
(0.5, 12.5) = B(0.5) = (0,0) + 2*(0.5)*(0.5)*(Px, Py) + (0.25)*(1,0) 

0.5 = 0.5 * Px + 0.25 
12.5 = 0.5 * Py 

求解PxPy,我們得到

(Px, Py) = (0.5, 25) 

這裏是目視確認(在Python),我們找到了正確的點:

# test.py 
import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0, 1, 100) 
y = (100*x/2)*(1-x) 
t = np.linspace(0, 1, 100) 
P0 = np.array([0,0]) 
P1 = np.array([0.5,25]) 
P2 = np.array([1,0]) 
B = ((1-t)**2)[:,np.newaxis]*P0 + 2*((1-t)*t)[:,np.newaxis]*P1 + (t**2)[:,np.newaxis]*P2 
plt.plot(x, y) 
plt.plot(B[:,0], B[:,1]) 
plt.show() 

運行python test.py,我們看到了兩條曲線重合:

enter image description here


我怎麼知道該怎麼選擇t = 0.5B(t)達到其最大高度參數值?

嗯,這主要是基於直覺,但這裏是一個更正式的方式來證明這一點:

B'(t) Y分量等於0時B(t)達到其最大高度。所以,服用的B(t)的衍生物,我們看到

0 = 2*(1-2t)*Py 
t = 0.5 or Py = 0 

如果PY = 0,則B(t)是從(0,0)的水平線到(1,0)。拒絕這個退化情況,我們看到B(t)達到其最大高度時t = 0.5

+0

哇!非常感謝unutbu。這很容易......所以,讓我直截了當地閱讀你的代碼,我得出結論,bezier的最大點出現在t = 0.5。這是否總是這樣? – t0t3m

+0

@ t0t3m:這只是一個幸運的猜測。但是我在上面加了一個更正式的論點,爲什麼't = 0.5'是正確的選擇。 – unutbu

+0

我用@Teeppeem指出的修改編輯了控制點數學。我想我說得對,但可以隨時查看。視覺確認圖形仍然是一樣的。 – t0t3m

2

您的二次貝塞爾曲線公式在中期有一個錯字。它應該是:
B(t) = (1 - t)^2 * P0 + 2 * (1 - t) * t * P1 + t^2 * P2
這意味着你應該採取@unutbu找到的P1=(1,50)並將座標減半得到P1=(.5,25)。 (如果你繪製你自己的參數方程這沒有關係,但如果你想要的東西,如LaTeX的\qbezier(0,0)(.5,25)(1,0),那麼你就需要校正地點。)

P1控制點定義,以使在P0P2處的切線相交於P1。這意味着如果(P1)x=(P2)x,圖表的右邊應該是垂直的(你不想要的)。

迴應你的評論,如果你有一個二次方y=f(x),那麼它的軸對稱(幾乎同義)。所以最大值/最小值會出現在根的平均值(以及控制點)上。

+0

我現在真的會問這個問題。新的控制點(0.5,25)使前一個(1,50)變得更有意義。我已經更正了這個公式。謝謝! – t0t3m

相關問題