输入N个点的坐标,由程序判断该N个点是否能构成一个凸多边形请高手说出算法,贴出代码也可以。

解决方案 »

  1.   

    我的新算法:
    1:给所有点按X线轴排序:
    N1(x1,y1),N2(x2,y2),N3(x3,y3),...
    x1<x2<x3...    
    2:建立上部集合top,下部集合buttom
      遍历所有点: 
      if Ni.y 比top中的元素都高,加入top; 判断top中后3点的夹角是不是向下(<180度),是继续,否则返回false
      if Ni.y 比top中的元素都低,加入buttom; 判断top中后3点的夹角是不是向上(<180度),是继续,否则返回false
    3:剩下的点形成新集合right:
       按y轴排序,依次判断夹角,都小于180度,则返回true,否则false  
      

  2.   

    我用的是叉积,每相邻两条边做叉积,全部同号就为凸,但有时会判断错误// 向量ab,向量ac 叉积ab×ac
    private int getDirection(Point2D a, Point2D b, Point2D c) {
        double x1 = b.getX() - a.getX();
        double y1 = b.getY() - a.getY();
        double x2 = c.getX() - a.getX();
        double y2 = c.getY() - a.getY();
        double v =  x1*y2 - x2*y1;
        
        if(v > 0)
            return 1;  // ab在ac顺时针方向
        else if(v < 0)
            return -1; // ab在ac逆时针方向
        else
            return 0;  // 共线
    }