DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: randy522732557
今日帖子: 25
在线用户: 14
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/25 22:18:55
标题:
关于安卓手写笔的写字问题 浏览:1471
加入我的收藏
楼主: 用过华为的一款平板后,想着手写文字算法有三个难点:
一、笔画精细问题;
目前只掌握了通过笔触数组连线,这样简单的连线会有一定的锯齿。真正的利用曲线路径算法,还不得要领;
二、笔画粗细问题
自然的笔画,提笔落笔有粗细变化,这个应该是一个非常难的问题,牵涉到压力传感器
三、防误触问题
这个也不好弄,需要获得手写笔的驱动,然后只有笔写才可触发mousedown\mousemove事件
有弄过的大神指点指点
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/10/25 23:18:08
1楼: did try use Graphics32 ported to FMX (on Github) ?
https://github.com/zhaoyipeng/graphics32-for-Firemonkey


Image32 Cross-Platform (Delphi / Lazarus)
https://github.com/AngusJohnson/Image32
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/26 8:22:33
2楼: 关于第一个问题,应该采用贝塞尔曲线进行绘制,实现光滑平滑
----------------------------------------------
-
作者:
男 emailx45 (emailx45) ▲▲▲▲△ -
普通会员
2023/10/26 8:47:17
3楼: did you read this?
https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Graphics.TCustomCanvas.PolyBezier
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2023/10/26 8:58:42
4楼: 简单地用手写的密集像素点生产Bezier可能出现飞线。真要用Bezier要先抽样,并保持线条的特征,就像coredraw里的手绘线条。并不完全和画的时候一模一样,是平滑过的。而且Bezier是不过控制点的,当然也有过控制点的平滑算法,如三次样条,五点多项式等。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/26 12:35:11
5楼: FMX似乎没有提供对贝塞尔曲线的支持,但TPath和Canvas.drawpath功能似乎非常强大,准备好好地研究一下。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/26 17:48:33
6楼: 一、关于笔画精细问题
使用贝塞尔曲线拟合算法,取连续两个点,将其中点作为贝塞尔曲线控制点形成pathdata后drawpath,现已经彻底解决文字或绘图锯齿问题。
现在继续研究第二个和第三个问题。
第二个要获得压力传感的力度,然后将其转换为笔画宽度,这是一个艰巨的任务。
第三个问题要获得笔的驱动程序,而且要在fmx android中调用,几乎没有完成的可能性。
----------------------------------------------
-
作者:
男 tuao (tuao) ★☆☆☆☆ -
盒子活跃会员
2023/10/27 8:51:06
7楼: 期待楼主深入研究,带领大家一起学xi。
----------------------------------------------
tuao
作者:
男 powerpcer (大强) ★☆☆☆☆ -
禁用账号
2023/10/27 9:40:21
8楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
呆湾傻冒
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/27 11:03:51
9楼: 手写板签名,很有可能写的文字图片不如装入的图片分辨率高,这样保存后的图片,写的文字会变模糊。
解决的问题是把写字的pathdata放大一倍,由于svg图形可以无限放大,这样保存后没有任何失真。
----------------------------------------------
-
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2023/10/27 11:12:50
10楼: https://www.cnblogs.com/etfsoft/p/12972692.html
这个人做的的笔锋效果不错
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/27 12:20:45
11楼: 看来要解决误触,需要禁止多点触控。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
禁用账号
2023/10/27 12:31:26
12楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
呆湾傻冒
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/27 20:12:59
13楼: 关于第三个问题:防误触已经通过算法彻底解决。
如果想从硬件方面解决触摸屏防误触是不太可能的,也不能寄望厂家提供此功能。
想从手势事件中去弄也很难,特别是在delphi fmx android里,也放弃。

只能从算法中去解决。
仔细分析所谓在屏幕写字绘画过程的误触,是有规律的。
所谓误触与正常书写的本质区别是,自然书写,在一个落笔和提笔的过程中,本次形成的点和上一个点必然是连续的,如果连续两点相距太远,例如大于50个像素则必为误触。这样解决起来简单多了。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/27 20:18:10
14楼: 现在解决第二个问题,笔画粗细问题,看来这个问题真有难度,主要在如何获取触控笔的压力数据,压力传感器会加的数据应该与时间或者位置有关,继续探索。
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/10/29 3:54:12
15楼: 网上有文章(好像是CSDN博客Android 签名,Java)不用读压力传感器来模拟粗细的,是通过计算笔的速度来实现的(固定时间内移动的点数),这样就可以适用于没有压感的触摸屏。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/29 8:02:48
16楼: 谢谢楼上大师指点迷津,我继续推演,有结果我再汇报
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/10/30 22:52:24
17楼: 博客园有篇文章,写的不错,看演示程序,效果也不错。
https://www.cnblogs.com/zl03jsj/p/8047259.html
java和C++实现
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/10/31 19:49:17
18楼: 求得每个点的即时速度,然后笔画粗细与速度的倒数正相关?
这个思路稍微想想,肯定是有问题的:如果写字时在某处停顿,速度为0呢?
必须要一个基准值,即无论再快不能低于此值,无论再慢不能高于此值。
另外,一个字有时要经过多次落笔和提笔,但从汉字书写来看,一般最后这笔速度会慢但笔画逐渐变细,这与前面的大前提相矛盾。
最后,如何求一个点的即时速度,用距离除以时间?这个是平均速度吧?
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2023/10/31 23:49:05
19楼: 哈,思路是按速度来说的,但是代码实现不是这样的,有个简化的思维。比如文章里的k系数,就是用来控制的。为了简化,作者还简化了控制点的计算,附有两个演示程序,后一个改进算法的DEMO的效果还可以。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/1 8:19:30
20楼: 毕竟是java写的,它本来就是写安卓的,这个在delpi里没办法实现,例如android里有个VelocityTracker类可以监控手和笔在屏幕里划动的即时速度,这个在java里很容易,但在fmx里不知道怎么弄。
----------------------------------------------
-
作者:
男 powerpcer (大强) ★☆☆☆☆ -
禁用账号
2023/11/1 9:30:09
21楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
呆湾傻冒
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2023/11/2 19:30:48
22楼: 笔画宽度与速度负相关,即与速度的倒数正相关(不一定是线性的),则笔画宽度肯定与时间正相关,即两点间经过终点的时间越长,则两点间连线的笔画宽度越宽。
使用类似 
 StartT:=TThread.GetTickCount;
.....
 EndT:=TThread.GetTickCount;
....
 MyBrush.Thickness := Roundto((EndT-StartT)/YZ,-2);
YZ是一个时间转化为宽度的计算因子。上述公式即可反应出写得慢笔画宽写得快笔画细。
道理是这样,但按此思路写的代码,虽然有笔锋了,但效果不行,主要原因是笔锋宽度对时间不敏感。看来要把时间加平方了
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行66.40625毫秒 RSS