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
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
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
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
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