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

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

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

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

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

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

  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. jeecg平台相关01-vue2迁移到vue3

    01-vue2迁移到vue3 嵌套: datasource: master: url: jdbc:mysql://127.0.0.1:3306/jeecg-boot-vue3?characterEnc ...

  2. Power BI新卡片更改显示单位

    Power BI 不知道什么时候发布了新卡片,照现在官方来说,该视觉对象目前还属于预览版,但已经可以正常使用了,对比旧的卡片,显示效果个人觉得会友好一些,详见官方说明:创建"新"卡 ...

  3. IntelliJ IDEA 2024.1 安装激活 (亲测有效!)

    第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接 也可以在这里点击下载idea下载idea 第二步: 安装 ID ...

  4. AI游戏外挂:强化学习算法用于棋牌类游戏的最优出牌策略 —— 如何在“斗地主”中使用AI技术获得最高胜率

    相关: https://zh.wikipedia.org/wiki/十三張 去年原打算接的一个小项目,不过后来没有搞下去,这里只记录一下. 这个项目的主要需要完成的一个功能就是图像识别,识别屏幕上的牌 ...

  5. 关于C++当中的“模板函数”

    本人C++草鸟,在工作当中遇到了这个问题,就简单做个记录.

  6. 解读Karmada多云容器编排技术,加速分布式云原生应用升级

    本文分享自来源:<华为云DTSE>第五期开源专刊,作者:任洪彩 华为云高级软件工程师,Karmada社区Maintainer.   管理和协调跨多个云平台的容器化应用是当前企业面临的复杂性 ...

  7. 【一步步开发AI运动小程序】一、准备工作

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  8. vue父组件向子组件传递一个对象,使用一个对象绑定多个 prop

    如果你想要将一个对象的所有属性都当作 props 传入,你可以使用没有参数的 v-bind,即只使用 v-bind 而非 :prop-name.例如,这里有一个 post 对象: export def ...

  9. Linux之新增硬盘,分区,挂载

    1.新增硬盘后, 查看当前磁盘信息 fdisk -l 可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令: fdisk /dev/sdb  给第二块硬盘进行分区 ...

  10. 抓包工具之Fiddler(详解)

    Fiddle简介 Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler包含了一个强大的基于 ...