Static method. Returns a counterclock wise ordered sequence of 
        points. If there are any repeated point, the method will raise 
        an error.
        
        Due to the 3D character of the package, the order or the points
        will be tried following this order:
		
            1. z=0 pprojection
            2. x=0 pprojection
            3. y=0 pprojection

        :param points: Points to form a polygon (xyz or xy)
        :type points: ndarray with points (xyz or xy) in rows
        :returns: ccw version of the points.
        :rtype: ndarray (shape=(N, 2 or 3))

def make_ccw(points):
        """
        Static method. Returns a counterclock wise ordered sequence of 
        points. If there are any repeated point, the method will raise 
        an error.
        
        Due to the 3D character of the package, the order or the points
        will be tried following this order:
		
            1. z=0 pprojection
            2. x=0 pprojection
            3. y=0 pprojection

        :param points: Points to form a polygon (xyz or xy)
        :type points: ndarray with points (xyz or xy) in rows
        :returns: ccw version of the points.
        :rtype: ndarray (shape=(N, 2 or 3))
        """
        from scipy.spatial import ConvexHull
        from pyny3d.utils import sort_numpy
        
        # Repeated points
        points_aux = sort_numpy(points)
        check = np.sum(np.abs(np.diff(points_aux, axis=0)), axis=1)
        if check.min() == 0: raise ValueError('Repeated point: \n'+str(points))
        
        # Convexity
        hull = None
        for cols in [(0, 1), (1, 2), (0, 2)]:
            try:
                hull = ConvexHull(points[:, cols])
            except:
                pass
            if hull is not None: return points[hull.vertices]
        if hull is None: raise ValueError('Wrong polygon: \n'+str(points))