笛卡尔坐标系下环境点到网格索引映射及障碍物绘图问题
问题分析与解决方案
核心问题定位
你遇到的绘制异常,大概率来自三个方向的基础映射偏差:坐标系方向混淆、矩形参数逻辑错误、网格与笛卡尔坐标的映射逻辑不统一。
针对性修复步骤
1. 修正障碍物矩形的绘制逻辑
你的代码固定取每个障碍物的第一个顶点作为起点,且用固定缩放因子作为宽高,这种写法依赖顶点顺序,一旦顶点不是从左下角开始就会出错。改为自动计算每个障碍物的边界:
import matplotlib.pyplot as plt from matplotlib import patches fig, ax = plt.subplots() for obs_corner in self.obstacle_vertices: # 提取当前障碍物的所有x、y坐标 xs = [p[0] for p in obs_corner] ys = [p[1] for p in obs_corner] # 计算矩形左下角坐标、宽、高 ox = min(xs) oy = min(ys) w = max(xs) - min(xs) h = max(ys) - min(ys) # 绘制矩形 ax.add_patch(patches.Rectangle((ox, oy), w, h, edgecolor='black', facecolor='black', fill=True)) # 强制坐标轴等比例,避免图形拉伸变形 ax.set_aspect('equal') # 自动适配所有障碍物的显示范围 ax.autoscale() plt.show()
2. 统一网格与笛卡尔坐标的映射逻辑
明确两种坐标系的转换规则(以缩放因子10为例):
- 网格→笛卡尔(单元格左下角):
scaling_factor = 10 # 网格索引(row, col) 转 笛卡尔坐标(x, y) x = col * scaling_factor y = row * scaling_factor - 笛卡尔→网格:
# 笛卡尔点(x, y) 转 网格索引(row, col) col = int(x // scaling_factor) row = int(y // scaling_factor) - 若你的网格系统是row从上到下计数(即row=0对应笛卡尔坐标系的顶部),则row的转换需要反向:
# 假设环境最大y坐标为env_max_y(比如100) row = int((env_max_y - y) // scaling_factor)
3. 验证坐标系方向
matplotlib默认笛卡尔坐标系的原点在左下角,若你的网格系统原点在顶部,需调整绘制的y坐标:
# 替换原oy的赋值,假设env_max_y是环境的最大y值 oy_adjusted = env_max_y - oy - h ax.add_patch(patches.Rectangle((ox, oy_adjusted), w, h, edgecolor='black', facecolor='black', fill=True))
内容的提问来源于stack exchange,提问作者Sadiq
相关产品推荐
相关产品推荐

