数字图像处理程序总结
项目介绍:该项目,类似于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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。