• 数字图像处理程序总结


    项目介绍:该项目,类似于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/
     本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Pandas to_sql将DataFrame保存的数据库中
    Pandas 的groupby操作
    Hibernate(一)
    EasyUI
    Java面试题
    Solr
    Lucene
    SpringMVC(二)
    MyBatis(二)
    MyBatis(一)
  • 原文地址:https://www.cnblogs.com/orange1438/p/4553339.html
Copyright © 2020-2023  润新知