【已解决】Python Bresenham 3D算法

放一段使用Python实现Bresenham 3D 算法的代码,并通过Matplot可视化

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from numba import njit

@njit
def bresenham_safe(grid, x0, y0, z0, x1, y1, z1, value_to_fill):
    start_point = [int(x0), int(y0), int(z0)]
    end_point = [int(x1), int(y1), int(z1)]

    steep_xy = (abs(end_point[1] - start_point[1]) > abs(end_point[0] - start_point[0]))
    if steep_xy:
        start_point[0], start_point[1] = start_point[1], start_point[0]
        end_point[0], end_point[1] = end_point[1], end_point[0]

    steep_xz = (abs(end_point[2] - start_point[2]) > abs(end_point[0] - start_point[0]))
    if steep_xz:
        start_point[0], start_point[2] = start_point[2], start_point[0]
        end_point[0], end_point[2] = end_point[2], end_point[0]

    delta = [abs(end_point[0] - start_point[0]), abs(end_point[1] - start_point[1]), abs(end_point[2] - start_point[2])]

    error_xy = delta[0] / 2
    error_xz = delta[0] / 2

    step = [
        -1 if start_point[0] > end_point[0] else 1,
        -1 if start_point[1] > end_point[1] else 1,
        -1 if start_point[2] > end_point[2] else 1
    ]

    y = start_point[1]
    z = start_point[2]

    for x in range(start_point[0], end_point[0], step[0]):
        point = [x, y, z]

        if steep_xz:
            point[0], point[2] = point[2], point[0]
        if steep_xy:
            point[0], point[1] = point[1], point[0]

        if 0 <= point[0] < grid.shape[0] and 0 <= point[1] < grid.shape[1] and 0 <= point[2] < grid.shape[2]:
            grid[point[0], point[1], point[2]] = value_to_fill

        error_xy -= delta[1]
        error_xz -= delta[2]

        if error_xy < 0:
            y += step[1]
            error_xy += delta[0]

        if error_xz < 0:
            z += step[2]
            error_xz += delta[0]

@njit
def get_free_area(obstacle, x, y, z):
    free = np.zeros_like(obstacle)
    obstacle = obstacle > 0
    xs, ys, zs = np.where(obstacle)
    for ox, oy, oz in zip(xs, ys, zs):
        bresenham_safe(free, ox, oy, oz, x, y, z, 1)
    free -= obstacle
    return free

# 创建三维网格和障碍物示例
grid = np.zeros((65, 65, 12))
obstacle = np.zeros_like(grid)
start = np.zeros_like(grid)
obstacle[20:30, 4:60, 2:9] = 1

# 获取自由区域
x = 8
y = 8
z = 11
import time
start_time = time.time()
free_area = get_free_area(obstacle, x, y, z)
end_time = time.time()
execution_time = end_time - start_time
print("□□□□□□□□□□程序执行时间为:", execution_time, "秒") 
start[8,8,11]=1

# 翻转颜色映射
cmap = plt.cm.gray
cmap_inverted = cmap.reversed()
# # 可视化
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 设置坐标轴范围和比例,让显示比例正常
x_dim, y_dim, z_dim = obstacle.shape
max_dim = max(x_dim, y_dim, z_dim)
ax.set_xlim(0, max_dim)
ax.set_ylim(0, max_dim)
ax.set_zlim(0, max_dim)


# ------------------------------------------------------------------------------
# x_indices, y_indices, z_indices = np.where(free_area)
ax.voxels(free_area, facecolors='green',)
ax.voxels(obstacle, facecolors='red',)
ax.voxels(start, facecolors='blue')
# print(grid)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
默_笙2 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003962 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技2 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼2 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时2 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控