Android-原笔迹手写的探索与开发
前言
这篇文章主要是关于移动端原笔迹的开发,让平板上的手写效果达到笔迹光滑且有笔锋。
- 介绍关于原笔迹的算法思路。
- 项目github地址
算法思路分析
曲线拟合算法
利用曲线拟合算法增加虚拟的点,使得笔迹更加光滑,关于算法思想本文采用的是B样条插值算法。
采集点:获取笔输出的两个关键点a1、a2,以及a1和a2附近的几个点a3,a4;
拟合点:利用a1,a2,a3,a4计算出a1和a2之间曲线的步长,再根据步长计算出a1与a2之间所有的点,所
计算出的点即为曲线上的点;
简单图示:

梯形填充笔迹
利用梯形填充思想来实现笔锋的效果。
获取笔宽:获取到a1与a2两点笔的压力,转换成对应的宽度作为此段起点和终点的宽度d1,d2,以d1与、
d2差再除以a1与a2点之间的个数得到曲线点之间笔宽的差值,再计算出该段曲线上所有点a1,b1...bn,a2
对应的笔宽l1...ln;
计算梯形:利用曲线上相邻的点和对应的笔宽计算出梯形,利用图形模块的填充效果将梯形填充;
处理梯形连接处:对于每个梯形连接处,根据此处关键点特征区分为不做处理,画线以及画椭圆,并且
将连接处填充,即生成原笔迹效果;
简单图示:


项目地址
关于github代码地址:https://github.com/doubledouble123/Pens
手写效果展示:

总结
本文通过曲线拟合算法和梯形填充算法完成了原笔迹效果的实现,增加了平板的书写体验。
Android-原笔迹手写的探索与开发的更多相关文章
- 【原】手写一个promise
上一篇文章中,我们介绍了Promise的基本使用,在这篇文章中,我们试着自己来写一个Promise,主要是学习Promise的内部机制,学习它的编程思想. !!!备注:本文写的不好,仅供自己学习之用, ...
- 【原】手写spring async异步组件
最近在工作中使用到了spring自带的Async,主要是为了把其中耗时多.响应慢.计算复杂的业务抽取几个模块出来,并行查询.不得不说spring自带的比传统线程池提交在代码层次上看起来优雅简洁了不少 ...
- android 逆向 smali手写helloworld
编写Hello.smali文件 .class public LHelloWorld; .super Ljava/lang/Object; .method public static main([Lja ...
- 手写web框架之开发一个类加载器
ackage io.renren.common; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUti ...
- Android 手写Binder 教你理解android中的进程间通信
关于Binder,我就不解释的太多了,网上一搜资料一堆,但是估计还是很多人理解的有困难.今天就教你如何从 app层面来理解好Binder. 其实就从我们普通app开发者的角度来看,仅仅对于androi ...
- opencv 手写选择题阅卷 (四)Android端 手机应用开发
opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...
- android 开源 OCR 项目 及手写识别
http://blog.csdn.net/archfree/article/details/6023676 1)一个为Android平台,将识别由手机的相机拍摄的图像文本应用程序. http://co ...
- Android Binder机制详解:手写IPC通信
想要掌握一样东西,最好的方式就是阅读理解它的源码.想要掌握Android Binder,最好的方式就是写一个AIDL文件,然后查看其生成的代码.本文的思路也是来自于此. 简介 Binder是Andro ...
- Android+TensorFlow+CNN+MNIST 手写数字识别实现
Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...
随机推荐
- const用法体会
const三个原则: 第一,如果你参数里面的变量在函数体内不改变,那么把该参数定义成const... : 第二,如果你的函数不会改变类里面的成员变量,把该函数定义成const成员函数,Eg: int ...
- 定时器Timer的使用
概述 Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类.执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类. 方法schedule(ta ...
- 利用AOP实现SqlSugar自动事务
先看一下效果,带接口层的三层架构: BL层: public class StudentBL : IStudentService { private ILogger mLogger; private r ...
- 20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)
通过 QPainter 绘画实现,以本地图片985*740为例 如下图所示: 效果如下所示: 实现原理 主要通过以下函数实现: , ); //平铺显示pixmap //x y w h :表示绘画区域 ...
- Servlet到底是单例还是多例你了解吗?
为一个Java Web开发者,你一定了解和学习过Servlet.或许还曾在面试中被问到过Servelt是单例还是多例这个问题. 遇到这个问题,你是否曾深入了解过,还是百度或者Google了一下,得到答 ...
- selenium提供的截图功能
get_screenshot_as_file()提供一个截屏功能.在自动化执行过程中,执行失败后只能看到代码的运行错误,而不能直接看到ui上的错误,利用截屏保存下来很容易的进行问题的判断 先来执行一个 ...
- 前端学习总结(一)——常见数据结构的javascript实现
1.列表类 // 列表类 function List() { this.listSize = 0; // 列表的元素个数 this.pos = 0; // 列表的当前位置 this.dataStore ...
- Jquery样式
css样式只有一个的时候: $(function(){ $('p').css('background-color','green'); }) css样式有多个的时候: $(function(){ $( ...
- [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks
概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexN ...
- 转[@SuppressWarnings详解]
背景知识: 从JDK5开始提供名为Annotation(注释)的功能,它被定义为JSR-175规范.注释是以“@注释名”在代码中存在的,还可以添加一些参数 值,例如:@SuppressWa ...