Beispiel #1
0
 def __init__(self, xpos, ypos, angle, renderer):
     self.x = xpos
     self.y = ypos
     self.angle = float(angle)
     self.turn_angle = 30.0
     self.random_angle = 5.0
     self.renderer = renderer
     self.shapes = BasicShapes(renderer.buffer_x, renderer.buffer_y)
     self.stack = []
Beispiel #2
0
class TestBasicShapes(unittest.TestCase):

    def setUp(self):
        self.shapes = BasicShapes(100, 100)

    def test_interface(self):
        for func in ('setCanvasSize', 'drawLine'):
            self.assertTrue(hasattr(self.shapes, func) and callable(getattr(self.shapes, func)), "Interface requires function: " + func)

    def test_setCanvasSize(self):
        self.assertEqual(self.shapes.setCanvasSize(300, 400), (300, 400))
        self.assertEqual(self.shapes.setCanvasSize(500), (500, 400))
        self.assertEqual(self.shapes.setCanvasSize(), (500, 400))
        self.assertEqual(self.shapes.setCanvasSize(600, 700), (600, 700))

    def test_drawLine(self):
        self.shapes.setCanvasSize(1000, 1000)
        pixels = self.shapes.drawLine(0, 0, 1000, 1000, (255, 255, 255))
        self.assertTrue(len(pixels) >= 1000)
        self.assertTrue(len(pixels[0]) == 3)
        self.assertTrue(pixels[0][0] == 0 and pixels[0][1] == 0 and pixels[1000][0] == 1000 and pixels[1000][1] == 1000)
Beispiel #3
0
 def setUp(self):
     self.shapes = BasicShapes(100, 100)
Beispiel #4
0
class SimpleTurtle:
    """Implements the drawing functions and stack for a basic turtle. Must be driven externally (eg: by LSystem)
    
    :Functions:
        - 'turnRight': Turns the turtle CW by angle
        - 'turnLeft': Turns the turtle CCW by angle
        - 'turnRightRandom': Turns the turtle CW by a random number in [0, random_angle)
        - 'turnLeftRandom': Turns the turtle CCW by a random number in [0, random_angle)
        - 'draw': Draws a line in the current direction
        - 'push': Pushes the current position and angle onto the stack
        - 'pop': Restores the previous position and angle from the stack
        - 'render': Renders the current session
        - 'reset': Resets the current session
        - 'setAngle': Sets the value of angle for turnLeft and turnRight
        - 'setRandomAngle': Sets the value of random_angle for turnLeftRandom and turnRightRandom
    
    :Examples:
    >>> from pygraph.generate.SimpleTurtle import SimpleTurtle
    >>> turtle = SimpleTurtle(128,0, 90) # x, y, up
    >>> turtle.draw()
    >>> turtle.push()
    >>> turtle.turnLeft(30)
    >>> turtle.draw()
    >>> turtle.pop()
    >>> turtle.turnRight(30)
    >>> turtle.draw()
    >>> turtle.render('./test.png')
    """

    def __init__(self, xpos, ypos, angle, renderer):
        self.x = xpos
        self.y = ypos
        self.angle = float(angle)
        self.turn_angle = 30.0
        self.random_angle = 5.0
        self.renderer = renderer
        self.shapes = BasicShapes(renderer.buffer_x, renderer.buffer_y)
        self.stack = []

    def turnRight(self):
        self.angle -= self.turn_angle
        self.angle %= 360
        return self.angle

    def turnLeft(self):
        self.angle += self.turn_angle
        self.angle %= 360
        return self.angle

    def turnRightRandom(self):
        self.angle -= random.random()*self.random_angle
        self.angle %= 360
        return self.angle

    def turnLeftRandom(self):
        self.angle += random.random()*self.random_angle
        self.angle %= 360
        return self.angle

    def push(self):
        self.stack.append([self.x, self.y, self.angle])

    def pop(self):
        self.x, self.y, self.angle = self.stack.pop()

    def reset(self, xpos, ypos, angle):
        self.x = xpos
        self.y = ypos
        self.angle = float(angle)

    def draw(self, distance=5):
        newx = int(round(float(self.x) + math.cos(math.radians(self.angle)) * float(distance)))
        newy = int(round(float(self.y) - math.sin(math.radians(self.angle)) * float(distance)))
        self.renderer.drawOver(self.shapes.drawLine(self.x, self.y, newx, newy, [0,0,0]))
        self.x = newx
        self.y = newy

    def setAngle(self, angle):
        self.turn_angle = float(angle % 360)
        return self.turn_angle

    def setRandomAngle(self, angle):
        self.random_angle = float(angle % 360)
        return self.random_angle
Beispiel #5
0
 def setUpClass(self):
     self.shapes = BasicShapes(10, 10)
     self.line1 = self.shapes.drawLine(0, 5, 9, 5, (255, 0, 0))
     self.line2 = self.shapes.drawLine(0, 5, 9, 5, (0, 255, 0))
     self.line3 = self.shapes.drawLine(5, 0, 5, 9, (0, 0, 255))
Beispiel #6
0
class TestRenderer(unittest.TestCase):

    @classmethod
    def setUpClass(self):
        self.shapes = BasicShapes(10, 10)
        self.line1 = self.shapes.drawLine(0, 5, 9, 5, (255, 0, 0))
        self.line2 = self.shapes.drawLine(0, 5, 9, 5, (0, 255, 0))
        self.line3 = self.shapes.drawLine(5, 0, 5, 9, (0, 0, 255))

    def setUp(self):
        self.renderer = Renderer(10, 10)

    def test_interface(self):
        for func in ('render', 'clearBuffer', 'setBackgroundColor', 'drawOver', 'drawUnder'):
            self.assertTrue(hasattr(self.renderer, func) and callable(getattr(self.renderer, func)), "Interface requires function: " + func)

    def test_render(self):
        self.renderer.setBackgroundColor(200, 200, 200)
        self.renderer.clearBuffer()
        self.renderer.drawOver(self.line1)
        self.renderer.drawUnder(self.line2, 3, 3)

        render = self.renderer.render()
        self.assertIs(type(render), list)
        self.assertEqual(render[5], [255, 0, 0]*10, "The red line was not rendered properly")
        self.assertEqual(render[8], [200, 200, 200]*3 + [0, 255, 0]*7, "The green line was not rendered properly")
        for row in [0, 1, 2, 3, 4, 6, 7, 9]:
            self.assertEqual(render[row], [200, 200, 200]*10, "Row " + str(row) + " did not render background properly")

        self.renderer.render('./test.png')
        self.assertTrue(os.path.exists('./test.png'), "The file wasn't created upon rendering")
        try:
            os.remove('./test.png')
        except OSError:
            fail("Could not clean up the created test file")

    def test_clearBuffer(self):
        self.renderer.setBackgroundColor(10, 20, 30)
        self.renderer.clearBuffer()
        for i, row in enumerate(self.renderer.pixels):
            self.assertEqual(row[0:30], [10, 20, 30]*10, "Row " + str(i) + " was not cleared")

    def test_setBackgroundColor(self):
        self.assertEqual(self.renderer.setBackgroundColor(200, 200, 200), [200, 200, 200])
        self.assertEqual(self.renderer.setBackgroundColor(256, 255, 255), [200, 200, 200])
        self.assertEqual(self.renderer.setBackgroundColor(), [200, 200, 200])
        self.assertEqual(self.renderer.setBackgroundColor(200, 100), [200, 200, 200])
        self.assertEqual(self.renderer.setBackgroundColor(200, 100, 50), [200, 100, 50])

    def test_drawOver(self):
        self.renderer.drawOver(self.line1)
        self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10)

        self.renderer.drawOver(self.line1, 3, 2)
        self.assertEqual(self.renderer.pixels[7][9:30], [255, 0, 0]*7)

        self.renderer.drawOver(self.line2, 2, 0)
        self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*2 + [0, 255, 0]*8)

    def test_drawUnder(self):
        self.renderer.drawUnder(self.line1)
        self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10)

        self.renderer.drawUnder(self.line1, 3, 2)
        self.assertEqual(self.renderer.pixels[7][9:30], [255, 0, 0]*7)

        self.renderer.drawUnder(self.line2, 2, 0)
        self.assertEqual(self.renderer.pixels[5], [255, 0, 0]*10)

    def test_integration_drawOrder(self):
        self.renderer.drawOver(self.line1, 0, -2)
        self.renderer.setBackgroundColor(100, 100, 100)
        self.renderer.clearBuffer()
        self.renderer.drawOver(self.line1)
        self.renderer.drawUnder(self.line2, 1, 3)
        self.renderer.drawOver(self.line3)
        self.renderer.drawUnder(self.line3, 2)
        render = self.renderer.render()

        self.renderer.render('./integration_drawOrder.png')
        self.assertTrue(os.path.exists('./integration_drawOrder.png'), "The file wasn't created upon rendering")

        self.assertIs(type(render), list)
        for row in [0, 1, 2, 3, 4, 6, 7, 9]:
            self.assertEqual(render[row], [100, 100, 100]*5 + [0, 0, 255] + [100, 100, 100] + [0, 0, 255] + [100, 100, 100]*2,
                    "Background did not render properly on row: " + str(row))
        self.assertEqual(render[5], [255, 0, 0]*5 + [0, 0, 255] + [255, 0, 0]*4, "Redline did not render properly")
        self.assertEqual(render[8], [100, 100, 100] + [0, 255, 0]*4 + [0, 0, 255] + [0, 255, 0]*4, "GreenLine did not render properly")