Tämä on eräs jana/suora algoritmi, ei varmasti yhtä tehokas kuin Bresenham mutta yksinkertaisempi ja helpompi ymmärtää. Python-kielelle.
KORJAUS: Hupsista, edellisessä koodissa saattoi tapahtua jakoa nollalla. Se on nyt korjattu. Nyt on myös pygame-versio esimerkistä
line.py
#!/usr/bin/python """ Line and Interpolate functions """ def interpolate(start, end, length): """ Returns a list of interpolation beetween two values """ result = [] difference = end-start if difference != 0: for x in range(0, length): result.append(start + (difference * (float(x) / float(length)))) return result else: return [0]*length def Line((x1, y1), (x2, y2)): """ This function returns a list of (x, y) tuples, forming a straight line beetween (x1, y1) and (x2, y2). The line can then be used for drawing, raycasting or such. It is based on my Interpolate() and is maybe the simplest way to form line. Example: >>> Line((1, 2), (3, 4)) [(1.0, 2.0), (2.0, 3.0), (3.0, 4.0)] Graphically representated: 01234 1.... 2\... 3.\.. 4..\. """ # Calculate the longest dimension. Is it used as length for lists. length = max(abs(x2 - x1), abs(y2 - y1)) + 1 # Calculate the lists. x_list = Interpolate(x1, x2, length) y_list = Interpolate(y1, y2, length) # Join (zip) the lists and return the zipped list. return zip(x_list, y_list)
Esimerkki
#!/usr/bin/python """ Testing Line function... """ # Import modules from line import * import pygame, sys # Initialize screen pygame.init() screen = pygame.display.set_mode((640, 480)) # Setup variables done = False mouse_state = False # Main loop while done != True: # Process events for event in pygame.event.get(): # Quit events first if event.type == pygame.QUIT: sys.exit(0) elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: sys.exit(0) # Then mouse events elif event.type == pygame.MOUSEBUTTONDOWN: mouse_state = True mouse_start_pos = pygame.mouse.get_pos() elif event.type == pygame.MOUSEBUTTONUP: mouse_state = False # Clear screen screen.fill((0, 0, 0)) # Draw line if neccessary if mouse_state: for pos in Line(mouse_start_pos, pygame.mouse.get_pos()): # Fill is the best way to plot pixel screen.fill((255, 255, 255), (pos, (1, 1))) pygame.display.flip()
Jaa, kommentoit normaalisti englanniksi? No, hyvä esimerkki kuitenkin :D
Aika moni kommentoi: https://www.ohjelmointiputka.net/kyselyt.php (2/2003)
Kommentoin englanniksi koska en tiedä kaikkien termien suomenkielisiä nimiä enkä tohdi niitä keksiä (tuple esimerkiksi)
Mä kommentoin jollain ihme suomen ja engelskan välimuodolla, finlishillä... ;)
Mietin missä se yksinkertaisuus on?
Aihe on jo aika vanha, joten et voi enää vastata siihen.