GIS演算法—判斷點在面內

來源:互聯網
上載者:User

主要函數:

//在鏈表中擷取x軸不相同的點void CAnalyseDlg::GetNotSame(CArray *pointArray,int index,int indexs[] ){indexs[0] = indexs[1] = -1;int size = pointArray->GetSize();TabPoint buftpt,tpt;tpt = (TabPoint)pointArray->GetAt(index);for (int i = index; i < size; i++){buftpt = (TabPoint)pointArray->GetAt(i);if (buftpt.x != tpt.x){indexs[0] = i;break;}}if (indexs[0] == -1){for (int i = 0; i < size; i++){buftpt = (TabPoint)pointArray->GetAt(i);if (buftpt.x != tpt.x){indexs[0] = i;break;}}}for (int j = index; j >= 0; j--){buftpt = (TabPoint)pointArray->GetAt(j);if (buftpt.x != tpt.x){indexs[1] = j;break;}}if (indexs[1] == -1){for (int j = size-1; j >= 0; j--){buftpt = (TabPoint)pointArray->GetAt(j);if (buftpt.x != tpt.x){indexs[1] = j;break;}}}if (indexs[0] == -1 || indexs[1] == -1){MessageBox("地區中有直線");}}

 

 

//判斷點是否線上上
bool CAnalyseDlg::JudgePtInLine(TabPoint tpt1,TabPoint tpt2,TabPoint tpt)
{
double dx1 = GetDistance(tpt1, tpt2);
double dx2 = GetDistance(tpt,tpt1);
double dx3 = GetDistance(tpt,tpt2);
double dx = dx3 + dx2 - dx1;

if (dx >= -0.0000000001 && dx <= 0.0000000001 )
{
return true;
}
return false;
}
//求取兩點之間的距離
double CAnalyseDlg::GetDistance(TabPoint tpt1,TabPoint tpt2)
{
double x = tpt1.x - tpt2.x ;
if (x <= 0)
{
x = -x;
}
double y = tpt1.y - tpt2.y ;
if (y <= 0)
{
y = -y;
}

return sqrt(x*x+y*y);
}

 

//判斷交點
//傳回值:true點在面內 false點在面外
bool CAnalyseDlg::JudgeMeetPoint(TabPoint tpt)
{
int MeetPointNum = 0;
//擷取Feature個數
int featuresize = m_featureArray.GetSize();
for (int i =0; i < featuresize; i++)
{
Feature feature = (Feature)m_featureArray.GetAt(i);
//擷取Feature的part個數
int featurepartsize = feature.partsize;
for (int j = 0; j < featurepartsize; j++)
{
FeaturePart part = (FeaturePart)feature.partsArray->GetAt(j);
int pointsize = part.pointsize;
for (int k = 1;kGetAt(k-1);
TabPoint pt2 = (TabPoint)part.pointArray->GetAt(k);

if( ( (tpt.x <= pt1.x && tpt.x >= pt2.x) ||
(tpt.x >= pt1.x && tpt.x <= pt2.x) ) &&
(tpt.y >= pt1.y || tpt.y >= pt2.y) )
{
//判斷點是否線上上
if (JudgePtInLine(pt1,pt2,tpt))
{
return true;
}

//處理特殊情況,交點是端點的情況
double temp;
//temp相當於被除數(斜率的分母)
temp = pt1.x - pt2.x;
if ( temp >= -0.0000000001 && temp <= 0.0000000001 )
{
//處理交點情況
double dx = tpt.x - pt1.x;
if (dx >= -0.0000000001 && dx <= 0.0000000001)
{
int indexs[2] = {0,0};
GetNotSame(part.pointArray,i,indexs);
TabPoint linePt1,linePt2;
linePt1 = part.pointArray->GetAt(indexs[0]);
linePt2 = part.pointArray->GetAt(indexs[1]);
if (i>indexs[0])
{
break;
}
else
{
i = indexs[0]+1;
}
if( tpt.y > pt1.y && ( (tpt.x >= linePt1.x && tpt.x <= linePt2.x) ||
(tpt.x >= linePt2.x && tpt.x <= linePt1.x)) )
MeetPointNum++;
}
}
else
{
double kk,bb;
double MeetPtY,MeetPtX;
kk = (pt1.y - pt2.y) / (pt1.x - pt2.x);
bb = pt1.y - kk * pt1.x;
MeetPtY = kk*tpt.x + bb;
MeetPtX = tpt.x;
//處理特殊情況,交點是端點的情況
double dx,dy,dx2,dy2;
dx = MeetPtX - pt1.x;
dy = MeetPtY - pt1.y;
dx2 = MeetPtX - pt2.x;
dy2 = MeetPtY - pt2.y;
if( (dx >= -0.0000000001 && dx <= 0.0000000001 && dy >= -0.0000000001
&& dy <= 0.0000000001) )
{
TabPoint pt3;
if (k == 1)
{
pt3 = (TabPoint)part.pointArray->GetAt(pointsize - 2);
}
else
{
pt3 = (TabPoint)part.pointArray->GetAt(k-2);
}
//提取交點的上下兩點分別在垂線的兩側
if( tpt.y > MeetPtY && ( (MeetPtX >= pt3.x && MeetPtX <= pt2.x) ||
(MeetPtX >= pt2.x && MeetPtX <= pt3.x)) )
MeetPointNum++;
}else if (!(dx2 >= -0.0000000001 && dx2 <= 0.0000000001 && dy2 >= -0.0000000001
&& dy2 <= 0.0000000001))
{
if (tpt.y > MeetPtY)
MeetPointNum++;
}
}
}
}
}
}

if (MeetPointNum%2 == 1)
return TRUE;
else
return FALSE;
}

 

GIS導航網

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.