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

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

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

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

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

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

  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. Spire.Pdf打印PDF文件

    1 /// <summary> 2 /// Spire.Pdf打印PDF文件 3 /// </summary> 4 /// <param name="fileN ...

  2. Java面试题中高级进阶(JVM篇Java内存)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java内存结构?说说对象分配规则?描述一下JVM加载class文件的原理机制?似乎有点模糊了,那就大概看一下面试题吧.好记性不如烂键 ...

  3. [Linux]学习之路---树梅派4B出现打开文件管理器闪退等问题

    直接控制台运行命令: sudo apt-get install --reinstall pcmanfm 后面的pcmanfm,是一个功能齐全的Linux上的轻量级文件管理器,我自己的记忆方法就是: P ...

  4. Redis的ZSet底层数据结构,ZSet类型全面解析

    文章目录 一.ZSet有序集合类型 1.1 简介 1.2 应用场景 1.3 底层结构 1.4 ZSet常用命令 二.ZSet底层结构详解 2.1 数据结构 2.2 压缩列表ZipList 2.3 跳表 ...

  5. 无法访问k8s.gcr.io下载镜像问题解决办法

    部署K8S最大的难题是镜像下载,在国内无FQ环境情况下很难从k8s.gcr.io等镜像源里下载镜像. 这种情况下正确做法是: 直接指定国内镜像代理仓库(如阿里云代理仓库)进行镜像拉取下载. 成功拉取代 ...

  6. 你的WAF是否真的安全?雷池社区版的安全能力测试

    你的WAF能力如何?雷池社区版的安全能力测试 最近雷池社区版很火,各大技术群都在讨论 什么是雷池? 引用官网文档的一段话: SafeLine,中文名 "雷池",是一款简单好用, 效 ...

  7. Air780E如何发送SMS?一文详解!

    ​ 今天一起来学习使用合宙低功耗4G模组Air780E发送SMS短消息: 一.SMS简介 SMS(短消息服务,ShortMessageService)功能主要用于在蜂窝网络中传输短消息. 在4G网络中 ...

  8. python操作sqlite的小例子

    照着菜鸟教程 学习python操作sqlite ubuntu 安装 sudo apte-get install sqlite3 找到了 sqlite3/bionic-updates,bionic-se ...

  9. Python之常见问题

    一.问题出现:使用Pycharm设置虚拟环境后,打开终端出现如下报错:无法加载文件-\venv\Scripts\activate.ps1,因为在此系统上禁止运行脚本. 解决方式已管理员的身份打开pow ...

  10. Lnmp编译安装(2020)

    之前写过几篇有关安装lnmp环境的文章,现在回顾感觉有些比较老了或者并不是好的操作,于是更新这篇 1. 安装Nginx 1) 依赖安装 yum install gcc gcc-c++ openssl ...