我正在努力制作一个简单的游戏,使用点击并行的方法,在世界地图上让玩家移动。为此,我尝试创建一个简单的函数来计算播放器要经过的XY像素列表。
大部分都可以正常工作,但是当目标X和Y不相等时,将结果之一乘以2会给我带来麻烦。我在解决这一问题时非常费力,如果有人对如何改进或修复它有想法,我将非常感谢。
import math
def linePath(start, finish):
if start[0] == finish[0]:
a = 1
else:
a = (finish[1] - start[1]) / float((finish[0] - start[0]))
b = start[1] - (a * start[0])
if abs(a) >= 1:
rng = xrange(start[1], finish[1] + 1) or reversed(xrange(finish[1], start[1] + 1))
else:
rng = xrange(start[0], finish[0] + 1) or reversed(xrange(finish[0], start[0] + 1))
for i in rng:
if abs(a) >= 1:
y = i
x = int(math.ceil((y - b)/ a))
else:
x, y = i, start[1] + int(math.ceil(a * i + b))
if start[0] != finish[0]:
yield x, y
else:
yield start[0], y
start = (10, 10)
destination = (15, 15)
print list(linePath(start, destination))
#Bugs: when start[0] > start[1] and start > destination (eg. destination = (16, 15))
#when start[0] < start[1] and start < destination (eg. destination = (5, 6))
幸运的是,杰克·埃尔顿·布雷森纳姆(Jack Elton Bresenham)于1962年为您解决了这个问题。
这是在Roguebashin中找到的Bresenham线算法的实现:
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
# Reverse the list if the coordinates were reversed
if rev:
points.reverse()
return points
start = (10, 10)
destination = (16, 15)
print list(get_line(start[0], start[1], destination[0], destination[1]))
输出:
[(10, 10), (11, 11), (12, 12), (13, 12), (14, 13), (15, 14), (16, 15)]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句