C#基于SkiaSharp实现印章管理(5)

news2024/9/9 6:56:19

  印章中最常见的特殊形状通常是五角星,空心、实心的都可能存在,本文学习并实现在印章内部绘制五角星形状。
  百度五角星的绘制方法,主要分为三种:
  1)五角星各点坐标固定,直接调用编程语言的绘制线条或绘制多边形的函数绘制五角星;
  2)利用编程语言中的旋转变换方式简化五角星绘图逻辑,如Python中的turtle模块,绘制五角星时就是绘直线->转向->绘直线,C#的GDI+和SkiaSharp模块都支持旋转变换,但相对Python而言则复杂得多;
  3)利用公式计算各点坐标,以五角星中某点为基准,计算其余九个点的坐标,然后调用编程语言的绘制线条或绘制多边形的函数绘制五角星。

  本文选择第三种方式,使用参考文献4中的计算公式计算各点坐标,下图也来自参考文献4。
在这里插入图片描述
  更新FigureType枚举,增加五角星类型,同时调整SealElement定义,为了与后续绘制文本时保持一致,增加Content字符串属性,将五角星10个点的坐标以特定格式保存在Content属性中,并在绘图时解析、绘制。
  创建新建五角星窗口(如下图所示),使用StartPoint属性保存起点坐标,用EndPoint的X属性保存五角星边长,其它设置保持不变。点击确定时基于参考文献4的计算公式计算各点坐标,不过测试过程中发现公式并不完全正确,使用基于公式计算参考文献2的各点坐标时个别点的坐标计算公式有误(F、G,同时各点的Y坐标都没有加起始点的Y坐标值),最终各点坐标计算方式如下代码所示:

在这里插入图片描述

double angle18 = 18 * Math.PI / 180;
double angle36 = 36 * Math.PI / 180;
float sinValue = Convert.ToSingle(Math.Round(Math.Sin(angle18), 2));
float cosValue = Convert.ToSingle(Math.Round(Math.Cos(angle18), 2));
float sinValueLong36 = Convert.ToSingle(Math.Round(Math.Sin(angle36) * m_element.EndPoint.X, 2));
float cosValueLong36 = Convert.ToSingle(Math.Round(Math.Cos(angle36) * m_element.EndPoint.X, 2));
float sinValueLong = Convert.ToSingle(Math.Round(sinValue *m_element.EndPoint.X));
float cosValueLong = Convert.ToSingle(Math.Round(cosValue * m_element.EndPoint.X));
float sinValueLong2 = 2 * sinValueLong;
float cosValueLong2 = 2 * cosValueLong;

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append($"{m_element.StartPoint.X},{m_element.StartPoint.Y};");//A
stringBuilder.Append($"{m_element.StartPoint.X+ sinValueLong},{m_element.StartPoint.Y+ cosValueLong};");//C
stringBuilder.Append($"{m_element.StartPoint.X + sinValueLong + m_element.EndPoint.X},{m_element.StartPoint.Y + cosValueLong};");//E
stringBuilder.Append($"{m_element.StartPoint.X + sinValueLong+m_element.EndPoint.X-cosValueLong36},{m_element.StartPoint.Y + cosValueLong+ sinValueLong36};");//G
stringBuilder.Append($"{m_element.StartPoint.X + sinValueLong2*sinValue + sinValueLong2},{m_element.StartPoint.Y + sinValueLong2 * cosValue + cosValueLong2};");//I
stringBuilder.Append($"{m_element.StartPoint.X},{m_element.StartPoint.Y+cosValueLong2+sinValueLong2*cosValue-sinValueLong36};");//J
stringBuilder.Append($"{m_element.StartPoint.X - sinValueLong2 * sinValue - sinValueLong2},{m_element.StartPoint.Y + sinValueLong2 * cosValue + cosValueLong2};");//H
stringBuilder.Append($"{m_element.StartPoint.X - sinValueLong - m_element.EndPoint.X+ cosValueLong36},{m_element.StartPoint.Y + cosValueLong + sinValueLong36};");//F
stringBuilder.Append($"{m_element.StartPoint.X-sinValueLong-m_element.EndPoint.X},{m_element.StartPoint.Y+cosValueLong};");//D
stringBuilder.Append($"{m_element.StartPoint.X-sinValueLong},{m_element.StartPoint.Y+cosValueLong};");//B
stringBuilder.Append($"{m_element.StartPoint.X},{m_element.StartPoint.Y}");//A

  绘制五角星时,最初采用canvas.DrawPoints函数,但测试时发现无论SKPaint的Style设置为Stroke或Fill,显示时都是按边框方式显示,暂时不清楚怎么回事,最终换为先创建SKPath,再调用AddPoly添加形状,最终调用canvas.DrawPath绘制形状的方式解决问题。
  最后是程序运行效果,包括显示边框和填充两种方式:
在这里插入图片描述
在这里插入图片描述
参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88
[2]https://www.cnblogs.com/bhnian/p/16343557.html
[3]https://www.jb51.net/html5/676291.html
[4]https://blog.csdn.net/L_Shaker/article/details/127313457
[5]https://blog.csdn.net/qq_42716155/article/details/105024837

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

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

相关文章

线性结构、线性表、顺序表、链表、头插法、尾插法、中间插入或删除一个节点

梳理几个名词: 逻辑地址:就是说是第几个元素。 物理地址:也就是存储地址,在计算机里具体存放的位置。 线性表的存储结构分为: (1)顺序存储结构:将数据依次存储在连续的整块物理空…

综合项目部署——eleme前端部署(eighteen day)

显示没有空格没有注释的内容: [rootstatic-server ~]# grep -Ev "#|^$" /usr/local/nginx/conf/nginx.conf 1、多虚拟主机的配置 [rootstatic-server ~]# vim /usr/local/nginx/conf/nginx.conf [rootstatic-server ~]# /usr/local/nginx/sbin/nginx #启…

如何破解绩效管理的难题?

绩效管理的核心问题 💼 在现代企业运营中,绩效管理一直被视为提升工作效率和实现公司战略目标的重要手段。然而,实际操作中,我们经常会遇到一系列棘手的问题,这些问题不仅影响了绩效管理的有效性,还常常让…

winform程序中拷贝文件夹最快速方法

1、先将一个项目的文件夹拷贝到另一个项目的目录下 下图将ParameterSetting文件夹拷贝到Datalib文件夹下 2、直接复制该文件,然后到vs界面去粘贴 复制ParameterSetting文件夹,然后在Datalib项目这里鼠标右键单击,然后点击“粘贴”&#xff0…

机器学习(五) -- 无监督学习(2) --降维2

系列文章目录及链接 上篇:机器学习(五) -- 无监督学习(2) --降维1 下篇: 前言 tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被…

《动手做科研》06. 如何产生新的研究想法

地址链接:《动手做科研》06. 如何产生新的研究想法 欢迎加入我的知识星球,定期分享AI论文干货知识! 导读: 提出好的研究想法是相当困难的,特别是当你刚接触一个领域时——这需要对文献中的空白有所了解。然而,产生研究想法的过程可…

数学建模--智能算法之模拟退火算法

目录 算法原理 应用场景 实现方法 代码示例: MATLAB: Python: 总结 模拟退火算法在数学建模中的具体应用案例有哪些? 如何选择模拟退火算法的参数(如初始温度、冷却率等)以优化求解过程&#xff1…

根据json构建uml类图代码工具实现

文章目录 1.UML简介1.1 什么是UML建模1.2 使用UML建模的好处 2.当前UML在研发场景下痛点3.UML工具的优化实现3.1 json结构设计3.2 json类图解析器实现3.3 在线uml类图渲染实现3.3.1 前端渲染页面3.3.2 后端数据接口 3.4 在线渲染效果 4. 总结 【摘要】本文介绍UML基本概念及相关…

Linux中安装C#的.net,创建运行后端或控制台项目

安装脚本命令: 创建一个sh文件并将该文件更改权限运行 sudo apt update wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt-get upd…

科普文:Spring Cloud Alibaba在GraalVM上的性能测试

GraalVM 介绍 GraalVM概述 - Spring Cloud Alibaba官网 科普文:GraalVM简介-CSDN博客 科普文:OpenJDK vs. GraalVM vs. Amazon Corretto性能测试-CSDN博客 科普文:【方向盘】OpenJDK生态圈-CSDN博客 科普文:Oracle JDK收费后…

【32单片机篇】项目:实时时钟

一、项目需求 1. OLED屏幕显示当前时间、日期、闹钟等信息; 2. 正常模式下,按下 KEY1 ,进入时间设置模式,此时按下 KEY2 则可以循环跳转修改秒、分、时、日、月、年; 3. 时间设置模式下,KEY3 增加数值&…

【Redis】如何利用 Redis 实现一个分布式锁?

👏大家好!我是和风coding,希望我的文章能给你带来帮助! 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝点击 我的主页 还可以看到和风的其他内容噢&#x…

【优秀python算法设计】基于Python网络爬虫的今日头条新闻数据分析与热度预测模型构建的设计与实现

1 绪论 1.1 背景与意义 随着互联网的快速发展和移动互联技术的普及,作为新兴的资讯平台,今日头条成为了用户获取新闻资讯、时事热点和个性化推荐的重要渠道。大量用户在今日头条上浏览、阅读并产生热度,使得今日头条成为了观察舆论热点和分…

Csrf复习(pikachu靶场和防御手段)

CSRF漏洞简介 CSRF又称跨站请求伪造,是指攻击者在用户登录的状态下(浏览器保存了用户的cookie)通过伪造恶意url诱导用户点击,借助用户的cookie网站权限(冒充用户身份来进行非法操作,对于服务器来说是合法的…

达梦数据库系列—36.分区表

目录 1、分区表的分类 1.1 范围分区表 1.2 List分区表 1.3 哈希分区表 1.4 多级分区表 二级分区 三级分区 2、分区表的维护 2.1 增加分区 2.2 删除分区 2.3 交换分区 2.4 融合分区 3、全局索引和局部索引 1、分区表的分类 范围(range)水平分区:对表中…

【LLM大模型】AI大模型大厂面试真题:「2024大厂大模型技术岗内部面试题+答案」

AI大模型岗的大厂门槛又降低了!实在太缺人了,大模型岗位真的强烈建议各位多投提前批,▶️众所周知,2025届秋招提前批已经打响,🙋在这里真心建议大家6月7月一定要多投提前批! 💻我们…

【深度学习|目标跟踪】SSD+Sort实现MOT!

SSDSort实现目标跟踪 源码地址1、🙌🏻匈牙利匹配算法1.1 什么是匈牙利匹配1.2 什么是二分图:1.3 最大匹配1.4 最优匹配1.5 最小点覆盖1.6 交替路1.7 增广路1.8 匈牙利匹配具体流程以及实例1.9 广度优先匹配1.10 深度优先匹配1.11 给匹配加权来…

SQL—数据库与表操作

目录 SQL语句分类 DDL 数据库操作 1. 查询所有数据库 2. 查询当前数据库 3. 创建数据库 案例:创建一个itcast数据库,使用数据库默认的字符集 案例:创建一个itheima数据库,并且指定字符集 4. 删除数据库 5. 切换数据库…

Java从入门到精通 (十) ~ 计算机是如何工作的呢 ?

每天进步一点点,每天创造一点点,每天做事多一点,愿你事事都领先,卓越成绩现眼前,美好生活一天又一天。 文章目录 目录 前言 前置知识 认识一下计算机的真实相貌 都说计算机使用二进制传输,为什么要使…

哇!0.8秒启动!Linux快速启动方案分享,全志T113-i国产平台!

本文主要介绍基于创龙科技TLT113-EVM评估板(基于全志T113-i)的系统快速启动方案,适用开发环境如下。 Windows开发环境:Windows 7 64bit、Windows 10 64bit 虚拟机:VMware15.5.5 Linux开发环境:Ubuntu18.04.4 64bit U-Boot:U-Boot-2018.07 Kernel:Linux-5.4.61、Li…