凸多边形的判断(c++)

来源:互联网 发布:mac版本不支持银联 编辑:程序博客网 时间:2024/06/14 01:03

/*一个没有重复点、逆时针的多边形是凸的充分必要条件是:  
  从第三个点开始,所有的点都在前两个点线段的左边,或者共线。  
  如果不事先去除重复点,而且不分逆顺时针,那么就是下面的算法。 */

//这个函数判断点c在线段ab的左边还是右边,

//如果返回值大于0在左边,如果小于0在右边,否则共线  
  double   left_right(point   a,point   b,point   c)  
  {  
        a.x-=c.x;   a.y-=c.y;  
        b.x-=c.x;   b.y-=c.y;  
        return   a.x*b.y-a.y*b.x;  
  }  
   
  bool   is_tu(point   *p,int   n)  
  {  
          if(n<4)   return   false;  
          double   a,b;  
          a   =   left_right(p[0],p[1],p[2]);  
          for(;   ++p,--n>2;   a=b){  
              b   =   left_right(p[0],p[1],p[2]);  
              if(a*b<0)  
                  return   false;  
          }  
          return   true;                
  }