Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Python: Yksinkertainen viiva-algoritmi

moshe [19.03.2005 23:32:18]

#

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

Koipio-ohjelma [20.03.2005 19:37:18]

#

Jaa, kommentoit normaalisti englanniksi? No, hyvä esimerkki kuitenkin :D

Blaze [20.03.2005 22:31:39]

#

Aika moni kommentoi: https://www.ohjelmointiputka.net/kyselyt.php (2/2003)

moshe [20.03.2005 23:46:14]

#

Kommentoin englanniksi koska en tiedä kaikkien termien suomenkielisiä nimiä enkä tohdi niitä keksiä (tuple esimerkiksi)

SysRq868 [24.03.2005 13:54:37]

#

Mä kommentoin jollain ihme suomen ja engelskan välimuodolla, finlishillä... ;)

T.M. [09.04.2005 02:16:21]

#

Mietin missä se yksinkertaisuus on?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta