Example #1
0
def double_circle_test_BS(pts,debug=True):
    n=len(pts)
    for i in range(0,n,2):
        inicio=(i+3)%n
        fin=(i-1)%n
        if fin<inicio:
            fin = fin + n
        while inicio<=fin:
            j=(inicio+fin)/2
            if geometricbasics.turn(pts[i],pts[(i+1)%n],pts[j%n])<0:
                fin=j-1
            else:
                return False
        inicio=(i+1)%n
        fin=(i-3)%n
        if fin<inicio:
            fin = fin + n
        while inicio<=fin:
            j=(inicio+fin)/2
            if geometricbasics.turn(pts[i],pts[(i-1)%n],pts[j%n])>0:
                inicio=j+1
            else:
                return False

    return True
Example #2
0
def _check_convex_position(pts):
    """Checks whether the point set(in the given order) is in convex position."""
    n=len(pts)
    if n<3:
        return True
    
    for i in range(n):
        if geometricbasics.turn(pts[i],
                                pts[(i+1)%n],
                                pts[(i+2)%n])!=-1:
            return False
    return True
 def point_in_line(self,point):
     """Test wheter a point is: above, below
         or in the line. returns -1,1 and 0
         respectively"""
     
     if self.m!=None:
         p=[0,self.b]
         q=[1,self.m+self.b]
     else:
         p=[self.b,0]
         q=[self.b,1]
     
     inline=geometricbasics.turn(p,q,point)
     return inline
    def point_in_line(self, point):
        """Test wheter a point is: above, below
            or in the line. returns -1,1 and 0
            respectively"""

        if self.m != None:
            p = [0, self.b]
            q = [1, self.m + self.b]
        else:
            p = [self.b, 0]
            q = [self.b, 1]

        inline = geometricbasics.turn(p, q, point)
        return inline
Example #5
0
def _check_hortoness(pts):

    if len(pts)<=2:
        return True
    
    H_even=[]
    H_odd=[]
    n=len(pts)
    
    for i in range(n):
        if i%2==0:
            H_even.append(pts[i])
        else:
            H_odd.append(pts[i])
    
    sign=geometricbasics.turn(H_even[0],H_even[1],H_odd[0])
    for i in range(len(H_even)):
        for j in range(i+1,len(H_even)):
            for k in range(len(H_odd)):
                sign2=geometricbasics.turn(H_even[i],H_even[j],H_odd[k])
                if sign*sign2<=0:
                    print (H_even[i],H_even[j],H_odd[k])
                    return False
                    
    sign=geometricbasics.turn(H_odd[0],H_odd[1],H_even[0])
    for i in range(len(H_odd)):
        for j in range(i+1,len(H_odd)):
            for k in range(len(H_even)):
                sign2=geometricbasics.turn(H_odd[i],H_odd[j],H_even[k])
                if sign*sign2<=0:
                    print (H_odd[i],H_odd[j],H_even[k])
                    return False
                
    if check_hortoness(H_even) and check_hortoness(H_odd):
        return True
    else:
        return False
Example #6
0
def lambda_matrix(pts):
    """M[i,j] is the number of points of pts that lie to the LEFT
    of the edge (pts[i],pts[j])."""
    M=[[0 for i in xrange(len(pts))] for j in xrange(len(pts))]
    D=points_index(pts)
    n=len(pts)
    for i in xrange(n):
        tpts=pts[:i]
        tpts.extend(pts[i+1:])
        p=pts[i]
        #check whether we have the C++ version running correctly
        pts_sorted=geometricbasics.sort_around_point(p,tpts)
        k=0 
        for j in xrange(n-1):
            while (geometricbasics.turn(p,pts_sorted[j],pts_sorted[(k+1)%(n-1)])<=0 and
                    (k+1)%(n-1)!=j):
                k=k+1
            ni=(k-j)%(n-1)
            M[D[tuple(p)]][D[tuple(pts_sorted[j])]]=ni
    return M
Example #7
0
        def find_case():
            p_case = 0
            q_case = 0

            if side == UPPER:
                if turn(q, p, pm) >= 0 and turn(q, p, pM) >= 0:
                    p_case = SUPPORT
                elif turn(q, p, pm) < 0 and turn(q, p, pM) >= 0:
                    p_case = CONCAVE
                else:
                    p_case = REFLEX

                if turn(q, p, qm) >= 0 and turn(q, p, qM) >= 0:
                    q_case = SUPPORT
                elif turn(q, p, qm) >= 0 and turn(q, p, qM) < 0:
                    q_case = CONCAVE
                else:
                    q_case = REFLEX

            elif side == LOWER:
                if turn(q, p, pm) <= 0 and turn(q, p, pM) <= 0:
                    p_case = SUPPORT
                elif turn(q, p, pm) > 0 and turn(q, p, pM) <= 0:
                    p_case = CONCAVE
                else:
                    p_case = REFLEX

                if turn(q, p, qm) <= 0 and turn(q, p, qM) <= 0:
                    q_case = SUPPORT
                elif turn(q, p, qm) <= 0 and turn(q, p, qM) > 0:
                    q_case = CONCAVE
                else:
                    q_case = REFLEX

            return p_case, q_case