import pygame
import math
# Función para dibujar una línea suavizada usando el algoritmo de Wu
def draw_smooth_line(surface, color, start, end):
x1, y1 = start
x2, y2 = end
dx = x2 - x1
dy = y2 - y1
if abs(dy) < abs(dx):
if x2 < x1:
x1, x2 = x2, x1
y1, y2 = y2, y1
gradient = dy / dx
xend = round(x1)
yend = y1 + gradient * (xend - x1)
xgap = 1 - (x1 + 0.5) % 1
xpxl1 = xend
ypxl1 = int(yend)
surface.set_at((xpxl1, ypxl1), color * (1 - (yend % 1)))
surface.set_at((xpxl1, ypxl1 + 1), color * (yend % 1))
intery = yend + gradient
xend = round(x2)
yend = y2 + gradient * (xend - x2)
xgap = (x2 + 0.5) % 1
xpxl2 = xend
ypxl2 = int(yend)
surface.set_at((xpxl2, ypxl2), color * (1 - (yend % 1)))
surface.set_at((xpxl2, ypxl2 + 1), color * (yend % 1))
for x in range(xpxl1 + 1, xpxl2 - 1):
surface.set_at((x, int(intery)), color * (1 - (intery % 1)))
surface.set_at((x, int(intery) + 1), color * (intery % 1))
intery += gradient
else:
if y2 < y1:
x1, x2 = x2, x1
y1, y2 = y2, y1
gradient = dx / dy
yend = round(y1)
xend = x1 + gradient * (yend - y1)
ygap = 1 - (y1 + 0.5) % 1
ypxl1 = yend
xpxl1 = int(xend)
surface.set_at((xpxl1, ypxl1), color * (1 - (xend % 1)))
surface.set_at((xpxl1, ypxl1 + 1), color * (xend % 1))
interx = xend + gradient
yend = round(y2)
xend = x2 + gradient * (yend - y2)
ygap = (y2 + 0.5) % 1
ypxl2 = yend
xpxl2 = int(xend)
surface.set_at((xpxl2, ypxl2), color * (1 - (xend % 1)))
surface.set_at((xpxl2, ypxl2 + 1), color * (xend % 1))
for y in range(ypxl1 + 1, ypxl2 - 1):
surface.set_at((int(interx), y), color * (1 - (interx % 1)))
surface.set_at((int(interx) + 1, y), color * (interx % 1))
interx += gradient
# Ejemplo de uso
pygame.init()
width = 800
height = 600
window = pygame.display.set_mode((width, height))
pygame.display.set_caption('Algoritmo de Wu')
white = (255, 255, 255)
black = (0, 0, 0)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
window.fill(black)
draw_smooth_line(window, white, (100, 100), (700, 500))
pygame.display.flip()
pygame.quit()