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

来源:互联网 发布:2016-2017杜兰特数据 编辑:程序博客网 时间:2024/04/30 01:20

< 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

原创粉丝点击