高分求教:如果通过鼠标移动速度和方向,画出有粗细变化的线条.类似于毛笔字一样的效果(300)

  • 主题发起人 主题发起人 xuegaoyili
  • 开始时间 开始时间
X

xuegaoyili

Unregistered / Unconfirmed
GUEST, unregistred user!
想实现根据鼠标移动速度和移动时的转角,画出粗细不同的线条(矢量)有例子有代码的.另开贴500分.有原理可行的.给200分顶贴10分.
 
计算鼠标每次移动的速度,根据不同的速度设置不同的宽度。
 
OnMouseMove中,记录鼠标当前位置mouse.CursorPos以及当前时间(windows.GetTickCount函数),将该信息保存到一个数组中(注意控制数组大小,及时删除不需要的数据),你可以以5个点(或移动停顿50ms)为一个计算单位,来计算期间的移动速度,根据此速度计算线宽绘制线条。个人的一些想法而已,自己没这么处理过。
 
首先让人想到的,可能都是这样.以时间或移动距离做标准.定时或等距做一次判断.但实现时,速度的获取和时间的判断不会太准吧.肯定值不能太大.但一要在到时间后,做一些计算或画图,可能就占用了一些时间.还和鼠标多长时间触发一次Move有关.当然初步是可以这样做了.我自己再顶...希望有更好的建议.楼上二位会给分的.呵
 
首先在OnMouseDown中初始化Var MCt:DWord;procedurte OnMouseDown; begin mct:=gettickcount(); end;然后在OnMouseMove中判断当前的时间; tmct:=gettickcount()-mct;然后在根据你的需要判断时间 例如:1000(1s): 细线条2000(2s): 中线条3000(3s): 粗线条等!呵呵!
 
gettickcount不够精确,建议用QueryPerformanceCounter
 
先说说我的体验,我在测试中,因为鼠标处发移动消息是固定时间段的.所以在实际中不需要计时.只需要分析一下正常鼠标移动时,每次触发时移动的距离大约处在什么范围就好.然后再根据范围画不同粗细线条.现在效果已有点了.但锯齿严重,不能使用.呵.下一步就是如何更光滑.大家一起来分析分析.画时的算法
 
我顶。“类似于毛笔字”,像这样的功能的实现在我被菜人看来简直如登天……
 
其实...我觉得可以参考PS的喷绘效果画当前鼠标点的时候不是只画一个点而是画一个半径为N的范围圆也不是完全填充,而是对中心一个大概2*2范围内填充然后在圆范围内做羽化或者扩散效果这样速度慢的自然范围就粗,速度快的就细了,显示出来的线条还平滑.....
 
你想法不错,我也见到了靠连续不同半径的画圆实现的,但效果不是太好,而且移动中进行羽化效果不现实.速度不成吧
 
呵呵,我建议你多采集毛笔的横竖等的笔画图。。。然后根据鼠标移动的起点和终点判断横竖等,然后在相应位置粘贴。。不过这样的话就出来的是固定的书体啦。。
 
看到过几家产品有此功能.难道都不是来这的人.呵
 
没什么有好办法的.就大家平分吧
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部