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

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

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

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

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

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

  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. 【JVM第3课】运行时数据区

    运行时数据区结构图如下: 可分为 5 个区域,分别是方法区.堆区.虚拟机栈.本地方法栈.程序计数器.这里大概介绍一下各个模块的作用,会在后面的文章展开讲. 类加载子系统会把类信息加载到方法区,程序运行 ...

  2. HJ17 坐标移动问题 ——秋招笔试

    HJ17 坐标移动问题 华为笔试[难度中等] 问题描述: 开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动.从(0,0)点开始移动,从输入字符串里面读取一些坐标, ...

  3. Lattice、Xilinx FPGA reg初始化赋值问题

    一.起因 最近在开发Lattice的一款低功耗FPGA时,遇到了reg初始化复位问题,经过在网上搜寻相关资料整理如下: 二.FPGA中reg的初始化方式 在定义时初始化,例如: reg r_test ...

  4. 一款WPF开发的B站视频下载开源项目

    更多开源项目请查看:一个专注推荐优秀.Net开源项目的榜单 今天给推荐一款C#开发的.界面简洁的哔哩哔哩视频下载工具. 项目简介 这是一款基于WPF开发的,B站下载工具,操作界面简洁,支持多线程下载. ...

  5. python库asyncio的概念和用法

    python 库 asyncio asyncio 是 Python 的标准库之一,用于编写异步应用程序.它提供了事件循环.协程.任务和其他工具来处理并发操作.以下是一些关于 asyncio 的基本概念 ...

  6. MySQL无开通SQL全审计下的故障分析方法

    几年前MySQL数据库出现突然的从库延迟故障和CPU爆高时,如何排查具体原因,可能说已在腾讯云的MySQL库里开启了SQL全审计,记录了全部执行的SQL,再通过下面的方法就可以很容易找到原因: 1,实 ...

  7. Linux系统搭建性能测试监控体系

    一.安装Grafana 1.Grafana介绍(默认端口3000): Grafana是一个开源的监控和可视化工具,用于显示和跟踪各种指标,数据和日志,支持多种源,包括influxDB.promethe ...

  8. Mybatis中foreach的使用

    首先我们要明白的是foreach的本质就是把数据库能执行的sql在xml中按照一定语法来进行拼接,所以拼接之前,我们了解一下foreach标签中几个常见元素的作用 1.collection ‌List ...

  9. MySQL原理简介—1.SQL的执行流程

    大纲(2426字) 1.MySQL驱动的作用 2.Java系统中的数据库连接池的作用 3.MySQL中的数据库连接池的作用 4.网络连接必须让线程来处理 5.SQL接口会负责处理接收到的SQL语句 6 ...

  10. 使用YARP来实现负载均衡

    YARP ("Yet Another Reverse Proxy") 是一个库,可帮助创建高性能.生产就绪且高度可自定义的反向代理服务器. YARP 是使用 ASP.NET 和 . ...