判断一个点是否在三角形及多边形的内部

爷,独闯天下 提交于 2020-03-17 10:32:18

判断一个点是否在三角形及多边形的内部

代码思路:
如果一个点在一个多边形的内部则依次链接多变形的两点,形成的有向直线,则该点必将都在这些有向直线的一侧,要不然都在左侧,要不然都在右侧。所以就是判断是否在一侧通过isLeft这个函数判断。
而这个函数使用的方法就是计算这三个点围成的面积,利用行列式公式,如果在左侧为正数,则自然在右侧就是负数,因为左右相当于行列式做了一次行交换,而这刚好为行列式带来了一个负数。

#include <iostream>
#include<vector>
using namespace std;

typedef struct PointF
{
  float x;
  float y;
  PointF(float x,float y) :x(x),y(y){}
  PointF():x(0),y(0){}

}PointF;
bool isLeft(PointF a,PointF b,PointF c);
float triangleArea(PointF a,PointF b,PointF c);
//判断一个点是否在一个三角形内
bool isInTriangle(PointF triangle[],int size, PointF point){
  if(size<3)return false;
  bool a = isLeft(triangle[0],triangle[1],point);
  bool b = isLeft(triangle[1],triangle[2],point);
  bool c = isLeft(triangle[2],triangle[0],point);
  if(a == b&&b==c&&c==a){
      return true;
    }
  else {
      return false;
    }
}
//判断一个点是否在一个多边形内
bool isInMultiangle(PointF Multiangle[],int size, PointF point){
  if(size<3)return 0;
  bool flag =isLeft(Multiangle[0],Multiangle[1],point);
  for(int i=0;i<size;i++){
      bool result = isLeft(Multiangle[i%size],Multiangle[(i+1)%size],point);
      if(result!=flag){
          return false;
        }
    }
  return 1;
}
bool isLeft(PointF a,PointF b,PointF c){
  //judge c in left of ab, true:left,false:right
  return triangleArea(a,b,c)>0;
}
float triangleArea(PointF a,PointF b,PointF c){
  return (b.x*c.y-b.y*c.x)
        -(a.x*c.y-a.y*c.x)
        +(a.x*b.y-b.x*a.y);
}
int main()
{
  PointF p[4] = {PointF(0,0),PointF(3,0),PointF(3,3),PointF(0,3)};
  PointF test =PointF(4,2);
  cout<<isInMultiangle(p,4,test)<<endl;

  cout << "Hello World!" << endl;
  return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!