예제 #1
0
 def testValid(self):
     validPath = Path()
     validPath.addPoint(self.p0)
     validPath.addPoint(self.p1)
     validPath.addPoint(self.p2)
     validPath.addPoint(self.p0)
     self.assertTrue(validPath.isConnected())
예제 #2
0
def jarviswalk(points):
    """Implementation of Jarvis Walk aka Gift wrapping algorithm.
    Based on the article http://en.wikipedia.org/wiki/Gift_wrapping_algorithm
    """
    hull = Path()
    xsorted = sorted(points, key=lambda point: point.x)
    hull.addPoint(xsorted[0])
    while True:
        nextP = None
        maxLinearPoint = None
        maxLinearDistance = -1.0
        possiblePoints = filter(lambda p: p not in hull.points[1:], xsorted) 
        for p in possiblePoints:
            if p is hull.points[-1]: continue
            line = Line(hull.points[-1], p)
            allright, localMaxLinear, localMaxLinearDistance = allrightAndMaxLinearPoint(line, xsorted)
            if allright:
                nextP = p
                break
            if localMaxLinear is not None and localMaxLinearDistance != -1.0 and localMaxLinearDistance > maxLinearDistance:
                maxLinearPoint, maxLinearDistance = (localMaxLinear, localMaxLinearDistance)
        assert(nextP is not None or (maxLinearPoint is not None and maxLinearDistance > 0.0))
        if nextP is not None:
            hull.addPoint(nextP)
        else:
            hull.addPoint(maxLinearPoint)
        if hull.isConnected():
            break
    return hull
예제 #3
0
 def testDisconnected(self):
     disconnectedPath = Path()
     disconnectedPath.addPoint(self.p0)
     disconnectedPath.addPoint(self.p1)
     disconnectedPath.addPoint(self.p2)
     self.assertFalse(disconnectedPath.isConnected())
예제 #4
0
 def testEmpty(self):
     emptyPath = Path()
     self.assertFalse(emptyPath.isConnected())
     self.assertEquals(emptyPath.length(), 0)