从起点(X,Y)到目的地(X,Y)画一条线

汽油

我正在努力制作一个简单的游戏,使用点击并行的方法,在世界地图上让玩家移动。为此,我尝试创建一个简单的函数来计算播放器要经过的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

运动:在处理中从起点到目的地画一条线

来自分类Dev

从起点到终点画一条线的代码不起作用

来自分类Dev

用给定的角度和长度从x,y画一条线

来自分类Dev

从UILabel到UIImage画一条线

来自分类Dev

从UILabel到UIImage画一条线

来自分类Dev

Altair-在x = y的图中绘制一条线

来自分类Dev

BabylonJS画一条线

来自分类Dev

BabylonJS画一条线

来自分类Dev

慢慢画一条线

来自分类Dev

如何从一条点画一条线到多点列表

来自分类Dev

从xy平面中的点向matplotlib中的(x,y,z)点拉伸一条线

来自分类Dev

如何让用户仅使用背景图像在x轴上的画布上画一条线?

来自分类Dev

如何在famo.us中简单地画一条线?

来自分类Dev

单击目的地后创建从起点到目的地地图标记的路线线(驾驶)

来自分类Dev

在图表JS中的半甜甜圈图中的起点和终点之间画一条线

来自分类Dev

获取小部件的位置以允许从小部件a到b画一条线

来自分类Dev

高图:从标记到轴画一条线?

来自分类Dev

如何在CSS中从左右框到文本中间画一条线?

来自分类Dev

获取小部件的位置以允许从小部件a到b画一条线

来自分类Dev

用TLine从BottomLeft到TopRight画一条线

来自分类Dev

片段着色器-画一条线?

来自分类Dev

在Android中的ImageView上方画一条线

来自分类Dev

在UITextView内画一条线-NSAttributedString

来自分类Dev

如何用matplotlib画一条线?

来自分类Dev

在精灵套件中画一条线

来自分类Dev

如何画一条线WPF

来自分类Dev

在WinAPI中的单词旁边画一条线

来自分类Dev

用UIBezierPath画一条线

来自分类Dev

如何只画一条线