GIS算法基础——计算点到直线、射线、线段的距离_第1页
GIS算法基础——计算点到直线、射线、线段的距离_第2页
GIS算法基础——计算点到直线、射线、线段的距离_第3页
GIS算法基础——计算点到直线、射线、线段的距离_第4页
GIS算法基础——计算点到直线、射线、线段的距离_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、点到线距离的计算1、作业说明1.1 任务 点到线距离的计算(包括直线、射线、线段)1.2 要求 人机交互,鼠标屏幕取点进行计算,输出计算结果2、程序说明2.1 大体上分三步进行:2.1.1 首先进行画线操作:鼠标在屏幕上取两点(鼠标左键两点) 1、画线段直接利用 DrawLine 函数,将在屏幕上获取的两点坐标传递给函数的参数即可。2 、画直线 由于直线是无限的, 所以此时要借助于屏幕上所取两点的直线方程, 通过求出 与所在容器边缘的交点, 结合具体情况, 将求出的交点的坐标传递给 DrawLine 函数的参数,即可画出当前范围内的直线形状。3 、画射线 画射线与画直线的思路大致相同, 不过需

2、判断射线的方向, 此处借助所取的第 二个点和第一个点的位置关系判断方向, 最后再将所取的第一个点和求得的射 线方向与容器边缘的交点坐标传递给 DrawLine 函数的参数即可。2.1.2 开始绘制第三个点(鼠标右键取该点) 借助于 DrawEllipse 函数(详情参见代码部分)2.1.3 线和点绘制完成后,开始进行距离的计算1 、点到直线的距离:可直接利用点到线之间的距离公式2 、点到线段的距离:由于点在线段上的投影可能不在线段上,故还需要求出点到 线段两端点坐标的距离,再将最小值作为结果输出3 、点到射线的距离:同理,若点的投影不在射线上,则其最小距离为点到射线起 始端点的距离2.2 窗体

3、界面介绍首先是 ComeBox,对其添加三项:计算点到线段的距离、计算点到直线的距离、计算点 到射线的距离在 PictureBox 里进行点和线的绘制,在 TextBox 里显示点到线的距离值3、源代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.

4、Forms; namespacemepublic partial classForm1 : Form public Form1()InitializeComponent();/ 首先定义两个变量:屏幕上所取的两个点private Point m_ptStart; private Point m_ptEnd;/ 定义两个集合: myplist 存放用于画线的两个点, pt 存放第三个点List<Point> myplist = new List<Point>();List<Point> pt = new List<Point>();/result

5、用来存放点到线的距离值double result;/ 自定义方法:两点之间的距离double ptdis(Point p0, Point p1)(p1.Y - p0.Y);/ 自定义最大最小值函数double max(double x, double y)return x > y ? x : y;double min( double x, double y)return System.Math.Sqrt(p1.X - p0.X) * (p1.X - p0.X) + (p1.Y - p0.Y)return x > y ? y : x;/ 自定义方法:点和线之间的距离double pl

6、dis(Point p0, Point p1, Point p2)double result;double A = p2.Y - p1.Y;double B = p1.X - p2.X;double C = p2.X * p1.Y - p1.X * p2.Y;result = System.Math.Abs(A * p0.X + B * p0.Y + C) /System.Math.Sqrt(A * A + B * B);return result;/ 自定义方法:获取点在线上的投影Point GetProjectPt(Point p0, Point p1, Point p2) Point P

7、rojectPt=new Point();if (p2.X = p1.X)ProjectPt.X = p1.X;ProjectPt.Y = p0.Y;elsedouble k = (p2.Y - p1.Y) / (p2.X - p1.X);ProjectPt.X = (int)(k * p1.X + p0.X / k + p0.Y - p1.Y)/(k+1/k);ProjectPt.Y = (int)(-1 / k * (ProjectPt.X - p0.X) + p0.Y);return ProjectPt;/* 当 comboBox1里面的项改变时,清除之前的所有数据 比如计算点到直线的距

8、离时,清除点到线段的距离 */ private void comboBox1_SelectedIndexChangedo(bject sender, EventArgs e) myplist.Clear(); textBox1.Text = ""Graphics g = pictureBox1.CreateGraphics();g.Clear(Color.White);/ 对 pictureBox1 的 MouseDown事件进行编辑,当鼠标按下时,会产生哪些操作 private void pictureBox1_MouseDown(object sender,M ouse

9、EventArgs e)Pen blue = new Pen(Color.Blue, 3);Graphics g = pictureBox1.CreateGraphics();/ 当按下鼠标左键时,在屏幕上取两点画线if (e.Button = MouseButtons.Left)Point p = new Point(e.X, e.Y);myplist.Add(p);/ 当按下鼠标右键时,在屏幕上取第三个点if (e.Button = MouseButtons.Right)Point p = new Point(e.X, e.Y);pt.Clear();/ 改变所取的第三个点时,清除上一次的

10、数据(距离)和图形(点)g.Clear(Color.White);pt.Add(p);/ 此处将第三个点画成椭圆形式g.DrawEllipse(blue, pt0.X, pt0.Y, 1, 1);/ 在取点的同时,进行点到线距离的计算,并将结果值显示在textBox1 上Point p3 = new Point();p3 = GetProjectPt(pt0, m_ptStart,m_ptEnd);/ 获取点在线上的投影点/ 分情况讨论if (comboBox1.Text="计算点到线段的距离 ")if (p3.X >max(m_ptStart.X,m_ptEnd .

11、X ) | p3.X < min( m_ptStart.Y,m_ptEnd.Y)/ 点在线段上的投影不在线段上 double dis1 = ptdis(pt0, m_ptStart); double dis2 =ptdis(pt0, m_ptEnd); result = min(dis1, dis2);elseresult = pldis(pt0, m_ptStart, m_ptEnd);if (comboBox1.Text=" 计算点到射线的距离 ")if (p3.X < myplist0.X) / 点在射线上的投影不在射线 上 result = ptdis(

12、pt0, m ptStart);elseresult = pldis(pt0, m_ptStart, m_ptEnd);if (comboBox1.Text = "计算点到直线的距离 ")result = pldis(pt0, m_ptStart, m_ptEnd);textBox1.Text = result.ToString(); / 将结果显示在 textBox1 上 / 开始画线if (myplist.Count > 1)/A 、 B、 C分别是直线一般方程中的三和参数,即 A*x+B*y+C=0double A = myplist1.Y - myplist0

13、.Y;double B = myplist0.X - myplist1.X;double C = myplist1.X * myplist0.Y - myplist0.X * myplist1.Y;/ 通过 switch 语句,输入 comboBox1的文本内容,判断将要进行哪一种操作switch (comboBox1.Text)case"计算点到线段的距离 ": / 起点和终点即为屏幕上所取的两个点 m_ptStart = myplist0; m_ptEnd = myplist1; break;case"计算点到直线的距离 ":/ 画直线时,需要将起始

14、点和 pictureBox1 容器边缘交点联系起来 / 起点坐标 m_ptStart.Y = 0; m_ptStart.X = (int)(-C / A); / 终点坐标 m_ptEnd.Y = pictureBox1.Height; m_ptEnd.X = (int)(-(C + B * m_ptEnd.Y) / A);break;case"计算点到射线的距离 ":/ 画射线时同样要考虑到线与 pictureBox 容器边缘的交点,比较困难的是判断射线方向(借助于所取两点的位置关系)Point p0new Point();Point p1new Point();/ 起点坐标if (myplist1.Y = myplist0.Y)p0.Y = 0;p0.X = (int)(-C / A);/ 终点坐标p1.Y = pictureBox1.Height;p1.X = (int)(-(C + B * p1.Y) / A); if (myplist1.Y >= myplist0.Y) / 结合所取两点的位置关系确定最终传递给 DrawLine 的是哪两点m_ptEnd.X = p0.X;m_ptEnd.Y = p0.Y;m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论