给定两个3-D坐标,我们需要在连接它们的线上找到点。所有点都有整数坐标。
例子:
输入:(-1,1,1),(5,3,-1)输出:(-1,1,1),(0,1,1),(1,2,0),(2,2 ,0),(3,2,0),(4,3,-1),(5,3,-1) 输入:(-7,0,-3),(2,-5,-1)输出:(-7,0,-3),(-6,-1,-3),(-5,-1 ,-3),(-4,-2,-2),(-3,-2,-2),(-2,-3,-2),(-1,-3,-2),( 0,-4,-1),(1,-4,-1),(2,-5,-1)
Bresenham的算法非常有效,因为它避免了浮点算术运算。与二维线图一样,我们使用一个变量来存储坡度误差,即从实际几何线绘制的线的坡度误差。一旦该斜率误差超过允许值,我们将修改数字以消除误差。
要绘制的线的驱动轴是线沿其行进最远的那条,即,轴坐标之差最大。因此,坐标值沿着驱动轴线性增加1,并且使用斜率误差变量来确定另一个轴的坐标值的变化。
对于2D线,我们使用一个斜率误差变量,但对于3D线,我们需要两个( )的每个非驱动轴。如果当前点是 (x,y,z)并且驱动轴为正X轴,则下一个点可能
- (x + 1,y,z)
- (x + 1,y + 1,z)
- (x + 1,y,z + 1)
- (x + 1,y + 1,z + 1)
斜率误差变量的值根据以下公式确定:
斜率误差变量的初始值由以下方程式给出:
这里表示两个端点沿X,Y,Z轴的坐标差。
算法:-
- 输入两个端点并将初始点存储为
- 阴谋
- 计算常数并通过比较确定驱动轴
的绝对值
如果绝对 )为最大值,则X轴为驱动轴
如果绝对 )为最大值,则Y轴为驱动轴
如果绝对 )为最大值,则Z轴为驱动轴 - 假设X轴是驱动轴,那么
- 在每一个沿着线,从k = 0开始,检查以下条件
并确定下一点:- 如果和 , 然后
阴谋和
放 - 否则和 , 然后
阴谋和
放 - 否则 , 然后
阴谋和
放 - 否则
阴谋和
放 >
- 如果和 , 然后
- 重复步骤5 次
Python3
# Python3 code for generating points on a 3-D line
# using Bresenham's Algorithm
def Bresenham3D(x1, y1, z1, x2, y2, z2):
ListOfPoints = []
ListOfPoints.append((x1, y1, z1))
dx = abs(x2 - x1)
dy = abs(y2 - y1)
dz = abs(z2 - z1)
if (x2 > x1):
xs = 1
else:
xs = -1
if (y2 > y1):
ys = 1
else:
ys = -1
if (z2 > z1):
zs = 1
else:
zs = -1
# Driving axis is X-axis"
if (dx >= dy and dx >= dz):
p1 = 2 * dy - dx
p2 = 2 * dz - dx
while (x1 != x2):
x1 += xs
if (p1 >= 0):
y1 += ys
p1 -= 2 * dx
if (p2 >= 0):
z1 += zs
p2 -= 2 * dx
p1 += 2 * dy
p2 += 2 * dz
ListOfPoints.append((x1, y1, z1))
# Driving axis is Y-axis"
elif (dy >= dx and dy >= dz):
p1 = 2 * dx - dy
p2 = 2 * dz - dy
while (y1 != y2):
y1 += ys
if (p1 >= 0):
x1 += xs
p1 -= 2 * dy
if (p2 >= 0):
z1 += zs
p2 -= 2 * dy
p1 += 2 * dx
p2 += 2 * dz
ListOfPoints.append((x1, y1, z1))
# Driving axis is Z-axis"
else:
p1 = 2 * dy - dz
p2 = 2 * dx - dz
while (z1 != z2):
z1 += zs
if (p1 >= 0):
y1 += ys
p1 -= 2 * dz
if (p2 >= 0):
x1 += xs
p2 -= 2 * dz
p1 += 2 * dy
p2 += 2 * dx
ListOfPoints.append((x1, y1, z1))
return ListOfPoints
def main():
(x1, y1, z1) = (-1, 1, 1)
(x2, y2, z2) = (5, 3, -1)
ListOfPoints = Bresenham3D(x1, y1, z1, x2, y2, z2)
print(ListOfPoints)
main()
输出:
[(-1, 1, 1), (0, 1, 1), (1, 2, 0), (2, 2, 0), (3, 2, 0), (4, 3, -1), (5, 3, -1)]