GIS算法基礎(chǔ)——計(jì)算點(diǎn)到直線、射線、線段的距離_第1頁(yè)
GIS算法基礎(chǔ)——計(jì)算點(diǎn)到直線、射線、線段的距離_第2頁(yè)
GIS算法基礎(chǔ)——計(jì)算點(diǎn)到直線、射線、線段的距離_第3頁(yè)
GIS算法基礎(chǔ)——計(jì)算點(diǎn)到直線、射線、線段的距離_第4頁(yè)
GIS算法基礎(chǔ)——計(jì)算點(diǎn)到直線、射線、線段的距離_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、點(diǎn)到線距離的計(jì)算1、作業(yè)說(shuō)明1.1 任務(wù) 點(diǎn)到線距離的計(jì)算(包括直線、射線、線段)1.2 要求 人機(jī)交互,鼠標(biāo)屏幕取點(diǎn)進(jìn)行計(jì)算,輸出計(jì)算結(jié)果2、程序說(shuō)明2.1 大體上分三步進(jìn)行:2.1.1 首先進(jìn)行畫線操作:鼠標(biāo)在屏幕上取兩點(diǎn)(鼠標(biāo)左鍵兩點(diǎn)) 1、畫線段直接利用 DrawLine 函數(shù),將在屏幕上獲取的兩點(diǎn)坐標(biāo)傳遞給函數(shù)的參數(shù)即可。2 、畫直線 由于直線是無(wú)限的, 所以此時(shí)要借助于屏幕上所取兩點(diǎn)的直線方程, 通過(guò)求出 與所在容器邊緣的交點(diǎn), 結(jié)合具體情況, 將求出的交點(diǎn)的坐標(biāo)傳遞給 DrawLine 函數(shù)的參數(shù),即可畫出當(dāng)前范圍內(nèi)的直線形狀。3 、畫射線 畫射線與畫直線的思路大致相同, 不過(guò)需

2、判斷射線的方向, 此處借助所取的第 二個(gè)點(diǎn)和第一個(gè)點(diǎn)的位置關(guān)系判斷方向, 最后再將所取的第一個(gè)點(diǎn)和求得的射 線方向與容器邊緣的交點(diǎn)坐標(biāo)傳遞給 DrawLine 函數(shù)的參數(shù)即可。2.1.2 開始繪制第三個(gè)點(diǎn)(鼠標(biāo)右鍵取該點(diǎn)) 借助于 DrawEllipse 函數(shù)(詳情參見代碼部分)2.1.3 線和點(diǎn)繪制完成后,開始進(jìn)行距離的計(jì)算1 、點(diǎn)到直線的距離:可直接利用點(diǎn)到線之間的距離公式2 、點(diǎn)到線段的距離:由于點(diǎn)在線段上的投影可能不在線段上,故還需要求出點(diǎn)到 線段兩端點(diǎn)坐標(biāo)的距離,再將最小值作為結(jié)果輸出3 、點(diǎn)到射線的距離:同理,若點(diǎn)的投影不在射線上,則其最小距離為點(diǎn)到射線起 始端點(diǎn)的距離2.2 窗體

3、界面介紹首先是 ComeBox,對(duì)其添加三項(xiàng):計(jì)算點(diǎn)到線段的距離、計(jì)算點(diǎn)到直線的距離、計(jì)算點(diǎn) 到射線的距離在 PictureBox 里進(jìn)行點(diǎn)和線的繪制,在 TextBox 里顯示點(diǎn)到線的距離值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();/ 首先定義兩個(gè)變量:屏幕上所取的兩個(gè)點(diǎn)private Point m_ptStart; private Point m_ptEnd;/ 定義兩個(gè)集合: myplist 存放用于畫線的兩個(gè)點(diǎn), pt 存放第三個(gè)點(diǎn)List<Point> myplist = new List<Point>();List<Point> pt = new List<Point>();/result

5、用來(lái)存放點(diǎn)到線的距離值double result;/ 自定義方法:兩點(diǎn)之間的距離double ptdis(Point p0, Point p1)(p1.Y - p0.Y);/ 自定義最大最小值函數(shù)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;/ 自定義方法:點(diǎn)和線之間的距離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;/ 自定義方法:獲取點(diǎn)在線上的投影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;/* 當(dāng) comboBox1里面的項(xiàng)改變時(shí),清除之前的所有數(shù)據(jù) 比如計(jì)算點(diǎn)到直線的距

8、離時(shí),清除點(diǎn)到線段的距離 */ private void comboBox1_SelectedIndexChangedo(bject sender, EventArgs e) myplist.Clear(); textBox1.Text = ""Graphics g = pictureBox1.CreateGraphics();g.Clear(Color.White);/ 對(duì) pictureBox1 的 MouseDown事件進(jìn)行編輯,當(dāng)鼠標(biāo)按下時(shí),會(huì)產(chǎn)生哪些操作 private void pictureBox1_MouseDown(object sender,M ouse

9、EventArgs e)Pen blue = new Pen(Color.Blue, 3);Graphics g = pictureBox1.CreateGraphics();/ 當(dāng)按下鼠標(biāo)左鍵時(shí),在屏幕上取兩點(diǎn)畫線if (e.Button = MouseButtons.Left)Point p = new Point(e.X, e.Y);myplist.Add(p);/ 當(dāng)按下鼠標(biāo)右鍵時(shí),在屏幕上取第三個(gè)點(diǎn)if (e.Button = MouseButtons.Right)Point p = new Point(e.X, e.Y);pt.Clear();/ 改變所取的第三個(gè)點(diǎn)時(shí),清除上一次的

10、數(shù)據(jù)(距離)和圖形(點(diǎn))g.Clear(Color.White);pt.Add(p);/ 此處將第三個(gè)點(diǎn)畫成橢圓形式g.DrawEllipse(blue, pt0.X, pt0.Y, 1, 1);/ 在取點(diǎn)的同時(shí),進(jìn)行點(diǎn)到線距離的計(jì)算,并將結(jié)果值顯示在textBox1 上Point p3 = new Point();p3 = GetProjectPt(pt0, m_ptStart,m_ptEnd);/ 獲取點(diǎn)在線上的投影點(diǎn)/ 分情況討論if (comboBox1.Text="計(jì)算點(diǎn)到線段的距離 ")if (p3.X >max(m_ptStart.X,m_ptEnd .

11、X ) | p3.X < min( m_ptStart.Y,m_ptEnd.Y)/ 點(diǎn)在線段上的投影不在線段上 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=" 計(jì)算點(diǎn)到射線的距離 ")if (p3.X < myplist0.X) / 點(diǎn)在射線上的投影不在射線 上 result = ptdis(

12、pt0, m ptStart);elseresult = pldis(pt0, m_ptStart, m_ptEnd);if (comboBox1.Text = "計(jì)算點(diǎn)到直線的距離 ")result = pldis(pt0, m_ptStart, m_ptEnd);textBox1.Text = result.ToString(); / 將結(jié)果顯示在 textBox1 上 / 開始畫線if (myplist.Count > 1)/A 、 B、 C分別是直線一般方程中的三和參數(shù),即 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;/ 通過(guò) switch 語(yǔ)句,輸入 comboBox1的文本內(nèi)容,判斷將要進(jìn)行哪一種操作switch (comboBox1.Text)case"計(jì)算點(diǎn)到線段的距離 ": / 起點(diǎn)和終點(diǎn)即為屏幕上所取的兩個(gè)點(diǎn) m_ptStart = myplist0; m_ptEnd = myplist1; break;case"計(jì)算點(diǎn)到直線的距離 ":/ 畫直線時(shí),需要將起始

14、點(diǎn)和 pictureBox1 容器邊緣交點(diǎn)聯(lián)系起來(lái) / 起點(diǎn)坐標(biāo) m_ptStart.Y = 0; m_ptStart.X = (int)(-C / A); / 終點(diǎn)坐標(biāo) m_ptEnd.Y = pictureBox1.Height; m_ptEnd.X = (int)(-(C + B * m_ptEnd.Y) / A);break;case"計(jì)算點(diǎn)到射線的距離 ":/ 畫射線時(shí)同樣要考慮到線與 pictureBox 容器邊緣的交點(diǎn),比較困難的是判斷射線方向(借助于所取兩點(diǎn)的位置關(guān)系)Point p0new Point();Point p1new Point();/ 起點(diǎn)坐標(biāo)if (myplist1.Y = myplist0.Y)p0.Y = 0;p0.X = (int)(-C / A);/ 終點(diǎn)坐標(biāo)p1.Y = pictureBox1.Height;p1.X = (int)(-(C + B * p1.Y) / A); if (myplist1.Y >= myplist0.Y) / 結(jié)合所取兩點(diǎn)的位置關(guān)系確定最終傳遞給 DrawLine 的是哪兩點(diǎn)m_ptEnd.X = p0.X;m_ptEnd.Y = p0.Y;m_

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論