数字图像处理程序总结

项目介绍:该项目,类似于Photoshop,CAD等专业制图软件(当然,功能没他们那么强大),该软件,主要是工业的图像处理。

项目接近尾声了,主要关键算法、思路如下:

1.鼠标点到最近图的距离——判断选中线段,

2.鼠标点是否在多边形凸形图的内——判断选中多边形

3.计算机中,角度的旋转计算,sin(PI*角度/180),cos(PI*角度/180)的相关计算

4.设计模式、架构——很重要。这里用到了适配器模式,三层等

5.精度问题,无论什么语言,计算机处理小数的问题,精度不是很准确,不同的语言,我想应该处理的方式不同。我使用的是C来写后台,C#写界面和逻辑部分

6.屏幕、界面、打印机之间的分辨率转换,以及英寸、毫米、分辨率的转换

7.对象的序列化、反序列化。

项目简图:

相关代码及链接:

 1         /// 点到线段的距离(像素)
 2         /// </summary>
 3         public static double PointLine_Disp(double xx, double yy, double x1, double y1, double x2, double y2)
 4         {
 5             double a, b, c, ang1, ang2, ang, m;
 6             double result = 0;
 7             //分别计算三条边的长度
 8             a = Math.Sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy)));
 9             if (a == 0)
10                 return -1;
11             b = Math.Sqrt((x2 - xx) * (x2 - xx) + (y2 - yy) * (y2 - yy)));
12             if (b == 0)
13                 return -1;
14             c = Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)));
15             //如果线段是一个点则退出函数并返回距离
16             if (c == 0)
17             {
18                 result = a;
19                 return result;
20             }
21             //如果点(xx,yy到点x1,y1)这条边短
22             if (a < b)
23             {
24                 //如果直线段AB是水平线。得到直线段AB的弧度
25                 if (y1 == y2)
26                 {
27                     if (x1 < x2)
28                         ang1 = 0;
29                     else
30                         ang1 = Math.PI;
31                 }
32                 else
33                 {
34                     m = (x2 - x1) / c;
35                     if (m - 1 > 0.00001)
36                         m = 1;
37                     ang1 = Math.Acos(m);
38 
39                     if (y1 > y2)
40                         ang1 = Math.PI * 2 - ang1;//直线(x1,y1)-(x2,y2)与折X轴正向夹角的弧度
41                 }
42                 m = (xx - x1) / a;
43                 if (m - 1 > 0.00001)
44                     m = 1;
45                 ang2 = Math.Acos(m);
46 
47                 if (y1 > yy)
48                     ang2 = Math.PI * 2 - ang2;//直线(x1,y1)-(xx,yy)与折X轴正向夹角的弧度
49 
50                 ang = ang2 - ang1;
51                 if (ang < 0) ang = -ang;
52 
53                 if (ang > Math.PI) ang = Math.PI * 2 - ang;
54                 //如果是钝角则直接返回距离
55                 if (ang >Math.PI / 2)
56                     return a;
57                 else
58                     return a * Math.Sin(ang);
59             }
60             else//如果(xx,yy)到点(x2,y2)这条边较短
61             {
62                 //如果两个点的纵坐标相同,则直接得到直线斜率的弧度
63                 if (y1 == y2)
64                     if (x1 < x2)
65                         ang1 = Math.PI;
66                     else
67                         ang1 = 0;
68                 else
69                 {
70                     m = (x1 - x2) / c;
71                     if (m - 1 > 0.00001)
72                         m = 1;
73                     ang1 = Math.Acos(m);
74                     if (y2 > y1)
75                         ang1 = Math.PI * 2 - ang1;
76                 }
77                 m = (xx - x2) / b;
78                 if (m - 1 > 0.00001)
79                     m = 1;
80                 ang2 = Math.Acos(m);//直线(x2-x1)-(xx,yy)斜率的弧度
81 
82                 if (y2 > yy)
83                     ang2 = Math.PI * 2 - ang2;
84                 ang =ang2 - ang1;
85                 if (ang < 0) ang = -ang;
86                 if (ang > Math.PI) ang = Math.PI * 2 - ang;//交角的大小
87                 //如果是对角则直接返回距离
88                 if (ang > Math.PI / 2)
89                     return b;
90                 else
91                     return b * Math.Sin(ang);//如果是锐角,返回计算得到的距离
92             }
93         }
点到线段的距离

判断点是否在多边形内部

 点的旋转公式

作者:orange1438
出处:http://www.cnblogs.com/orange1438/
 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/orange1438/p/4553339.html