您的位置:首页 > 其它

GIS,判断点是否在指定区域内

2010-05-20 13:07 274 查看
< type="text/JavaScript"> alimama_pid="mm_10249644_1605763_4929893"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="0"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="16"; alimama_width=658; alimama_height=60; alimama_type=2; < src="http://a.alimama.cn/inf.js" type=text/javascript>

主要函数:

//在链表中获取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;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/gisfarmer/archive/2008/07/31/2746194.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: