当用户移动鼠标时,我需要等待鼠标移动事件,并在接收到事件时在屏幕上进行绘制。显然,鼠标移动事件并不经常发送,因此我必须通过在当前鼠标位置和上一个位置之间绘制一条线来插值鼠标移动。 伪代码如下:
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。
GUI框架:wxWidgets。
(编程语言为Haskell,但这里与本题无关)
编辑:澄清:我想要比直线段更平滑的东西,参见图片(原始大小):
编辑2: 我正在使用的代码看起来像这样:
-- 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-classes选择是我得到相对较低的鼠标移动事件频率的原因。