Forums - Open Redstone Engineers
Python Line Drawer - Printable Version

+- Forums - Open Redstone Engineers (https://forum.openredstone.org)
+-- Forum: Off-Topic (https://forum.openredstone.org/forum-4.html)
+--- Forum: Programming (https://forum.openredstone.org/forum-8.html)
+--- Thread: Python Line Drawer (/thread-2618.html)



Python Line Drawer - WrytXander - 03-01-2014

Hello folks! I have been trying to wrap my head around the infamous "Bresenham's Line Drawing Algorithm" in order to build a simple application that, well, draws lines. I managed to make one using in python, also using the PyGame Library for visuals.

I will post a link and paste the code here. (If you dont like reading in on the forums and like the sytnax highligting of pastebin, follow this link.)

Here goes le code:

Code:
import pygame
from pygame.locals import *
import sys

def app_quit():
    pygame.quit()
    sys.exit("app_quit()")

def get_line(x1, y1, x2, y2):
    points = []
    issteep = abs(y2-y1) > abs(x2-x1)
    if issteep:
        x1, y1 = y1, x1
        x2, y2 = y2, x2
    rev = False
    if x1 > x2:
        x1, x2 = x2, x1
        y1, y2 = y2, y1
        rev = True
    deltax = x2 - x1
    deltay = abs(y2-y1)
    error = int(deltax / 2)
    y = y1
    ystep = None
    if y1 < y2:
        ystep = 1
    else:
        ystep = -1
    for x in range(x1, x2 + 1):
        if issteep:
            points.append((y, x))
        else:
            points.append((x, y))
        error -= deltay
        if error < 0:
            y += ystep
            error += deltax
    if rev:
        points.reverse()
    return points
    
# Colors #
white = (255,255,255)
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)

# Screen Size #
width,height = 400,400
screen_size = (width,height)

# Inıtialization #
pygame.init()

screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption("Pygame")

# Main loop #
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            app_quit()

    mouse_state = pygame.mouse.get_pressed()
    draw_pos = pygame.mouse.get_pos()
    
    print ("")

    user_pos_1 = input("Enter position 1: ")
    user_pos_2 = input("Enter position 2: ")

    pos_1_list = user_pos_1.split(",")
    pos_2_list = user_pos_2.split(",")

    X1,Y1 = int(pos_1_list[0]),int(pos_1_list[1])
    X2,Y2 = int(pos_2_list[0]),int(pos_2_list[1])

    final_list = get_line(X1,Y1,X2,Y2)

    for i in range(0,len(final_list)):
        final_pos = final_list[i]
        screen.set_at(final_pos, white)

    pygame.display.update()

And yeah, that is probably the worst implementation of this algorithm in Python, ever. That is why I need your help. Please post your thoughs and tell me what can be improved.

Thanks :3