歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

GIS軟件開發:點與多邊形關系(改進射線法)

在GIS軟件開發中,經常要用到一些幾何的算法,比如三角網構建,多邊形的剖分,點,線,面之間的關系。而點與多邊形關系的判斷是一項非常重要的基礎工作。

在點與多邊形關系的判斷中,經常用到的方法是射線法和夾角和方法,其中射線法能夠針對帶島的多邊形進行判斷,而夾角和方法就顯得無能為力。

相關閱讀:GIS中要素的捕捉以及C++實現 http://www.linuxidc.com/Linux/2013-01/77537.htm

射線法的基本思想是:從待判斷的點向某一個方向引射線,計算和多邊形交點的個數,如果個數是偶數或者0則點在多邊形外,如果是奇數,則在多邊形內。這個只是最基本的判別情況,還有一些復雜的情況需要特殊處理:

(射線經過頂點):當射線經過頂點時,判斷就會出現異常情況,現在規定,線段的兩個端點,相對於另一個端點在上面的頂點稱為上端點,下面是下端點,如果經過下端點,則認為邊和射線不相交。

(點在邊上):這種情況也不能用交點個數的奇偶性來判斷了,要快速地判斷這個點是否在邊上。

射線法改進:傳統的射線法一開始就直接計算點和多邊形的交點個數,這樣的話,會花費大量的時間來作拓撲關系的判斷。改進的算法是首先利用多邊形的最小外接矩形迅速排出掉不在MBR內的點,然後利用交點個數的奇偶性判斷:

下面的函數是射線和邊關系以及交點個數判斷:

//射線和線段的關系 :相交返回1,不相交返回0,射線起點在線段上返回-1
int IsIntersectAnt(double x,double y,double X1,double Y1,double X2,double Y2)
{
 //計算線段的最小和最大坐標值
 double minX,maxX,minY,maxY;
 minX = X1;
 maxX = X2;
 if (minX > maxX)
 {
  minX = X2;
  maxX = X1;
 }
 minY = Y1;
 maxY = Y2;
 if (minY > maxY)
 {
  minY = Y2;
  maxY = Y1;
 }

 //射線與邊無交點的快速判斷
 if (y<minY || y>maxY || x<minX)
 {
  return 0;
 }

 //如果是水平線段,在線段上返回-1,否則返回0
 if (fabs(maxY - minY) < eps)
 {
  return (x >= minX && x <= maxX)? (-1):0;
 }

 //計算射線與邊所在直線的交點的橫坐標
 double x0 = X1 + (double)(y - Y1)*(X2 - X1)/(Y2 - Y1);
 
 //交點在射線右側,則不相交
 if (x0 > x)
 {
  return 0;
 }
 //交點和射線起點相同
 if (fabs(x-x0)< eps)
 {
  return -1;
 }
 //穿過下端點也不計數
 if (fabs(y-minY) < eps)
 {
  return 0;
 }
 return 1;

}

Copyright © Linux教程網 All Rights Reserved