当前位置: 首页 > news >正文

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

  印章中最常见的特殊形状通常是五角星,空心、实心的都可能存在,本文学习并实现在印章内部绘制五角星形状。
  百度五角星的绘制方法,主要分为三种:
  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

相关文章:

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

印章中最常见的特殊形状通常是五角星,空心、实心的都可能存在,本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法,主要分为三种:   1)五角星各点坐标固定,直接调用编程语言的绘制线条或…...

【C#】ThreadPool的使用

1.Thread的使用 Thread的使用参考:【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池,它能够根据需要动态地分配和回收线程…...

【Python系列】Python 中`eval()`函数的正确使用及其风险分析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用Spring Boot开发应用:基于请求参数MD5的缓存键及其他缓存方式

本文将介绍如何在Spring Boot应用中实现基于请求参数MD5的缓存键,以及其他常见的缓存方式。通过实际代码示例,展示如何应用这些技术优化系统性能。 1. 引入必要的依赖 首先,在Spring Boot项目中引入缓存相关的依赖。修改pom.xml文件&#x…...

typescript中interface常见3种用法

文章目录 函数类型对象类型【自命名】: (函数)对象类型 函数类型 作用:声明一个函数接口:可用于类型声明 | 不可implements 对象类型 作用:声明对象具备哪些实例接口:可用于类型 | 可implements 【自命名】&…...

windows10 安装CUDA教程

如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤...

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门,进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization,粒子群优化算法,通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…...

scrapy 爬取旅游景点相关数据(一)

配套视频可以前往B站:麦麦大数据 项目目标: 爬取的是穷游旅游景点列表 、评论数据 📊 章节: 😆 Scrapy 爬取旅游景点相关数据(一) 😆 Scrapy 爬取旅游景点相关数据(二) &…...

构建铁塔基站安全防护网:视频AI智能监控技术引领智慧化转型

一、背景现状 随着通信技术的快速发展,铁塔基站作为重要的通信基础设施,其安全、稳定、高效的运行对于保障通信网络的畅通至关重要。然而,铁塔基站大多分布在公路边、高山、野外等区域,巡检难度大,维护效率低&#xf…...

Java中的分布式缓存:Ehcache与Hazelcast

Java中的分布式缓存:Ehcache与Hazelcast 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的两种分布式缓存技术:Ehcache与Hazelcast。分布式缓存可以显…...

前端开发工程师的薪资,主要取决于哪3个方面?

作者:清水束竹 从2022年开始,互联网行业的就业情况就不容乐观了。 最明显的三个表现:裁员、缩招、降薪。 其实2021-2022年年中那段时间,互联网企业出现了一波假性繁荣。 某些大厂Q大量招聘应届毕业生,宣传铺天盖地,不…...

springboot美食网站—计算机毕业设计源码11574

摘 要 随着人们生活水平的提高,人们对美食的要求也越来越高,对各类美食信息需求越来越大。因此,结合计算机快速发展、普及,在此基础上制作一个页面简单、美观,功能实用的美食网站势在必行,满足用户分享美食的需求。 美…...

WordPress建站:如何使用ChemiCloud搭建外贸独立站

以前自行搭建一个网站,不懂一点技术那是很难完成的,现如今WordPress的出现极大地降低了搭建网站的技术门槛,不需要懂任何代码,只需按步骤操作就行。WordPress 是一个非常流行的开源内容管理系统(CMS)&#…...

在 Vim 编辑器中,如果某个单词被意外地高亮显示,使用:noh可以取消高亮显示

文章目录 1、问题出现的背景2、解决办法 1、问题出现的背景 配置镜像加速器,修改 /etc/docker/daemon.json 目录下的文件,不小心高亮显示https,产生问题的步骤是,我先是按esc键退出vim的编辑模式,然后在https的前面按…...

一条命令安装mysql,php

一条命令安装mysql,php,wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp...

配置maven环境

一、把maven文件下载到D盘下 二、创建一个maven文件夹,并在其中创建一个repository文件夹 三、桌面右键单击属性设置,搜索环境 添加MAVEN HOME变量,让然后把apache-maven路径下的bin文件的路径复制进来 用记事本或者NotePad打开下图路径的set…...

飞书打卡 快捷指令

使用快捷指令定时飞书打卡 在网上找了一圈,只有钉钉打卡的快捷指令,但是公司换飞书,哪个打工人不怕忘记打卡呢,所以自己研究了一下,其实也很简单。 找url 问题的最关键是打开飞书的打卡界面 如果只是打开飞书APP 很…...

LeYOLO,一种用于目标检测的新型可扩展且高效的CNN架构

摘要 在目标检测中,深度神经网络的计算效率至关重要,尤其是随着新型模型越来越注重速度而非有效计算量(FLOP)。这一发展趋势在某种程度上忽视了嵌入式和面向移动设备的AI目标检测应用。在本文中,我们基于FLOP关注于高…...

docker安装phpMyAdmin

直接安装phpMyAdmin需要有php环境,比较麻烦,总结了使用docker安装方法,并提供docker镜像。 1.docker镜像 见我上传的docker镜像:https://download.csdn.net/download/taotao_guiwang/89595177 2.安装 1).加载镜像 docker load …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

数据库分批入库

今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...