用 PIL 繪製二次貝塞爾曲線

2021-05-07 11:09:06 字數 3699 閱讀 6887

pil(python image library) 中有 line, ellipse, rectangle 等常規繪圖的函式,但缺少繪製曲線的函式,今天我的需求中需要繪製乙個二次貝塞爾曲線(兩個端點,乙個控制點)。無奈之下,到網上找了乙個 c 語言寫的演算法,把它寫成了 python 的,並且寫成了類的形式。

#coding=utf-8

#二次貝塞爾曲線繪圖程式

#木野狐(neil chen) http://rchen.cnblogs.com

#2007-5-16

#根據 c 程式改寫為 python 類的形式,參考:

'''# 畫出切線

self.moveto(p[0])

for i in range(1, m+1):

self.lineto(p[i])

'''pk 

={}  

#pk[129][2]

fori 

inrange(m +1

):pk[i] 

=p[i]

pt =

{} #

pt[129][2]

fork 

inrange(kt +1

):for

i in

range(0, m +1

, 2):pt[2*

i] =

pk[i]

fori 

inrange(m):

pt[2*i 

+1] =

(int(pk[i][0] 

+pk[i+1

][0]) 

>>1,

int(pk[i][1] 

+pk[i+1

][1]) >>1)

fori 

inrange(

1, m):

pt[2

*i] =(

int(pt[2*

i-1][0] 

+pt[2*

i+1][0]) 

>>1,

int(pt[2*

i-1][

1] +pt[2*

i+1][

1]) 

>>1)

fori 

inrange(2*

m +1):

pk[i] 

=pt[i]

ifk 

==kt:

break

m <<=

1self.moveto(pk[0])

fori 

inrange(1, 

2*m +

1):self.lineto(pk[i])

#測試**

if__name__=='

__main__':

im =

image.new(

'rgba

', (

1024

,1024

), (

255,

255,

255))

draw 

=imagedraw.draw(im)

points =((

150,

300), (

300,

200), (

485,

300))b =

bezier2(draw, points, 

1, (0,0,

255))

b.render()

points2 =((

150,

300), (

100,

400), (

485,

300))

b2 =

bezier2(draw, points2, 

3, (0,

255,0))

b2.render()

deldraw

im.show()

繪製貝塞爾Bezier曲線

trainingtools.cpp 定義控制台應用程式的入口點。include include include include include include using namespace std const int ww max mark count 40 最大40個控制點 int mark c...

OPENGL繪製貝塞爾曲線

最終效果圖 通過3個點形成一條貝塞爾曲線 1.滑鼠問題 在使用滑鼠獲取座標的時候,要知道滑鼠獲取的座標和螢幕座標是不同的 opengl使用右手座標 從左到右,x遞增 從下到上,y遞增 從遠到近,z遞增 而滑鼠是從左到右增x,同時從上到下也是增y 所以在求 y 的時候,用 螢幕大小 y 來獲取 2.繪...

繪製貝塞爾曲線通用方法

計算三次貝塞爾曲線,後面n n 3 計算時,都是將點分成一組一組的三次貝塞爾曲線 skpoint calcthreebezier wm5 vector2d ptw1,wm5 vector2d ptw2,wm5 vector2d ptw3 繪製貝塞爾曲線函式 void drawbezier vecto...