def extendWithIntersectionPoints(self, other): """ Update current points list, extended with intersection points """ debugResult = [] first = True result = [] linkedPoints = LinkedList() linkedPoints.load(self.points) linkedOtherPoints = LinkedList() linkedOtherPoints.load((other.points)) node = linkedPoints[0] while node.hasNext(): candidates = [] if first: candidates.append(node.data) first = False nextNode = node.next seg = (node.data, nextNode.data) otherNode = linkedOtherPoints[0] while otherNode.hasNext(): nextOtherNode = otherNode.next otherSeg = (otherNode.data, nextOtherNode.data) intersection, info = segmentIntersection(seg, otherSeg) kind = None if intersection: kind = Kind.incoming if info['sign'] < 0 else Kind.outgoing tpl = (intersection, kind) #print("seg, otherseg, tpl: ",seg, otherSeg, tpl) #node.insertAfter((intersection, kind)) #otherNode.insertAfter((intersection, kind)) candidates.append(tpl) #print("{} : {} x {}".format(info['sign'], seg, otherSeg)) #this is for debugging debugResult.append((intersection, seg, otherSeg, kind)) #print("{0} :: {1} :: {2}".format(intersection, seg, otherSeg)) otherNode = otherNode.next # !!!! node = node.next # !!! sorted = lolsort(candidates, node.data) result += sorted result.append(node.data) GlobalQueue.queue.insert(debugResult) return filterDuplicates(result) return result return linkedPoints.toList(), linkedOtherPoints.toList()
def __sub__(self, other): """ Subtraction of polygons """ sequence = [] # get raw points lists without duplication first-last points = [dict([["point",p], ["kind",k], ["visited", False]]) for p, k in self.points[:-1]] otherPoints = [dict([["point",p], ["kind",k], ["visited", False]]) for p, k in other.points[:-1]] tmp = [BravePoint(p,k) for p, k in self.points[:-1]] tmp2 = [BravePoint(p,k) for p, k in other.points[:-1]] tmp2.reverse() # useful points = LinkedList() points.load(tmp) points.setEndless(True) otherPoints = LinkedList() otherPoints.load(tmp2) otherPoints.setEndless(True) #pprint(tmp) #pprint(tmp2) p = points.first firstStep = True while p is not points.first or firstStep: firstStep = False d = p.data if d.kind != Kind.outgoing or d.visited: p = p.next continue # brave new polygon! newbies = getPointsUntilExit(points, otherPoints, p.data) #print("newbies= ", newbies) sequence.append(newbies) #print "sequence= ", sequence points.setEndless(False) otherPoints.setEndless(False) #pprint({'points': points.toList(), 'otherPoints': otherPoints.toList()}) result = [] for lol in sequence: tmp = [bp.point for bp in lol] kinds = [Kind.neutral]*len(tmp) poly = Poly(points=zip(tmp, kinds)) result.append(poly) return result