Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2018
256
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.67 KB | None | 0 0
  1. # -*- coding: utf_8 -*-
  2.  
  3. import gi
  4. gi.require_version('Gtk', '3.0')
  5. from gi.repository import Gtk
  6. from gi.repository import Gdk
  7. from gi.repository import GLib
  8. from gi.repository import GObject
  9. import cairo
  10. import threading
  11. import time
  12.  
  13. class Window01(Gtk.Window):
  14. def __init__(self):
  15. self.bitmap_width = 300
  16. self.bitmap_height = 300
  17. self.textview_height = 150
  18. self.window_width = 300
  19. self.window_height = self.bitmap_width + 30 + self.textview_height
  20.  
  21.  
  22. Gtk.Window.__init__(self)
  23. self.set_title('Mandelbrot Test')
  24. self.set_position(Gtk.WindowPosition.CENTER)
  25. self.set_property("width-request", self.bitmap_width)
  26. self.set_property("height-request", self.bitmap_height + 30)
  27.  
  28. self.stopflag01 = 0
  29. self.execflag01 = 0
  30.  
  31. self.load_image()
  32. self.vbox = Gtk.Box()
  33. self.vbox.set_orientation(Gtk.Orientation.VERTICAL)
  34. self.add(self.vbox)
  35.  
  36. self.darea = Gtk.DrawingArea()
  37. self.darea.set_property("width-request", self.bitmap_width)
  38. self.darea.set_property("height-request", self.bitmap_height)
  39. self.vbox.pack_start(self.darea, False, False, 0)
  40.  
  41. self.hbox = Gtk.Box()
  42. self.hbox.set_orientation(Gtk.Orientation.HORIZONTAL)
  43. self.vbox.pack_start(self.hbox, False, False, 0)
  44.  
  45. self.button03 = Gtk.Button(Gtk.STOCK_QUIT)
  46. self.button03.set_label('終了')
  47. self.hbox.pack_end(self.button03, False, False, 0)
  48. self.button03.connect('clicked', self.button03_clicked)
  49.  
  50. self.button01 = Gtk.Button()
  51. self.button01.set_label('開始')
  52. self.hbox.pack_end(self.button01, False, False, 0)
  53. self.button01.connect('clicked', self.button01_clicked)
  54.  
  55. self.button02 = Gtk.Button()
  56. self.button02.set_label('中断')
  57. self.hbox.pack_end(self.button02, False, False, 0)
  58. self.button02.connect('clicked', self.button02_clicked)
  59.  
  60. self.vbox02 = Gtk.Box()
  61. self.vbox02.set_orientation(Gtk.Orientation.VERTICAL)
  62. self.vbox.pack_start(self.vbox02, False, False, 0)
  63.  
  64. self.scrolled_window01 = Gtk.ScrolledWindow()
  65. self.scrolled_window01.set_shadow_type(Gtk.ShadowType.ETCHED_OUT)
  66. self.scrolled_window01.set_policy(Gtk.PolicyType.ALWAYS, Gtk.PolicyType.ALWAYS)
  67. self.scrolled_window01.set_property("width-request", self.window_width)
  68. self.scrolled_window01.set_property("height-request", self.textview_height)
  69. self.vbox02.pack_start(self.scrolled_window01, False, False, 0)
  70.  
  71. self.textview01 = Gtk.TextView()
  72. self.scrolled_window01.add(self.textview01)
  73. self.set_text(self.textview01, "")
  74.  
  75. self.darea.connect('draw', self.on_draw_event)
  76. self.connect('delete-event', Gtk.main_quit)
  77.  
  78. def delete_text(self, textview):
  79. buffer = textview.get_buffer()
  80. start = buffer.get_start_iter()
  81. end = buffer.get_end_iter()
  82. buffer.delete(start, end)
  83.  
  84. def set_text(self, textview, text):
  85. buffer = textview.get_buffer()
  86. buffer.set_text(text)
  87.  
  88. def append_text(self, textview, text):
  89. buffer = textview.get_buffer()
  90. iter = buffer.get_end_iter()
  91. buffer.insert(iter, text)
  92.  
  93. def scroll_to_bottom(self, scrolled_window):
  94. vadj = scrolled_window.get_vadjustment()
  95. size = vadj.get_upper() - vadj.get_page_size()
  96. if size < 0:
  97. size = 0
  98. vadj.set_value(size)
  99.  
  100.  
  101. def on_draw_event(self, drawingarea, cr):
  102. self.do_drawing(drawingarea, cr)
  103.  
  104. def do_drawing(self, drawingarea, cr):
  105. screen_width = Gdk.Screen.get_width(Gdk.Screen.get_default())
  106. screen_height = Gdk.Screen.get_height(Gdk.Screen.get_default())
  107. image_width = self.image.get_width()
  108. image_height = self.image.get_height()
  109. x_scaling = 1.0;
  110. y_scaling = 1.0;
  111. cr.scale(x_scaling, y_scaling);
  112. cr.set_source_surface (self.image, 0, 0);
  113. cr.paint ();
  114.  
  115. def load_image(self):
  116. self.image = cairo.ImageSurface(cairo.FORMAT_ARGB32, self.bitmap_width, self.bitmap_height)
  117. ic = cairo.Context(self.image)
  118.  
  119. #色の指定(外枠:Red,Green,Blue)
  120. ic.set_source_rgb(0.0, 0.0, 1.0)
  121. #長方形(x,y,width,height)を描画
  122. ic.rectangle(0.0, 0.0, self.image.get_width(), self.image.get_height())
  123. #長方形の外枠を作る
  124. ic.stroke_preserve()
  125. #色を指定(塗りつぶし:Red,Green,Blue)
  126. ic.set_source_rgb(0.0, 0.0, 1.0)
  127. #長方形を塗りつぶす
  128. ic.fill()
  129. ic.stroke()
  130.  
  131. def button01_clicked(self, button01):
  132. if self.execflag01 == 0:
  133. self.execflag01 = 1
  134. self.stopflag01 = 0
  135. self.thread = threading.Thread(target=self.thread_func)
  136. self.thread.start()
  137.  
  138. def button02_clicked(self, button02):
  139. self.stopflag01 = 1
  140.  
  141. def button03_clicked(self, button01):
  142. self.stopflag01 = 1
  143. Gtk.main_quit()
  144.  
  145. def thread_func(self):
  146. param_xcorner = []
  147. param_ycorner = []
  148. param_length = []
  149.  
  150. param_xcorner.append(-1.785666666666666e+000)
  151. param_ycorner.append(-2.508333333333312e-002)
  152. param_length.append(5.000000000000000e-002)
  153.  
  154. param_xcorner.append(-1.759984700520832e+000)
  155. param_ycorner.append(-1.518603515624978e-002)
  156. param_length.append(9.765625000000001e-005)
  157.  
  158. param_xcorner.append(-1.759906697591145e+000)
  159. param_ycorner.append(-1.515360514322895e-002)
  160. param_length.append(6.103515625000000e-006)
  161.  
  162. param_xcorner.append(-1.759901244004566e+000)
  163. param_ycorner.append(-1.515219028790770e-002)
  164. param_length.append(4.768371582031250e-008)
  165.  
  166. param_xcorner.append(-1.759901209723814e+000)
  167. param_ycorner.append(-1.515217680089193e-002)
  168. param_length.append(5.820766091346741e-012)
  169.  
  170. param_xcorner.append(-2.112213541666665e-001)
  171. param_ycorner.append(-7.939140624999994e-001)
  172. param_length.append(1.562500000000000e-003)
  173.  
  174. param_xcorner.append(-2.238124999999996e-001)
  175. param_ycorner.append(-6.581041666666665e-001)
  176. param_length.append(1.250000000000000e-002)
  177.  
  178. param_xcorner.append(-2.137343749999995e-001)
  179. param_ycorner.append(-6.554270833333333e-001)
  180. param_length.append(3.906250000000000e-004)
  181.  
  182. self.start_time = time.time()
  183.  
  184. ic = cairo.Context(self.image)
  185. for count01 in range(0, len(param_xcorner)):
  186. ic.set_source_rgb(0.0, 0.0, 1.0)
  187. ic.rectangle(0.0, 0.0, self.image.get_width(), self.image.get_height())
  188. ic.stroke_preserve()
  189. ic.set_source_rgb(0.0, 0.0, 1.0)
  190. ic.fill()
  191. ic.stroke()
  192.  
  193. xcorner = param_xcorner[count01]
  194. ycorner = param_ycorner[count01]
  195. length = param_length[count01]
  196. depth = 1000;
  197.  
  198. xgap = length / self.bitmap_width
  199. ygap = length / self.bitmap_height
  200. xx = xcorner
  201. yy = ycorner
  202.  
  203. Gdk.threads_enter()
  204. self.append_text(self.textview01, "xcorner = {0:.15e}\n".format(xcorner))
  205. self.append_text(self.textview01, "ycorner = {0:.15e}\n".format(ycorner))
  206. self.append_text(self.textview01, "length = {0:.15e}\n".format(length))
  207. self.append_text(self.textview01, "depth = {0:d}\n".format(depth))
  208. self.append_text(self.textview01, "\n")
  209. Gdk.threads_leave()
  210. time.sleep(0.005)
  211. Gdk.threads_enter()
  212. self.scroll_to_bottom(self.scrolled_window01)
  213. Gdk.threads_leave()
  214. for j in range(0, self.bitmap_height):
  215. for i in range(0, self.bitmap_width):
  216. a1 = xx
  217. b1 = yy
  218. i1 = 0
  219. x1 = 0
  220. y1 = 0
  221. x2 = x1 * x1
  222. y2 = y1 * y1
  223. while (i1 < depth) and (x2 + y2 <= 4.0):
  224. if self.stopflag01 == 1:
  225. self.execflag01 = 0
  226. return
  227. tmp1 = x2 - y2 + a1
  228. y1 = 2 * x1 * y1 + b1
  229. x1 = tmp1
  230. x2 = x1 * x1
  231. y2 = y1 * y1
  232. i1 = i1 + 1
  233. if i1 == depth:
  234. i1 = 0
  235. else:
  236. i1 = i1 + 1
  237. col = i1
  238.  
  239. Gdk.threads_enter()
  240. ic.set_source_rgb((col % 256) / 256.0, 0.0, 0.0)
  241. ic.rectangle(i, j, 1.0, 1.0)
  242. ic.stroke()
  243. Gdk.threads_leave()
  244. xx = xx + xgap
  245. yy = yy + xgap
  246. xx = xcorner
  247. if j % 5 == 0:
  248. Gdk.threads_enter()
  249. self.darea.queue_draw()
  250. Gdk.threads_leave()
  251. time.sleep(0.001)
  252. Gdk.threads_enter()
  253. self.darea.queue_draw()
  254. Gdk.threads_leave()
  255. time.sleep(0.05)
  256. self.end_time = time.time()
  257. Gdk.threads_enter()
  258. self.append_text(self.textview01, "実行時間 : {0:.4f}秒\n".format(self.end_time - self.start_time))
  259. self.scroll_to_bottom(self.scrolled_window01)
  260. Gdk.threads_leave()
  261.  
  262. self.execflag01 = 0
  263.  
  264. GObject.threads_init()
  265. Gdk.threads_init()
  266. Gdk.threads_enter()
  267. window = Window01()
  268. window.show_all()
  269. Gtk.main()
  270. Gdk.threads_leave()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement