具体实施方式
图1为本发明基于触摸屏的毛笔笔形处理方法实施例的流程图,如图1所示,本实施例的方法可以包括:
步骤101、检测用户当前的触摸点位置。
具体来说,当用户需要在触摸屏上写出毛笔笔形的字体时,用户可以在触摸屏上进行触摸操作,相应的,处理器可以检测用户在该触摸屏上操作的触摸点位置。
本实施例并不限定检测该触摸点位置的具体算法,本领域技术人员可以根据需要自行选择或设计出所需精度的检测算法。
本实施例中,可以将检测到的当前的触摸点位置的坐标记为(xn,yn)。
步骤102、根据当前触摸点位置的坐标、单笔中所包含的触摸点的个数以及前一个或者前几个渲染点的坐标,确定当前渲染点的坐标。
为了逼真地呈现出毛笔渲染的效果,本实施例需要根据当前触摸点的坐标来确定出当前渲染点的坐标,该渲染点的坐标与单笔中所包含的触摸点的个数以及前一个或者前几个渲染点的坐标相关。
具体来说,毛笔在宣纸上书写时,在运笔过后,宣纸上的墨迹逐渐扩散,墨迹的轨迹与毛笔运动轨迹有一定延迟,既毛笔书写过后宣纸上的墨迹逐渐扩散开形成最终笔画,因此,本实施例需要采用触摸点来得出具有一定时延的渲染点,从而可以逼真地模拟毛笔笔形有延时渲染的效果。
在具体实现时,可以采用下述公式(1)来确定渲染点的坐标(xn′,yn′):
其中,n为单笔中触摸点的个数,xn′-1,xn′-2,xn′-3分别为前一个、前两个、前三个渲染点的横坐标,yn′-1,yn′-2,yn′-3分别为前一个、前两个、前三个渲染点的纵坐标。
本领域技术人员可以理解的是,上述公式(1)也可以进行合理变形,例如所乘的系数可以改变,或者,在n≥3时,均采用1/4(xn+2xn′-1+xn′-2)。
步骤103、根据单笔中所包含的触摸点的个数、笔形基本宽度、单笔起笔处的触摸点的个数、当前触摸点和前一个渲染点之间的距离,确定笔形宽度。
为了逼真地呈现出毛笔笔形向周围渲染的效果,本实施例在确定笔形宽度时可以考虑单笔中所包含的触摸点的个数、笔形基本宽度、单笔起笔处的触摸点的个数、当前触摸点和前一个渲染点之间的距离。
在具体实现时,可以采用下述公式(2)来确定笔形宽度width:
其中,n为单笔中触摸点的个数,K为笔形变化系数,baseWidth为笔形基本宽度,startcount为单笔起笔处的触摸点的个数,q为变化指数,distance为当前触摸点和前一个渲染点之间的距离,
本领域技术人员可以理解的是,上述公式(2)也可以进行合理变形,例如,不管n与startcount之间的大小关系,均可以采用其中一个表达式来计算笔形宽度width。
优选的,K的取值可以为30,baseWidth的取值可以为20,q取值可以为0.6。
步骤104、采用宽度为笔形宽度的连接线连接前一渲染点及当前渲染点以进行毛笔笔形绘制,并显示给该用户。
具体来说,若当前渲染点不为最后一点,则可以用宽度为笔形宽度width的连接线连接前一渲染点及当前渲染点,其中连接线起始处及结尾处连接有直径为笔形宽度width的半圆,该半圆能够使得连接线接缝处较为平滑。
若当前渲染点为最后一点,且单笔中渲染点的个数小于等于3个,则用宽度为笔形宽度width的连接线连接前一渲染点及当前渲染点,其中连接线起始处及结尾处连接有直径为笔形宽度width的半圆;若当前渲染点是最后一点且单笔中渲染点的个数大于3个,则在当前渲染点后添加至少一个收笔渲染点,并以连接线连接最末渲染点及各个收笔渲染点,连接线的宽度为上次连接线宽度乘以收笔宽度衰减系数G,以增加毛笔结尾处拖拽的效果。
举例来说,该收笔渲染点的横纵坐标xln,yln由下述公式(3)确定:
xln=2xl-1+(xl-1-xl-2)·(D+1)、yln=2yl-1+(yl-1-yl-2)·(D+1) (3)
其中,xl-1为当前收笔渲染点的前一渲染点的横坐标,xl-2为当前收笔渲染点的前两渲染点的横坐标,yl-1为当前收笔渲染点的前一渲染点的纵坐标,yl-2为当前收笔渲染点的前两渲染点的纵坐标,D为收笔宽度衰减系数。
其中,
其中distancel1_l2为当前收笔渲染点的前一渲染点到前两渲染点的距离,distancel2_l3为当前收笔渲染点的前两渲染点到前三渲染点的距离,endCount为添加的收笔渲染点个数,p为收笔指数。
优选的,endCount可以取为5,G可以取0.8。
本实施例,通过用户当前触摸点位置的坐标、单笔中所包含的触摸点的个数以及前一个或者前几个渲染点的坐标,可以确定当前渲染点的坐标;根据单笔中所包含的触摸点的个数、笔形基本宽度、单笔起笔处的触摸点的个数、当前触摸点和前一个渲染点之间的距离,可以确定笔形宽度;进一步可以采用宽度为笔形宽度width的连接线连接前一渲染点及当前渲染点以进行毛笔笔形绘制,并显示给该用户,从而可以在触摸屏上逼真地呈现毛笔笔形,满足用户的需求。
图2为本发明基于触摸屏的毛笔笔形处理装置实施例的结构示意图,如图2所示,本实施例的装置可以包括:
检测模块11、坐标确定模块12、笔形宽度确定模块13以及绘制显示模块14;
其中,检测模块11,用于检测用户当前的触摸点位置;
坐标确定模块12,用于根据当前触摸点位置的坐标、单笔中所包含的触摸点的个数以及前一个或者前几个渲染点的坐标,确定当前渲染点的坐标;
笔形宽度确定模块13,用于根据单笔中所包含的触摸点的个数、笔形基本宽度、单笔起笔处的触摸点的个数、当前触摸点和前一个渲染点之间的距离,确定笔形宽度;
绘制显示模块14,用于采用宽度为笔形宽度的连接线连接前一渲染点及当前渲染点以进行毛笔笔形绘制,并显示给该用户。
进一步的,坐标确定模块12,具体用于采用下述公式(1)来确定渲染点的坐标(xn′,yn′):
其中,n为单笔中触摸点的个数,xn′-1,xn′-2,xn′-3分别为前一个、前两个、前三个渲染点的横坐标,yn′-1,yn′-2,yn′-3分别为前一个、前两个、前三个渲染点的纵坐标。
进一步的,笔形宽度确定模块13,具体用于采用下述公式(2)来确定笔形宽度width:
其中,n为单笔中触摸点的个数,K为笔形变化系数,baseWidth为笔形基本宽度,startcount为单笔起笔处的触摸点的个数,q为变化指数,distance为当前触摸点和前一个渲染点之间的距离,
进一步的,绘制显示模块14,具体用于若当前渲染点不为最后一点,则采用宽度为笔形宽度的连接线连接前一渲染点及当前渲染点,其中连接线起始处及结尾处连接有直径为笔形宽度的半圆;
若当前渲染点为最后一点,且单笔中渲染点的个数小于等于3个,则用宽度为笔形宽度的连接线连接前一渲染点及当前渲染点,其中连接线起始处及结尾处连接有直径为笔形宽度的半圆;若当前渲染点是最后一点且单笔中渲染点的个数大于3个,则在当前渲染点后添加至少一个收笔渲染点,并以连接线连接最末渲染点及各个收笔渲染点,连接线的宽度为上次连接线宽度乘以收笔宽度衰减系数。
进一步的,收笔渲染点的坐标采用下述公式(3)确定:
xln=2xl-1+(xl-1-xl-2)·(D+1)、yln=2yl-1+(yl-1-yl-2)·(D+1) (3)
其中,xl-1为当前收笔渲染点的前一渲染点的横坐标,xl-2为当前收笔渲染点的前两渲染点的横坐标,yl-1为当前收笔渲染点的前一渲染点的纵坐标,yl-2为当前收笔渲染点的前两渲染点的纵坐标,D为收笔宽度衰减系数;
其中distancel1_l2为当前收笔渲染点的前一渲染点到前两渲染点的距离,distancel2_l3为当前收笔渲染点的前两渲染点到前三渲染点的距离,endCount为添加的收笔渲染点个数,p为收笔指数。
本实施例的装置可以用于执行图1所示方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。