You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

推导逻辑

  1. 坐标转换基础:笛卡尔坐标(x, y)转等距投影屏幕坐标的公式为:
    sx = (x - y) * (tile_width / 2)
    sy = (x + y) * (tile_height / 2)
    
  2. 地图边界投影:
    • 地图左上角(0, 0)投影后为(0, 0)
    • 地图左下角(0, cartesian_map_height)投影后为(-cartesian_map_height, cartesian_map_height / 2),代入转换公式即可得到该结果
  3. 轴对齐包围盒:投影后地图的最左点是左下角的投影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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:35:56