我想寫一個程序來繪製一個貝塞爾曲線段實現我的教科書的知識。我想嘗試使用隱式函數來繪製繪圖程序。我希望我的程序按照以下方式工作。如何計算具有給定隱式函數的貝塞爾曲線的控制點?
- 用戶輸入一個隱式函數,假設y = 2x^3。
- 計算控制點(不知道怎麼辦)
- 平局貝塞爾曲線(完成)
- 下一個功能
從理論上講,我可以借鑑直接代換曲線,但我可以做對曲線進行一些修改,我想實現我所學到的東西,所以我想明智地做到這一點(直接替換看起來很愚蠢).Thz ^^
編輯1:我們假設邊界由用戶提供
我想寫一個程序來繪製一個貝塞爾曲線段實現我的教科書的知識。我想嘗試使用隱式函數來繪製繪圖程序。我希望我的程序按照以下方式工作。如何計算具有給定隱式函數的貝塞爾曲線的控制點?
從理論上講,我可以借鑑直接代換曲線,但我可以做對曲線進行一些修改,我想實現我所學到的東西,所以我想明智地做到這一點(直接替換看起來很愚蠢).Thz ^^
編輯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
在你的一般形式中,你寫了「y = a + b * x + c * x^2 + d *的x^4" 。它應該是「y = a + b * x + c * x^2 + d * x^3」嗎? – FunnyFunkyBuggy
那麼,在你的情況下,你認爲x的範圍是從0到1?如果我有其他範圍的x,比如0-2,我應該如何實現你的方法? – FunnyFunkyBuggy
是的,我錯過了'^ 4'。應該是'^ 3'。 'x'和't'都不限制在範圍'[0,1]'中。您可以使用不在此間隔內的參數來評估貝塞爾曲線。如果你想保持這個間隔,你必須找到一個不同的參數。 –
計算起點和終點,需要你限制功能的範圍。在你提供的例子中,'x'和'y'都是無限的。 –
是的,我忘了提及,現在我將添加它 – FunnyFunkyBuggy
現在計算Bezier的第一個和最後一個點應該是微不足道的。你在嘗試單曲線還是分段逼近? –