前提・実現したいこと
マウスを使ってちょっとした絵が描けるソフトを作っています。
言語はPython3で、GUIにはGtk+、描画にはCairoを使っています。
現時点で、マウスで線を描くことはできるのですが、マウスをすばやく動かすと以下の画像のように取得されたカーソル座標の密度が低くなり、線がカクカクになってしまいます。
線をなるべくなめらかにしたいのですが、この状態を改善する方法はあるでしょうか?
該当のソースコード
Python
1import cairo 2import gi; gi.require_version('Gtk', '3.0') 3from gi.repository import Gtk, Gdk 4 5class Brush(object): 6 def __init__(self, width, rgba_color): 7 self.width = width 8 self.rgba_color = rgba_color 9 self.stroke = [] 10 11 def add_point(self, point): 12 self.stroke.append(point) 13 14class Canvas(object): 15 def __init__(self): 16 draw_area = Gtk.DrawingArea() 17 draw_area.connect('draw', self.draw) 18 draw_area.connect('motion-notify-event', self.mouse_move) 19 draw_area.connect('button-press-event', self.mouse_press) 20 draw_area.connect('button-release-event', self.mouse_release) 21 draw_area.set_events(draw_area.get_events() | 22 Gdk.EventMask.BUTTON_PRESS_MASK | 23 Gdk.EventMask.POINTER_MOTION_MASK | 24 Gdk.EventMask.BUTTON_RELEASE_MASK) 25 self.draw_area = draw_area 26 self.brushes = [] 27 28 def draw(self, widget, cr): 29 cr.set_source_rgba(1.0, 1.0, 1.0, 1) 30 cr.paint() 31 32 for brush in self.brushes: 33 cr.set_source_rgba(*brush.rgba_color) 34 cr.set_line_width(brush.width) 35 cr.set_line_cap(1) 36 cr.set_line_join(cairo.LINE_JOIN_ROUND) 37 cr.new_path() 38 for x, y in brush.stroke: 39 cr.line_to(x, y) 40 cr.stroke() 41 42 def mouse_move(self, widget, event): 43 if event.state & Gdk.EventMask.BUTTON_PRESS_MASK: 44 curr_brush = self.brushes[-1] 45 curr_brush.add_point((event.x, event.y)) 46 widget.queue_draw() 47 48 def mouse_press(self, widget, event): 49 if event.button == Gdk.BUTTON_PRIMARY: 50 rgba_color = (1.0,0.0,0.0,1.0) 51 brush = Brush(2,rgba_color) 52 brush.add_point((event.x, event.y)) 53 self.brushes.append(brush) 54 widget.queue_draw() 55 elif event.button == Gdk.BUTTON_SECONDARY: 56 self.brushes.pop() 57 58 def mouse_release(self, widget, event): 59 widget.queue_draw() 60 61 62class DrawWin(Gtk.Window): 63 def __init__(self): 64 Gtk.Window.__init__(self) 65 self.set_title("Drawing") 66 self.connect("delete-event", Gtk.main_quit) 67 hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0) 68 self.canvas = Canvas() 69 hbox.pack_start(self.canvas.draw_area,True, True, 0) 70 self.add(hbox) 71 self.show_all() 72 73DrawWin() 74Gtk.main()
追記
Gtkがイベントを取得するレートを上げられればいいのですが、実際に上げられるのか調べてみてもよくわかりません。
変更する方法があればお教えいただけると幸いです。