距离的量算在是进行空间分析等的基础,下面将为大家介绍几种距离的计算方法以及如何使用C#语言进行实现。本文使用VS2019,创建C#窗体应用程序,通过使用PitcureBox控件与用户进行交互来实现多种距离的量算。

准备:

1、建立窗体应用程序。

2、设置画点线面的“开关”,(bool变量,当点击按钮时,false变为true)。

3、添加画板(PictureBox)。

4、创建画图工具(Pen、Brush)。

5、为画板添加绘图事件(MouseDown、DoubleClick等)。

注意:线线距离以及面面距离计算时,需要设置不同的容器对所画的点进行存储,特别是画面时,注意区分前后的多边形。

一、点点距离

点与点之间的距离衡量,在这里总结了欧氏距离、绝对值距离(曼哈顿距离)、切氏距离、明氏距离、马氏距离、切比雪夫距离六种距离的计算方法。

(1)欧氏距离(Euclidean

欧氏距离是最常见的两点之间或者多点之间的距离的表示方法,在中学涉及的数学问题大都是通过欧氏距离来实现和表达的。欧氏距离的计算最简单、直观,也是距离计算中最容易理解的一种方式。

在此我们实现的是两点之间的欧氏距离的计算,代码如下:

​//欧氏距离public double Euclidean(double dx1, double dy1, double dx2, double dy2){double dx = Math.Pow(dx1 - dx2, 2);double dy = Math.Pow(dy1 - dy2, 2);double Euclideanres = Math.Pow(dx + dy, 0.5);return Euclideanres;}​

(2)绝对值距离(街坊距离、Manhattan距离

绝对值距离表达的是点集中点的xy值之差的绝对值之和,绝对值距离的计算公式为:

曼哈顿距离在2维平面是两点在纵轴上的距离加上在横轴上的距离,即

对于一个具有正南正北、正东正西方向规则布局的街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。

在此我们实现的是多点之间的绝对值距离的计算,代码如下:

                    double sum = 0;for (int i = 0; i < pointCount; i++){//取绝对值sum = System.Math.Abs(Convert.ToDouble(Points[i].X) - Convert.ToDouble(Points[i].Y));sum += sum;}

(3)切氏距离(Chebyshev

切氏距离计算的是点集中所有点的X坐标与Y坐标之差的绝对值的最大值,切氏距离的计算公式:

部分代码如下:

    for (int i = 0; i < pointCount; i++){//取绝对值max = System.Math.Abs(Convert.ToDouble(px[i]) - Convert.ToDouble(py[i]));for (int j = 0; j < pointCount; j++){res = System.Math.Abs(Convert.ToDouble(Points[j].X) - Convert.ToDouble(Points[j].Y));if (res > max){max = res;}}}label4.Text = "切氏距离为" + max;

(4)明氏距离

明氏距离可以理解为绝对值距离的一般规律,绝对值距离是特殊的明氏距离。明氏距离有一个量纲m。当m=1时,明氏距离与绝对值距离的计算结果相同。

明氏距离的计算公式:

部分代码如下:

                    double m = Convert.ToDouble(textBox2.Text);double sum = 0;for (int i = 0; i < pointCount; i++){//取绝对值sum = System.Math.Abs(Convert.ToDouble(Points[i].X) - Convert.ToDouble(Points[i].Y));//取幂sum = System.Math.Pow(sum, m);sum += sum;}double Min = System.Math.Pow(sum, 1 / m);label4.Text = "明氏距离距离为" + Min;

(5)马氏距离(Minkowski

马氏距离的计算涉及协方差矩阵的计算,在马氏距离的计算中如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧式距离,如果协方差矩阵为对角阵,则其也可称为正规化的欧氏距离。

马氏距离的计算公式:

此处用Python实现的示例:

# 马氏距离
from scipy.spatial import distance
import numpy as np
from numpy.linalg import inv
SIGMA = np.array([[2,1],[1,2]])q=[0,0]
x_1=[-3.5,-4]
x_2=[2.75,-1.5]d_1=distance.mahalanobis(q,x_1,inv(SIGMA))
d_2=distance.mahalanobis(q,x_2,inv(SIGMA))
print(d_1)
print(d_2)

二、点线距离

点线距离的计算需要利用向量夹角来判断,判断线段两端点与该点构成的夹角类型,然后进行计算。如果点在线段的延长线上,则计算其与线段两端点的欧氏距离的最小值。

    代码如下:

        //点线距离函数public double PL(double x, double y, double x1, double y1, double x2, double y2){double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1); // |AB| * |AC|*cos(x)//double cross2 = (x1 - x2) * (x1 - x) + (y1 - y2) * (y1 - y); // |AB| * |AC|*cos(x)if (cross <= 0)  //积小于等于0,说明 角BAC 是直角或钝角return Math.Pow(((x - x1) * (x - x1) + (y - y1) * (y - y1) + 0.0), 0.5);double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); // |AB|if (cross >= d2)  //角ABC是直角或钝角return Math.Pow(((x - x2) * (x - x2) + (y - y2) * (y - y2) + 0.0), 0.5);//锐角三角形double r = cross / d2;double px = x1 + (x2 - x1) * r;  // C在 AB上的垂足点(px,py)double py = y1 + (y2 - y1) * r;return Math.Pow(((x - px) * (x - px) + (y - py) * (y - py) + 0.0), 0.5); //两点间距离公式}

三、点面距离

话不多说,上代码:

                double a = 0;for (int i = 0; i < newploy.Count; i++){if (i + 1 < newploy.Count){a = PL(Points[0].X, Points[0].X, newploy[i].X, newploy[i].Y, newploy[i + 1].X, newploy[i + 1].Y);polyToLine.Add(a);}a = PL(Points[0].X, Points[0].X, newploy[i].X, newploy[i].Y, newploy[0].X, newploy[0].Y);polyToLine.Add(a);}double min = 99999;//遍历寻找最小值for (int i = 0; i < polyToLine.Count; i++){if (Convert.ToDouble(polyToLine[i]) < min){min = Convert.ToDouble(polyToLine[i]);}label4.Text = "点与面最小距离:" + Math.Round(min, 4);}

四、线面距离

            double k = (linePoint[1].Y - linePoint[0].Y) / (linePoint[1].X - linePoint[0].X);if (k == 0){k = 0.000001;}double b = linePoint[0].Y - k * linePoint[0].X;//遍历多边形的各条边//polyPointsdouble a = 0;for (int i = 0; i < newploy.Count; i++){if (i + 1 < newploy.Count){for (int j = linePoint[0].X; j < linePoint[1].X; j++){a = PL(j, k * j + b, newploy[i].X, newploy[i].Y, newploy[i + 1].X, newploy[i + 1].Y);lpdis.Add(a);}}else{for (int j = linePoint[0].X; j < linePoint[1].X; j++){a = PL(j, k * j + b, newploy[i].X, newploy[i].Y, newploy[0].X, newploy[0].Y);lpdis.Add(a);}}}double min = 99999;//遍历寻找最小值for (int i = 0; i < lpdis.Count; i++){if (Convert.ToDouble(lpdis[i]) < min){lpmin = Convert.ToDouble(lpdis[i]);}label4.Text = "线与面最小距离:" + Math.Round(lpmin, 4);}

五、线线距离

            double k = (linePoint[1].Y - linePoint[0].Y) / (linePoint[1].X - linePoint[0].X);if (k == 0){k = 0.000001;}double b = linePoint[0].Y - k * linePoint[0].X;double dis = 0;if(linePoint[0].X< linePoint[1].X){for (int i = linePoint[0].X; i < linePoint[1].X; i++){dis = PL(i, k * i + b, linePoint[2].X, linePoint[2].Y, linePoint[3].X, linePoint[3].Y);lldis.Add(dis);}}else{for (int i = linePoint[1].X; i < linePoint[0].X; i++){dis = PL(i, k * i + b, linePoint[2].X, linePoint[2].Y, linePoint[3].X, linePoint[3].Y);lldis.Add(dis);}}

六、面面距离

            int fircount = newploy.Count - secpolynum;List<Point> fir = null;List<Point> sed = null;for (int q = 0; q < fircount; q++){if (fir == null) fir = new List<Point>();else{fir.Add(newploy[q]);}}for (int p = fircount; p < newploy.Count; p++){if (sed == null) sed = new List<Point>();else{sed.Add(newploy[p]);}}//linePoint[0]//斜率double k = 0;double b = 0;double dis = 0;//遍历一多边形的边for (int i = 0; i < fir.Count; i++){if (i + 1 < fir.Count){k = (fir[i + 1].Y - fir[i].Y) / (fir[i + 1].X - fir[i].X);if (k == 0){k = 0.000001;}b = fir[i].Y - k * fir[i].X;//遍历二多边形的边for (int m = 0; m < sed.Count; m++){if (m + 1 < sed.Count){double mi = 0;double mx = 0;if (sed[m].X > sed[m + 1].X){mi = sed[m + 1].X;mx = sed[m].X;}else{mx = sed[m + 1].X;mi = sed[m].X;}for (int j = (int)mi; j < mx; j++){dis = PL(j, k * j + b, sed[m].X, sed[m].Y, sed[m + 1].X, sed[m + 1].Y);ppdis.Add(dis);}}else{for (int j = sed[0].X; j < sed[m].X; j++){dis = PL(j, k * j + b, sed[m].X, sed[m].Y, sed[0].X, sed[0].Y);ppdis.Add(dis);}}}}//最后一条else{k = (newploy[i].Y - newploy[0].Y) / (newploy[i].X - newploy[0].X);if (k == 0){k = 0.000001;}b = newploy[0].Y - k * newploy[0].X;for (int m = 0; m < sed.Count; m++){if (m + 1 < sed.Count){for (int j = sed[m].X; j < sed[m + 1].X; j++){dis = PL(j, k * j + b, sed[m].X, sed[m].Y, sed[m + 1].X, sed[m + 1].Y);ppdis.Add(dis);}}else{for (int j = sed[0].X; j < sed[m].X; j++){dis = PL(j, k * j + b, sed[m].X, sed[m].Y, sed[0].X, sed[0].Y);ppdis.Add(dis);}}}}

七、部分结果

使用VS C#实现距离的计算(点点、点线、点面、线面、线线、面面)相关推荐

  1. java 点与线的距离_计算地图上点与线段距离

    将地球看做一个标准球体,计算点到线段的距离. 计算两点间的球面距离 /** * * a点经度,a点纬度,b点经度,b点纬度 * */ public static double calcP2P(doub ...

  2. Java实现海明距离简单计算

    文本相似度比较有很多方法,如余弦夹角算法.欧式距离.Jaccard相似度.最长公共子串.编辑距离等,海明距离是其中之一. 在信息编码中,两个合法代码对应位上编码不同的位数称为码距,又称海明距离. n位 ...

  3. 聚类算法中各种距离的计算与python的具体实现代码

    一.聚类算法和相似度 在机器学习中,有两类学习算法,一类是无监督学习,另一类是监督学习.聚类算法是无监督学习算法,一般构建用户兴趣属性画像等可应用聚类算法:而一般的分类算法是有监督学习,基于有标注的历 ...

  4. 计算器计算经纬距离_经纬度距离角度计算工具

    经纬度距离角度计算器是一款经纬度计算工具,该软件可以快速计算出航图上任意两点之间的距离和任意三点所成夹角的角度,准确性非常高,而且使用期开也很简单,用户只需要输入两个地点的经纬度软件就可以计算出标准的 ...

  5. Matlab Tricks(十八)—— 矩阵间元素距离的计算

    两个矩阵间元素(向量)距离的度量,首先想到的是遍历,循环的方式,显然 matlab 下的编程并不推荐,matlab 下矩阵向量化编程效率尤高. 先考虑两个向量距离的计算: ∥x−y∥2=∥x∥2+∥y ...

  6. 【定位设备】蓝牙信标接近距离的计算方式及其部署原则

    蓝牙信标(Bluetooth Beacon)可以结合室内导航.即时推播广告等创新应用,它以标准化的格式发送广播数据包,并且最常见的是在只发送模式下运行. 蓝牙定位是蓝牙技术中近年来比较受欢迎的功能之一 ...

  7. 利用MATLAB实现空间两点距离的计算以及优化

    首先在这里声明,本次使用的地球模型采用的是球形.参考的文章是美团的距离计算,说的很清晰,感兴趣的朋友可以参考.我自己使用了MATLAB实现了其中的算法.仅供参考,互相学习. 大致地说,这里实现的方法就 ...

  8. Java黑皮书课后题第4章:4.1(几何:五边形的面积)编写程序,提示用户输入从五边形中心到定点的距离,计算五边形的面积,结果保留两位小数

    4.1(几何:五边形的面积)编写程序,提示用户输入从五边形中心到顶点的距离,计算五边形的面积,结果保留两位小数 题目 题目概述 运行示例 破题 代码 题目 题目概述 4.1(几何:五边形的面积)编写程 ...

  9. python 余弦距离_numpy :: 计算特征之间的余弦距离

    余弦距离在计算相似度的应用中经常使用,比如: 文本相似度检索 人脸识别检索 相似图片检索 原理简述 下面是 但是,余弦相似度和常用的欧式距离的有所区别. 余弦相似度的取值范围在-1到1之间.完全相同时 ...

最新文章

  1. CPU 深夜狂飙,一帮大佬都傻眼了......
  2. python随机数程序源码_Python 实现随机数详解及实例代码
  3. lwip 开发 sntp 与 tcp 不能同时工作的奇怪问题
  4. python 数值的整数次方
  5. AttributeError系列之:AttributeError: 'tuple' object has no attribute 'shape'
  6. Python机器学习---2.聚类算法理论部分
  7. ajax的请求参数详解以及前后台交互详解
  8. Python:cv2.imwrite无法存储带有中文路径图片
  9. 敏感词在线检测工具-免费敏感词在线检测工具
  10. visio2016 数据库模型图_数据库相关术语整理
  11. 测试思维:正向思维和逆向思维
  12. xp系统粘贴是灰色的_电脑无法复制粘贴,教你电脑无法复制粘贴怎么解决
  13. C语言练习题,编写程序实现以下功能。从键盘输入一个整数,若输入数字0,则屏幕显示:“Sunday“;若输入数字1,则屏幕显示:“Monday“;若输入数字2,则屏幕显示:“Tuesday“;若输入数字
  14. 三部曲简史mobi_尤瓦尔简史三部曲:人类简史+未来简史+今日简史
  15. mysql数据库特别大怎么备份_如何备份还原mysql数据库 mysql数据库太大备份与还原方法...
  16. 答题软件对于私人来说安全吗?
  17. js实现网页漂浮广告
  18. 差分相干解调 matlab,2DPSK差分相干解调器Simulink仿真
  19. Linux 5.13-rc1 发布 初步支持苹果M1
  20. 【万能工具箱】PDF转word/去水印/编辑+图片处理+OCR识别,60+功能,一个软件搞定!

热门文章

  1. pytorch_sparse教程
  2. 【English】十大词性之感叹词(感叹句)
  3. 计算机的发展与什么息息相关,第一单元第二课《计算机的发展与应用》.doc
  4. CG插画培训班有哪些
  5. DID分布式身份标识技术调研
  6. ps的选区和相关工具
  7. window解决端口号被占用
  8. NB-IoT(窄带物联网)相关知识
  9. python实现随机验证码图片生成
  10. jupyther_python基础系列 09 第九章 有益的探索