越高Bezier曲線,它需要更多的控制點的順序。二次曲線是二階貝塞爾曲線,它們需要一個控制點。具有兩個控制點的貝塞爾曲線是三階。一階貝塞爾曲線實際上是一條直線。沒有貝塞爾曲線的有限階可以形成完美的圓弧。
順便說一句,二次曲線不是「橢圓或東西」,它是一個拋物線段。
如果你想要有圓弧,你應該使用......以及圓弧!要控制它,你需要改變半徑,實際上你可以通過移動圓心來完成。
您將需要額外的邏輯來處理直線,因爲圓弧不會是直線。因此,如果拖動點在直線上方,您將繪製一條直線,否則將繪製具有適當半徑的圓弧。
所以,讓我們說你有以下情況:
當段ab
是您的矩形的直線和acb
是所需的電弧。 y
是段的高度,x
是拖動的水平偏移量。我們正在尋找r
由三點a
,c
和b
定義的圓的半徑。
現在角sda
是一個回合/ 4,sd
是r - x
和ad
是y/2
。如果我們使用畢達哥拉斯我們得到:
r^2 = (r-x)^2 + (y/2)^2
=>
r^2 = (r-x)(r-x) + (y/2)^2
=>
r^2 = r^2 - 2rx + x^2 + (y/2)^2
=>
r^2 = r^2 - 2rx + x^2 + (y^2/4)
=>
0 = - 2rx + x^2 + (y^2/4)
=>
2rx = x^2 + (y^2/4)
=>
r = (x^2 + (y^2/4))/2x
=>
r = ((x^2)/2x) + ((y^2/4)/2x)
=>
r = (x/2) + ((y^2/4)/2x)
=>
r = (x/2) + (y^2/8x)
正如你可以看到,當x
是0,我們有除以0。這就是爲什麼你必須切換到繪製直線當這種情況發生。
我們找到的公式(r = (x/2) + (y^2/8x)
)您將能夠確定繪製圓弧的圓的半徑。找到中心點是微不足道的...
要找到角度,您可以使用正弦定律或餘弦定律,根據您的偏好,兩者都可以很好地工作。您可以選擇使用三角形asb
,三角形asd
或三角形adc
(綠色)來查找角度。
對於一個簡單的方法,讓我們繼續與三角形asd
,讓我們用正弦定理:
r/sin(turn/4) = (y/2)/sin(θ/2)
由於四分之一圈爲1的正弦波,我們可以更換:
=>
r/1 = (y/2)/sin(θ/2)
=>
1 = (y/2)/sin(θ/2)
現在,解決這個問題的角度:
=>
sin(θ/2) = (y/2)
=>
θ/2 = asin(y/2)
當調用該函數來繪製AR c,起始角度爲-θ/ 2,結束角度爲θ/ 2。
注意:所有這些都是爲矩形的右側做出的調整,對於其他方面是需要的。
你能告訴我們你到目前爲止的JavaScript代碼嗎? –
@ rink.attendant.6:我編輯了問題,並在這裏顯示了我的所有代碼。 –
貝塞爾曲線的階數越高,它需要的控制點越多。二次曲線是二階貝塞爾曲線,它們需要一個控制點。具有兩個控制點的貝塞爾曲線是三階。一階貝塞爾曲線實際上是一條直線。沒有貝塞爾曲線的有限階可以形成完美的圓弧。 [複製到答案] – Theraot