如何在Ruby中计算等距矩形内的笛卡尔边界矩形
解决等距投影视口限制矩形的位置计算问题
首先修正你代码中瓦片行列数的计算错误:笛卡尔坐标系中,单个瓦片的实际宽高对应2:1投影比例是20px(宽)×20px(高)(40px宽的投影瓦片对应笛卡尔里20px的宽度,20px高的投影瓦片对应笛卡尔里20px的高度)。
正确的矩形位置与尺寸计算代码
def calculate_bounding_box tile_width = 40 # 投影后瓦片宽度 tile_height = 20 # 投影后瓦片高度 # 笛卡尔坐标系中单个瓦片的实际宽高 cart_tile_w = tile_width / 2 cart_tile_h = tile_height # 地图的瓦片列数(X方向)和行数(Y方向) cols = cartesian_map_width / cart_tile_w rows = cartesian_map_height / cart_tile_h # 红色矩形(投影后地图的轴对齐包围盒)的参数 # 左上角X坐标:地图左下角点投影后的X位置 rect_x = -rows * cart_tile_w # 左上角Y坐标:地图左上角点投影后的Y位置 rect_y = 0 # 矩形宽高:基于修正后的行列数计算 rect_width = (cols + rows) * cart_tile_w rect_height = (cols + rows) * (tile_height / 2) { x: rect_x, y: rect_y, width: rect_width, height: rect_height } end
推导逻辑
- 坐标转换基础:笛卡尔坐标
(x, y)转等距投影屏幕坐标的公式为:sx = (x - y) * (tile_width / 2) sy = (x + y) * (tile_height / 2) - 地图边界投影:
- 地图左上角
(0, 0)投影后为(0, 0) - 地图左下角
(0, cartesian_map_height)投影后为(-cartesian_map_height, cartesian_map_height / 2),代入转换公式即可得到该结果
- 地图左上角
- 轴对齐包围盒:投影后地图的最左点是左下角的投影X坐标,最上点是左上角的投影Y坐标,因此红色矩形左上角为
(-cartesian_map_height, 0),宽高则是投影后地图的最大跨度。
视口移动限制调整
如果你的红色矩形是视口在笛卡尔地图内的可移动范围(而非投影后的包围盒),则需要结合视口尺寸计算:
假设视口屏幕宽为viewport_w,高为viewport_h,则视口对应的笛卡尔瓦片数总和为total_vp_tiles = viewport_w / (tile_width / 2),视口可移动范围的左上角为(0, 0),右下角为(cartesian_map_width - (total_vp_tiles - rows)*cart_tile_w, cartesian_map_height - (total_vp_tiles - cols)*cart_tile_h),矩形宽高为对应差值。
内容的提问来源于stack exchange,提问作者robins35
相关产品推荐
相关产品推荐

