def nextPoint(pool, SG_bisector): ans = None first = True for candidate in pool: if candidate.line.avail == True and SG_bisector.p1 is not candidate.line.hole: result = Line.intersect(candidate.line, SG_bisector) if result is not None: t = (result, candidate.point, candidate.line) if first == True: ans = t first = False else: if t[0].y <= ans[0].y: ans = t return ans
def nextPoint(pool,SG_bisector): ans = None first = True for candidate in pool: if candidate.line.avail== True and SG_bisector.p1 is not candidate.line.hole: result = Line.intersect(candidate.line,SG_bisector) if result is not None: t = (result,candidate.point,candidate.line) if first == True: ans = t first = False else: if t[0].y <= ans[0].y: ans = t return ans
def clip(): lower = range_points[0] upper = range_points[1] lines = [] dis = [] t = 0 mid = [] for i in range(lower,upper): for j in range(i+1,upper+1): lines.append(Line.biSector(self.points[i],self.points[j])) self.points[i].related.append(pair(lines[-1],self.points[j])) self.points[j].related.append(pair(lines[-1],self.points[i])) lines[-1]._p1 = self.points[i] lines[-1]._p2 = self.points[j] mid.append(((self.points[i]+self.points[j])/2,t)) dis.append((t,(self.points[i].x-self.points[j].x)**2+(self.points[i].y-self.points[j].y)**2,Line(self.points[i],self.points[j]))) t = t+1 circumcenter = Line.intersect(lines[0],lines[1]) if circumcenter is not None: tmp_lines = None dis.sort(key = lambda x : x[1]) triangle = 'acute' if dis[0][1]+dis[1][1] == dis[2][1]: triangle = 'right' tmp_lines = dis[0:2] elif dis[0][1]+dis[1][1]<dis[2][1]: triangle = 'obtuse' #print triangle s = dis[2][0] t = 0 for i in range(lower,upper): for j in range(i+1,upper+1): ab = (Line(self.points[i],self.points[j])) hl = Line(lines[t].p1,circumcenter) result = Line.intersect(hl,ab) #do not determine the longest side of right triangle in the same way if not (triangle == 'right' and t == s): if result is None: #reverse policy for longest side of obtuse if not (triangle == 'obtuse' and t == s): lines[t].p1 = circumcenter else: lines[t].p2 = circumcenter else: if not (triangle == 'obtuse' and t == s): lines[t].p2 = circumcenter else: lines[t].p1 = circumcenter t = t+1 #now determine the longest side of right triangle if triangle == 'right': t = dis[2][0] if Line.intersect(Line(lines[t].p1,circumcenter),tmp_lines[0][2]) != None or Line.intersect(Line(lines[t].p1,circumcenter),tmp_lines[1][2]) != None: lines[t].p1,lines[t].p2 = circumcenter,lines[t].p2 else: lines[t].p1,lines[t].p2 = circumcenter,lines[t].p1 #create circumcenter related points circumcenter.iscircumcenter = True lines[0].connected.append(lines[1]) lines[0].connected.append(lines[2]) lines[1].connected.append(lines[0]) lines[1].connected.append(lines[2]) lines[2].connected.append(lines[0]) lines[2].connected.append(lines[1]) else: mid.sort(key = lambda s: attrgetter('x','y')(s[0])) t = mid[1][1] del_line = lines[t] for i in range(lower,upper+1): u = self.points[i].related for j in range(0,len(u)): if u[j].line is del_line: del u[j] break del lines[t] #Line.intersect_with_edge(lines,Canvas.edge_painter,'colinear') return lines