りりべんじ

前回の塗りつぶしをちょっとだけ速くしました。

今回の参考はこちら。
http://lee.phys.titech.ac.jp/~yasutake/PaintArea.html

ちゃんと考え方にそえているのか、はなはだ疑問ですがね。 

ホントは以前書いた次の日くらいにやったけど、なぜか上手くいかず諦めて、「こんなアルゴリズムも組めんのか・・」とナーバスになったのだけど、今日見直してみたら、わずか一文字のミスだったorz

上が前回ので、下が今回の。


速くなった!速くなったよー・・・、はや・・・く、なったよ・・・。


今回のクソソース
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
import Tkinter as Tk
 
class Color:
color = "red"
Buffer = []
canvas = Tk.Canvas
 
def go(self,event):
self.Buffer = []
width = self.canvas.winfo_width()
height = self.canvas.winfo_height()
x = event.x
y = event.y
lx = self.getLeftEdge(x,y,0)
rx = self.getRightEdge(x,y,width)
self.drawLine(lx,rx,y)
self.scanLine(lx,rx,y-1,y)
self.scanLine(lx,rx,y+1,y)
self.fill(width,height)
return
 
def fill(self,width,height):
n=0
while 1:
if len(self.Buffer) <= 0:
break
lx = self.Buffer[0][0]
rx = self.Buffer[0][1]
y = self.Buffer[0][2]
tp = self.Buffer[0][3]
print n
n+=1
if y < 0 or y > height:
break
if tp==1 or tp==2 or tp==5 or tp==6:
lx = self.getLeftEdge(lx,y,0)
if tp==1 or tp==3 or tp==5 or tp==7:
rx = self.getRightEdge(rx,y,width)
self.drawLine(lx,rx,y)
if tp in range(1,5):
self.scanLine(lx,rx,y-1,y)
if tp==1 or tp==2:
self.scanLine(lx,self.Buffer[0][0],y+1,y)
if tp==1 or tp==3:
self.scanLine(self.Buffer[0][1],rx,y+1,y)
else:
self.scanLine(lx,rx,y+1,y)
if tp==5 or tp==6:
self.scanLine(lx,self.Buffer[0][0],y-1,y)
if tp==5 or tp==7:
self.scanLine(self.Buffer[0][1],rx,y-1,y)
self.Buffer.pop(0)
print "done"
return
 
def scanLine(self,start_x,end_x,y,master_y):
flag = False
for x in range(start_x,end_x+1):
if self.hit(x,y):
continue
if not flag:
if x == start_x:
if self.hit(x-1,y):
left = [x,0]
else:
left = [x,1]
flag = True
else:
if self.hit(x-1,y):
left = [x,0]
flag = True
else:
if x == end_x:
if self.hit(x+1,y):
right = [x,0]
else:
right = [x,1]
flag = False
self.setBuffer(left,right,y,master_y)
else:
if self.hit(x+1,y):
right = [x,0]
flag = False
self.setBuffer(left,right,y,master_y)
 
def setBuffer(self,left,right,y,master_y):
if y < master_y: top = True
else: top = False
if left[1] == 1 and right[1] == 1:
if top: ftype = 1
else: ftype = 5
if left[1] == 1 and right[1] == 0:
if top: ftype = 2
else: ftype = 6
if left[1] == 0 and right[1] == 1:
if top: ftype = 3
else: ftype = 7
if left[1] == 0 and right[1] == 0:
if top: ftype = 4
else: ftype = 8
field = [left[0],right[0],y,ftype]
self.Buffer.append(field)
 
def getLeftEdge(self,x,y,min_x):
while 1:
if self.hit(x-1,y) or x-1 <= min_x:
return x
x -= 1
 
def getRightEdge(self,x,y,max_x):
while 1:
if self.hit(x+1,y) or x+1 >= max_x:
return x
x += 1
 
def hit(self,x,y):
ls = self.canvas.find_overlapping(x,y,x,y)
if len(ls) > 0:
return True
else:
return False
 
def drawLine(self,left,right,y):
self.canvas.create_line(left,y,right+1,y,
fill=self.color)
 
def main():
window = Tk.Tk()
canvas = Tk.Canvas(window,bg="white",width=300,height=200)
canvas.pack()
Color.canvas = canvas
ls = [15,15,200,60,140,80,190,120,140,130,130,70,125,180,35,140,25,5]
canvas.create_line(ls)
width = int(canvas.cget('width'))
height = int(canvas.cget('height'))
canvas.create_line(0,2,width,2,width,height,2,height,2,0,width=1)
canvas.create_oval(60,60,120,120,width=1,fill="")
color = Color()
canvas.bind("<1>",color.go)
 
window.mainloop()
 
 
if __name__ == '__main__':
main()
 
関連記事

コメント

コメントの投稿

非公開コメント

このブログについて
□ ブログ内容
決まった趣旨はありません。
興味を持ったこと・日常で行ったことを何でも書きます。

3DCG・プログラミングなどが多めです。

□ 現在の活動
・ウェブサイト制作
 (http://tiblab.net)
・3Dゲーム制作
 (コックパニック)
検索フォーム
ユーザータグ

Blender キャプチャ blendファイル BGE Python GameEngine ムービー Android CG  Red5 Terragen C# C++ 

カテゴリー
プロフィール

TiBra

Author:TiBra
趣味でCG制作、プログラミング等を行っています。メイカーズに憧れています。

ネットを通じた交流を広げたく思っていますので、コメント・メールはお気軽にどぞー

戯言程度のことは、こちらのブログに投稿しています。基本戯言なので、実質移転しているようなものです。

Mail:tibraあっとlive.jp
HP:TibLabmemocode
動画:VimeoFC2動画ニコニコ
ファイル:SkyDrive
企画:3Dゲーム作業実況

Blogリンク
不都合がございましたらご連絡ください。
当ブログのリンクバナー
FC2 ID
FC2カウンター
RSSフィード+解析コード