【SLG游戏服务器开发手册】(ROK Like)沙盘地图篇一,菱形瓦片与笛卡尔坐标系的转换(附调试工具)

在这里插入图片描述
在ROK、SOS、WOS等SLG游戏中,都是使用菱形瓦片(也称为斜方格轴对称网格)进行地图布局。

它的实际角度为arctan(1/2),由于它是一个菱形,所以这里我们称它为菱形瓦片。

他的坐标系布局主要有下面两种

  • diamond
  • staggered
    在这里插入图片描述

但是我们在屏幕里的视野,就是一个标准正交坐标系,所以很多场景下我们需要进行做一个转换

在这里插入图片描述

一、坐标系定义

1. 菱形网格坐标系

  • 轴向坐标:以菱形网格对角方向为基准轴,记作 (q, r)
  • 特征参数:菱形瓦片宽度 w=2a,高度 h=a(宽高比2:1)

2. 笛卡尔坐标系

  • 标准正交坐标系,记作 (x, y)
  • 菱形网格中心点对齐笛卡尔坐标原点
    在这里插入图片描述

二、正向转换(菱形→笛卡尔)

公式:

在这里插入图片描述

几何解释:

  • 横向位移由 q 和 r 共同驱动,纵向位移由两者差值决定
  • 参数 a 为基本单位长度(例如像素尺寸)

示例:

若 a=1,菱形坐标 (3,2) 对应笛卡尔坐标:

在这里插入图片描述


三、逆向转换(笛卡尔→菱形)

公式:

在这里插入图片描述

运算步骤:

在这里插入图片描述

转换代码

// 轴向坐标系(q, r)与笛卡尔坐标系(x, y)互转
public class CoordinateConverter {
   
   
    private static final float TILE_SIZE = 64.0f; // 菱形瓦片边长
    
    // 轴向坐标转像素坐标
    public static Point2D.Float toPixel(int q, int r) {
   
   
        float x = TILE_SIZE * (q + r);
        float y = TILE_SIZE * (r - q) * 0.5f;
        return new Point2D.Float(x, y);
    }

    // 像素坐标转轴向坐标
    public static int[] toAxial(float x, float y) {
   
   
        float qf = (x / TILE_SIZE - y / (TILE_SIZE * 0.5f)) * 0.5f;
        float rf = (x / TILE_SIZE + y / (TILE_SIZE * 0.5f)) * 0.5f;
        return new int[]{
   
   Math.round(qf), Math.round(rf)};
    }
}


九宫格AOI实战

在这里插入图片描述

1. 网格划分策略

将地图划分为菱形网格,每个网格的边界由 轴向坐标范围 定义:

// 菱形网格定义
public class DiamondGrid {
   
   
    private final int qMin, qMax;  // 轴向坐标q范围
    private final int rMin, rMax;  // 轴向坐标r范围
    private final ConcurrentHashMap<Integer, Entity> entities = new ConcurrentHashMap<>(); // 网格内实体
    
    public DiamondGrid(int qMin, int qMax, int rMin, int rMax) {
   
   
        this.qMin = qMin;
        this.qMax = qMax;
        this.rMin = rMin;
        this.rMax = rMax;
    }

    // 判断坐标是否在网格内 (q, r为轴向坐标)
    public boole
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值