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)
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)