Example #1
0
    def draw_triangle(self, v1, v2, v3):
        """
        :type v1: Vertex
        :type v2: Vertex
        :type v3: Vertex
        """
        a, b, c = sorted([v1, v2, v3], key=lambda k: k.position.y)
        middle_factor = 0
        if c.position.y - a.position.y != 0:
            middle_factor = (b.position.y - a.position.y) / (c.position.y - a.position.y)
        middle = interpolate(a, c, middle_factor)

        start_y = int(a.position.y)
        end_y = int(b.position.y)
        for y in range(start_y, end_y + 1):
            factor = (y - start_y) / (end_y - start_y) if end_y != start_y else 0
            va = interpolate(a, b, factor)
            vb = interpolate(a, middle, factor)
            self.draw_scanline(va, vb, y)

        start_y = int(b.position.y)
        end_y = int(c.position.y)
        for y in range(start_y, end_y + 1):
            factor = (y - start_y) / (end_y - start_y) if end_y != start_y else 0
            va = interpolate(b, c, factor)
            vb = interpolate(middle, c, factor)
            self.draw_scanline(va, vb, y)
Example #2
0
    def draw_triangle(self, v1, v2, v3):
        """
        :type v1: Vertex
        :type v2: Vertex
        :type v3: Vertex
        """
        a, b, c = sorted([v1, v2, v3], key=lambda k: k.position.y)
        middle_factor = 0
        if c.position.y - a.position.y != 0:
            middle_factor = (b.position.y - a.position.y) / (c.position.y -
                                                             a.position.y)
        middle = interpolate(a, c, middle_factor)

        start_y = int(a.position.y)
        end_y = int(b.position.y)
        for y in range(start_y, end_y + 1):
            factor = (y - start_y) / (end_y -
                                      start_y) if end_y != start_y else 0
            va = interpolate(a, b, factor)
            vb = interpolate(a, middle, factor)
            self.draw_scanline(va, vb, y)

        start_y = int(b.position.y)
        end_y = int(c.position.y)
        for y in range(start_y, end_y + 1):
            factor = (y - start_y) / (end_y -
                                      start_y) if end_y != start_y else 0
            va = interpolate(b, c, factor)
            vb = interpolate(middle, c, factor)
            self.draw_scanline(va, vb, y)
Example #3
0
 def draw_scanline(self, va, vb, y):
     x1 = int(va.position.x)
     x2 = int(vb.position.x)
     sign = 1 if x2 > x1 else -1
     factor = 0
     for x in range(x1, x2 + sign * 1, sign):
         if x1 != x2:
             factor = (x - x1) / (x2 - x1)
         color = interpolate(va.color, vb.color, factor)
         self.draw_point(Vector(x, y), color)
Example #4
0
 def draw_scanline(self, va, vb, y):
     x1 = int(va.position.x)
     x2 = int(vb.position.x)
     sign = 1 if x2 > x1 else -1
     factor = 0
     for x in range(x1, x2 + sign * 1, sign):
         if x1 != x2:
             factor = (x - x1) / (x2 - x1)
         color = interpolate(va.color, vb.color, factor)
         self.draw_point(Vector(x, y), color)