Я хочу написать программу рисования в стиле MS Paint.
Для рисования вещей на экране, когда пользователь перемещает мышь, мне приходится ждать событий перемещения мыши и рисовать на экране всякий раз, когда я их получаю. Видимо, события перемещения mose не отправляются очень часто, поэтому мне нужно интерполировать движение мыши, вычерчивая линию между текущей позицией мыши и предыдущей. В псевдокоде это выглядит примерно так:
var positionOld = null
def handleMouseMove(positionNew):
if mouse.button.down:
if positionOld == null:
positionOld = positionNew
screen.draw.line(positionOld,positionNew)
positionOld = positionNew
Теперь мой вопрос: интерполирование с сегментами прямой линии выглядит слишком зазубренным для моего вкуса, можете ли вы рекомендовать лучший метод интерполяции? Какой метод реализует GIMP или Adobe Photoshop?
Альтернативно, есть ли способ увеличить частоту событий перемещения мыши, которые я получаю? Рамка GUI, которую я использую, wxWidgets.
Графический интерфейс: wxWidgets.
(Язык программирования: Haskell, но это не имеет значения здесь)
РЕДАКТИРОВАТЬ: Уточнение: мне нужно что-то более гладкое, чем прямые, см. изображение (исходный размер):
неровные линии, проведенные между позициями мыши http://i26.tinypic.com/hwa42h.jpg
EDIT2: Используемый мной код выглядит следующим образом:
-- create bitmap and derive drawing context
im <- imageCreateSized (sy 800 600)
bitmap <- bitmapCreateFromImage im (-1) -- wxBitmap
dc <- memoryDCCreate -- wxMemoryDC
memoryDCSelectObject dc bitmap
...
-- handle mouse move
onMouse ... sw (MouseLeftDrag posNew _) = do
...
line dc posOld posNew [color := white
, penJoin := JoinRound
, penWidth := 2]
repaint sw -- a wxScrolledWindow
-- handle paint event
onPaint ... = do
...
-- draw bitmap on the wxScrolledWindow
drawBitmap dc_sw bitmap pointZero False []
что может иметь значение. Возможно, мой выбор wx-классов - это то, почему я получаю довольно низкую частоту событий перемещения мыши.