2016-05-09 38 views
0

我想寫一個程序來繪製一個貝塞爾曲線段實現我的教科書的知識。我想嘗試使用隱式函數來繪製繪圖程序。我希望我的程序按照以下方式工作。如何計算具有給定隱式函數的貝塞爾曲線的控制點?

  • 用戶輸入一個隱式函數,假設y = 2x^3。
  • 計算控制點(不知道怎麼辦)
  • 平局貝塞爾曲線(完成)
  • 下一個功能

從理論上講,我可以借鑑直接代換曲線,但我可以做對曲線進行一些修改,我想實現我所學到的東西,所以我想明智地做到這一點(直接替換看起來很愚蠢).Thz ^^

編輯1:我們假設邊界由用戶提供

+0

計算起點和終點,需要你限制功能的範圍。在你提供的例子中,'x'和'y'都是無限的。 –

+0

是的,我忘了提及,現在我將添加它 – FunnyFunkyBuggy

+0

現在計算Bezier的第一個和最後一個點應該是微不足道的。你在嘗試單曲線還是分段逼近? –

回答

1

第一步是生成曲線的參數化表達式。給定的例子可以非常容易地轉化:

c(t) = (t, 2 * t^3)^T 

現在Monomial basis表達該曲線:

c(t) =/0 1 0 0 \ * (1, t, t^2, t^3)^T 
     \ 0 0 0 2/
    = C * M(t) 

在這個表達式中,第一矩陣是C係數矩陣。我們所需要做的就是將這個矩陣轉換成伯恩斯坦基。該轉換單項式基礎Bernstein基的矩陣是:

 /1 - 3t + 3t^2 - t^3 \ /1 -3 3 -1 \ /1 \ 
B(t) = |  3t - 6t^2 + 3t^3 | = | 0 3 -6 3 | * | t | 
     |   3t^2 - 3t^3 | | 0 0 3 -3 | | t^2 | 
     \     t^3/ \ 0 0 0 1/ \ t^3/

這個方程可以反轉得到:

 /1 1 1 1 \ 
M(t) = | 0 1/3 2/3 1 | * B(t) 
     | 0 0 1/3 1 | 
     \ 0 0 0 1/

代入曲線方程,我們得到:

c(t) = C * M(t) 
     /1 1 1 1 \ 
    = C * | 0 1/3 2/3 1 | * B(t) 
      | 0 0 1/3 1 | 
      \ 0 0 0 1/

可以計算第一個矩陣乘積:

c(t) =/0 1/3 2/3 1 \ * B(t) 
     \ 0 0 0 2/

這爲您提供了貝塞爾曲線的控制點:

p0 = (0, 0)^T 
p1 = (1/3, 0)^T 
p2 = (2/3, 0)^T 
p3 = (1, 2)^T 

這非常程序可以應用到任何多項式曲線。

一個方程的形式

y = a + b * x + c * x^2 + d * x^3 

一般的解決方法是:

p0 = (0, a)^T 
p1 = (1/3, a + b/3)^T 
p2 = (2/3, a + 2b/3 + c/3)^T 
p3 = (1, a + b + c + d)^T 
+0

在你的一般形式中,你寫了「y = a + b * x + c * x^2 + d *的x^4" 。它應該是「y = a + b * x + c * x^2 + d * x^3」嗎? – FunnyFunkyBuggy

+0

那麼,在你的情況下,你認爲x的範圍是從0到1?如果我有其他範圍的x,比如0-2,我應該如何實現你的方法? – FunnyFunkyBuggy

+0

是的,我錯過了'^ 4'。應該是'^ 3'。 'x'和't'都不限制在範圍'[0,1]'中。您可以使用不在此間隔內的參數來評估貝塞爾曲線。如果你想保持這個間隔,你必須找到一個不同的參數。 –