前言 本人在业余时间,开发了一款电子印章制作软件。印章制作软件看似简单,其实不然。

比如对椭圆形印章而言,要求公司名称中的每一个字间隔相等,要求字的方向与椭圆曲线垂直。

要满足这些条件,需要复杂的计算,并且要有一定的几何学基础。软件界面如下:

点击下载发票印章生成工具。

本文主要讲述椭圆形印章制作思路,对于圆形印章 ,软件开发难度并不大。

椭圆印章要满足以下两个条件:

  1 公司名称字体间隔大小要一样。

  2 字体方向与对应的椭圆曲线是相切的。

下面分析如何通过程序满足这两点要求。

 1 计算椭圆的弧线长度

  假设公司名称占了椭圆220度边长,如何计算出220度弧线的长度? 肯定有数学公式可以计算。我没有用公式计算。我联想到了“微积分”的概念。可以将这一段弧线切成几千份小的弧线,把小的弧线段长度加起来就是总的长度。小的弧线段长度非常小,可以用两点之间的直线长度代替。

假设将弧线分成n份,将这n个线段长度加起来就是弧线长度。

       /// <summary>
/// 将弧线分成splitCount份,计算弧线上的点
/// </summary>
/// <param name="startDegree">弧线起始度数</param>
/// <param name="splitCount">分成多少份</param>
/// <returns></returns>
List<PointDouble> GetDrawPoint(double startDegree, int splitCount)
{
double a = EllipseWidth / 2;
double b = EllipseHeight / 2; List<PointDouble> result = new List<PointDouble>(); Graphics g = Graphics;
for (int i = 0; i < splitCount; i++)
{
double degree = startDegree + (i * CompanySpanDegree) / splitCount;
double k = Math.Tan(ToArc(degree));
//Debug.WriteLine(string.Format("degree:{0}", degree));
PointDouble ptDraw = new PointDouble();
if (degree < 90)
{
if (intersections[0].X < 0)
{
ptDraw = intersections[0];
}
else if (intersections[0].X > 0)
{
ptDraw = intersections[1];
}
else
{
}
}
else if (degree > 90)
{
if (intersections[0].X > 0)
{
ptDraw = intersections[0];
}
else if (intersections[0].X < 0)
{
ptDraw = intersections[1];
}
else
{
}
}
else
{
if (intersections[0].Y < 0)
{
ptDraw = intersections[0];
}
else
{
ptDraw = intersections[1];
}
} result.Add(ptDraw);
} return result;
}

2 确定每个文字的坐标。

弧线总长度计算处理后,就可以算出每个文字占用的弧线长度,根据每个文字占用的弧线长度就可以计算出文字的坐标。

        List<PointDouble> CalDrawPoint(float startDegree, int txtCount)
{
List<double> listLenPart = new List<double>();
List<PointDouble> listPoint = GetDrawPoint(startDegree, 10000);
//计算弧线长度
double arcLen = ;
//每个文字占用的弧线长度
double txtSpanPer = arcLen / (txtCount - 1); //计算文字对应的点
List<PointDouble> result = new List<PointDouble>();
result.Add(listPoint[0]); double lenSpanCal = 0;
for (int i = 0; i < listLenPart.Count; i++)
{
double n = listLenPart[i];
lenSpanCal += n;
if (lenSpanCal >= txtSpanPer)
{
result.Add(listPoint[i + 1]);
lenSpanCal = 0;
}
} if (result.Count < txtCount)
result.Add(listPoint.Last()); Debug.Assert(result.Count == txtCount);
return result;
}

3 计算文字的旋转角度

 确定了文字的坐标后,就可以计算出该点对应的切线,从而求出切线角度。切线公式如下:

计算切线坐标源码如下:

       /// <summary>
/// 计算椭圆切线的角度
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
float CalTangentLineDegree(float x, float y)
{
if (y == 0)
return 90; float a = EllipseWidth / 2;
float b = EllipseHeight / 2;
float k = -b * b * x / (a * a * y);
float result = (float)Math.Atan(k);
result = (float)ToDegree(result);
return result;
}

文字的坐标和旋转角度确定后,后续处理就水到渠成:

 程序界面截图:

搜索

复制

C# 开发电子印章制作工具 -- 附下载程序的更多相关文章

  1. .NET软件开发与常用工具清单

    [工欲善其事,必先利其器]软件开发的第一步就是选择高效.智能的工具. 下面列出的工具软件能辅助提高工作效率.  开发类工具 微软.Net平台下的集成开发环境:Visual Studio. Visual ...

  2. 01-1制作U盘启动盘--大白菜超级U盘启动盘制作工具

    使用大白菜超级U盘启动盘制作工具制作U盘启动盘  工具/材料: 电脑.U盘.浏览器.大白菜u盘启动制作工具. 操作方法: 打开浏览器,输入大白菜,点击普通下载进行大白菜u盘启动制作工具下载: 或者通过 ...

  3. 第3章 如何用DAP仿真器下载程序

    第3章     如何用DAP仿真器下载程序 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  4. 第3章 如何用DAP仿真器下载程序—零死角玩转STM32-F429系列

    第3章     如何用DAP仿真器下载程序 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...

  5. QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)

    前两天入手了一块2.8’的tft液晶显示屏,于是和树莓派连了一发,成功将命令行显示在了这块小的可怜的屏幕上之后,觉得这屏幕就显示个黑白内容太浪费了,于是考虑开发一个”脸”(图形用户界面,GUI).首先 ...

  6. BAT等大厂已开源的70个实用工具盘点(附下载地址)

    前面的一篇文章<微软.谷歌.亚马逊.Facebook等硅谷大厂91个开源软件盘点(附下载地址)>列举了国外8个互联网公司(包括微软.Google.亚马逊.IBM.Facebook.Twit ...

  7. Mac OS平台下应用程序安装包制作工具Packages的使用介绍

    一.介绍 Windows下面开发好的应用程序要进行分发时有很多打包工具可供选择,如Inno Setup, InstallShield, NSIS, Advanced Installer, Qt Ins ...

  8. C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!!

    原文:C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!! 一般我们在开发Winodws Phone APP 的时候往 ...

  9. Visual Studio 2012 开发环境配置+控制台工具+桌面应用程序

    一.界面布局视图设置 1.窗口的布局.控制台窗口运行恢复到开发环境的设置方法 也可以保存好设好的个性化设置,导入设置: 2.视图|服务器资源管理器(sever explorer) 可以访问数据源.服务 ...

  10. 微信小程序-工具的下载与安装

    QQ讨论群:785071190 安装开发工具 前往 开发者工具下载页面 ,根据自己的操作系统下载对应的安装包进行安装,有关开发者工具更详细的介绍可以查看 <开发者工具介绍> .工具安装非常 ...

随机推荐

  1. 根据docker镜像反推dockerfile

    Dockerfile 是一个文本文件,其中包含我们为了构建 Docker 镜像而手动执行的所有命令. Docker 可以从 Dockerfile 中读取指令来自动构建镜像.我们可以使用 docker ...

  2. Ansible自动化管理集群,Playbook语法

    Ansible配置文件存在优先级的问题 ANSIBLE_CONFIG ansible.cfg 项目目录 .ansible.cfg 当前用户的家目录 /etc/ansible/ansible.cfg A ...

  3. Redis未授权漏洞复现

    目录 Redis 漏洞的产生条件及利用 Redis环境搭建 漏洞复现 利用Redis写入Webshell 利用Redis写入SSH公钥 利用Redis写入计划任务 Redis安全防护 Redis re ...

  4. DDD之理解复杂度、尊重复杂度、掌控复杂度

    本文书接上回<懂了这个道理,人月神话不再是神话!>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术交流: ...

  5. 【昌哥IT课堂】MySQL8.4.0新特性:FLUSH_PRIVILEGES动态权限细化与隔离[译]

    介绍MySQL 支持 RELOAD 权限.现在,想象一个数据库用户被授予了 RELOAD 权限,这允许该用户在系统上执行 FLUSH PRIVILEGES 语句.假设该用户意外地执行了另一个强大的语句 ...

  6. flask+gunicorn+supervisor部署项目

    一.安装模块 pip install gunicorn gevent # 如果使用python supervisor,需要安装模块 pip install supervisor # 建议使用yum安装 ...

  7. paramiko模块的使用

    简介: Paramiko是基于Python(2.7,3.4+)版本实现和封装了SSHv2协议,底层是用cryptography实现,我们如果希望远程登录主机或者远程下载或者上传文件到远程主机都可以使用 ...

  8. golang不同版本特性

    Go 1.0[1]  - 2012 年 3 月: 随着 Go 第一个版本发布的还有一份兼容性说明文档[2] .该文档承诺,Go 的未来版本会尽可能确保向后兼容性,不会破坏现有程序. For insta ...

  9. PHP之JWT的token登录认证

    1.JWT简介 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为 ...

  10. Clickhouse之数据删除方式

    什么是TTL? TTL的意思是Time To Live表示数据的存活时间.由于数据的价值会根据保存的时间成反比,出于存储成本的考虑通常只会保留近一年的数据.而在MergeTree (合并树)引擎中,可 ...