GL绘制自定义线条4_使用OpenGL ES实现钢笔效果

news2024/11/19 19:21:11

     在以前的文章里http://t.csdnimg.cn/TgCtl,我简述了如何使用OpenGL ES实现光滑的粗线条的绘制效果,在闲暇时间我把它再进一步进化,实现了端点长度按照压感大小实现伸缩的逻辑,从而实现了如下的笔锋效果:

        

书写过程中的效果可看:

【使用OpenGL ES实现压感笔书写适配】 使用OpenGL ES实现压感笔书写适配_哔哩哔哩_bilibili

使用OpenGL ES实现压感笔书写适配

具体实现方式:

  1. 触摸点归一化
  2. 坐标转换
  3. bezier细化
  4. 依靠向量方向生成端点

假设有下面这样一条曲线:

先设置一个-width/2到原点,和width/2到原点的两个初始端点,例如这样:

那么每个微分的位置,它的两个连接点都会构成一个向量,通过这个向量可以获取到每一个微分的部位相对于初始端点的旋转量。

实际端点形成的效果:

        在上一篇文章使用贝塞尔算法平滑线条曲率之前基础增加以下逻辑

double ratio = 1f;
if (mPrevPressure == Float.MIN_VALUE) {
    ratio = Math.min(1f, pressure / maxPressure);
} else {
    float delta = (pressure - mPrevPressure) / points.size();
    ratio = Math.min(1f, (mPrevPressure + delta * i) / maxPressure);
}
float width = (float) (mLineWidth * ratio);
addPointToBuffer(pointF.x, pointF.y, colorARGB, width);

        即在细分曲线过程压力一个压力值缓慢一份份变化当前压力值使得压力值过度变得平滑,即可得到随压力值平滑过度的书写曲线了,就像钢笔写的一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1478603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MCBPS配置成SPI

MCBPS配置成SPI 典型的SPI接口 McBSP作为SPI主机 以McBSP为主的SPI接口如图所示。当McBSP被配置为主控器时,发送输出信号(DX)被用作SPI协议的SPISIMO信号,并且接收输入信号(DR)被用作SPISOMI信号。 表列出了将McBSP配置为主控器所需的寄存器位值。下表是有关配置要求…

动环监控是什么?为什么说它是3d可视化机房的眼睛?

在信息化时代的背景下,数据中心机房的重要性日益凸显,传统的人工管理模式显然已经无法应对持续增长的机房数量和规模、日益复杂的网络、频繁更新迭代的资产硬件......搭建3d可视化机房成为了许多企事业单位的共同选择。想要搭建3d可视化机房,…

iOS中卡顿产生的主要原因及优化思路

卡顿本质上是一个UI体验上的问题,而UI的渲染及显示,主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms,就会在屏幕vsync信号到来时无法更新屏幕内容,进而导致卡顿。 iOS中UI渲染主要包含Layout->Draw->Prepare->Co…

在原有项目进行业务逻辑开发:同一用户短时间不得提交多次申请,以及更新主表时数据刷新掉了角色权限以及密码重置的问题,详细思路及代码

开发背景: 用户提交表单后,插入到对应数据库表的字段中去,因需要保存是哪一个用户提交的,所以需要拿到主表的user_id,更新功能为记录提交时间,短时间不得再次提交 在对一个已有角色权限分配,登录…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境: WIN10 杂牌蓝牙耳机6s 问题描述: 蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备 解决方案: 1.打开设备和打印机,找到这个设备 2.选中这个设备&#…

【iOS ARKit】协作 Session 实例

协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术,ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场(View)。如果用户在某一个位置新创建了一个 ARAnchor,这时…

C++之善用const修饰成员函数

C之善用const修饰成员函数 文章目录 C之善用const修饰成员函数前言1. 约束函数对成员变量的修改2. 允许 const 对象调用3. 在重载函数中提供重载决策总结 前言 ​ 在C编程中,使用const修饰成员函数是一种非常重要的技术手段,它能够提高代码的可维护性、…

基于Python微博舆情数据爬虫可视化分析系统+可视化+情感分析+爬虫+机器学习(完整系统源码+数据库+详细文档)

文章目录 基于Python微博舆情数据爬虫可视化分析系统可视化情感分析爬虫机器学习(完整系统源码数据库详细文档)源码资料获取在文章末尾1、项目介绍 Pycharm介绍Python语言Echarts简介Navicat Premium 15简介MySQL简介Flask简介 2、项目界面UI详情源码资料…

事物管理(黑马学习笔记)

事物回顾 在数据库阶段我们已学习过事务了,我们讲到: 事物是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时…

Windows PowerShell 命令行历史记录补全

Windows 命令行历史记录补全 使用 powershell 安装PSReadLine 2.1.0 Install-Module PSReadLine -RequiredVersion 2.1.0检查是否存在配置文件 Test-path $profile # 为 false 则执行命令创建 New-item –type file –force $profile编辑配置文件 notepad $profile# 输入如下…

springboot 实现本地文件存储

springboot 实现本地文件存储 实现过程 上传文件保存文件(本地磁盘)返回文件HTTP访问服务器路径给前端,进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务,对于SpringBoot而言,其对静态资源访问提供了很…

Python程序的流程

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 年轻是我们唯一拥有权利去编制梦想的时…

VDP (vSphere Data Protection)vsphere备份组件

一 概述 传统的备份:在需要备份的主机上安装备份代理,通过网络连接备份服务器对备份代理发出指令从而将备份数据传输到备份服务器所连接的存储中 不足: 每个虚拟机使用过多的物理资源(备份很占资源)备份过程中&#…

谷歌SEO推广提高网站点击率的10个秘籍-华媒舍

在当今数字化时代,拥有一个高点击率的网站对于企业和个人而言至关重要。通过谷歌SEO推广,可以帮助网站吸引更多的流量,并在搜索引擎结果页面(SERP)中获得更好的排名。本文将介绍10个谷歌SEO推广的秘籍,帮助…

高瓴张磊入籍新加坡,这代表了什么?

文|新熔财经 作者|显洋 这两天,海外媒体报道了中国投资大佬与企业家拿到新加坡永居的事儿。本来乏善可陈的文章,却因为一个人名的出现变得有趣起来——高瓴创始人张磊,一位曾经在国内如日中天,但今天鲜少…

算法沉淀——动态规划之两个数组的 dp(下)(leetcode真题剖析)

算法沉淀——动态规划之两个数组的 dp 01.正则表达式匹配02.交错字符串03.两个字符串的最小ASCII删除和04.最长重复子数组 01.正则表达式匹配 题目链接:https://leetcode.cn/problems/regular-expression-matching/ 给你一个字符串 s 和一个字符规律 p&#xff0c…

音频提取使用什么方法?视频提取音频

在数字技术与多媒体日益普及的今天,音频提取已成为一个常见且重要的任务。无论是为了制作视频、编辑音乐,还是进行语音识别和分析,我们都需要从原始材料中提取音频。那么,音频提取通常使用什么方法呢? 1. 使用专业的音…

Cap0:TensorRT环境搭建

文章目录 1、安装TensorRT1.1、下载TensorRT压缩包1.2、配置环境变量 2、测试2.1、测试源码2.2、编译源码 1、安装TensorRT TensorRT是针对NVIDIA显卡设备的加速方案,你要使用TensorRT则证明你有一定的深度学习基础,那么在你的Ubuntu上配置好显卡驱动、…

【Unity每日一记】角色控制器Character Contorller

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

Django学习记录——管理员-登录注销的实现

1.管理员案例 1.1管理员数据库 1.1.1 表结构 1.1.2 管理员表的建立 class Admin(models.Model):"""管理员表"""username models.CharField(max_length32, verbose_name"用户名")password models.CharField(max_length64, verbose…