質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2581閲覧

[Gtk+]マウスで描いた線をなめらかにしたい

Jot

総合スコア10

GTK+

GTK+とはGUIを作るために作られた、とても使いやすく機能に富んだツールキットです。クロスプラットフォームによる互換性と、使いやすいAPIを備えています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/06 06:29

編集2022/01/12 10:55

前提・実現したいこと

マウスを使ってちょっとした絵が描けるソフトを作っています。
言語は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がイベントを取得するレートを上げられればいいのですが、実際に上げられるのか調べてみてもよくわかりません。
変更する方法があればお教えいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2018/10/06 10:25

マウスイベントのポーリングレート (取得間隔) をあげたりすることはできないのでしょうか?
guest

回答1

0

スプライン曲線とかベジエ曲線とか、そこらへんのキーワードでぐぐってみるとしあわせになれるかもしれません

投稿2018/10/06 08:32

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問