跳到主要内容

hexagon

简介

支持六边形坐标计算

base: https://www.redblobgames.com/grids/hexagons/

组件接口

hexagon.gs

函数原型函数作用
array qr_to_cube(int q, int r)通过[q, r]计算cube三坐标系的坐标[x, y, z]
array cube_to_qr(int x, int y, int z)通过[x, y, z]计算cube三坐标系的[q, r]
int calc_cube_x_from_qr(int q, int r)通过[q, r]计算cube三坐标系的x值
int calc_cube_z_from_qr(int q, int r)通过[q, r]计算三坐标系的z值
int calc_cube_y_from_cube_xz(int x, int z)通过三坐标系的x,z值计算y值
int calc_q_from_cube_xz(int x, int z)通过三坐标系的x,z值计算odd-r的q值
int calc_r_from_cube_xz(int x, int z)通过三坐标系的x,z值计算odd-r的r值
array calc_cube_offset_from_qr(int q1, int r1, int q2, int r2)通过[q1, r1]和[q2, r2]计算cube三坐标系的偏移量
int get_distance(int q1, int r1, int q2, int r2)计算[q1, r1]和[q2, r2]之间的距离
array get_neighbor_in_direction(int q, int r, int direction = DIRECTION_RIGHT)获取相邻的坐标
array get_neighbors(int q, int r)获取相邻的所有坐标
array get_diagonals(int q, int r)获取对角线上的相邻的坐标
array get_ring(int q, int r, int distance)获取环形区域上的所有坐标
array get_circle(int q, int r, int distance)获取圆形区域上的所有坐标(包括中心点)
void iterate_ring(int q, int r, int distance, function func)迭代环形区域上的所有坐标
void iterate_circle(int q, int r, int distance, function func)迭代圆形区域上的所有坐标
array get_line(int aq, int ar, int bq, int br)获取线条经过的所有坐标
void iterate_line(int aq, int ar, int bq, int br, function func)迭代线条经过的所有坐标
array get_rectangle(int ltq, int ltr, int rbq, int rbr)获取矩形区域的所有坐标
void iterate_rectangle(int ltq, int ltr, int rbq, int rbr, function func)迭代矩形区域的所有坐标

样例

int q = 0;
int r = 0;

int x = hexagon.calc_cube_x_from_qr(q, r);
test_equal(x, 0);

int z = hexagon.calc_cube_z_from_qr(q, r);
test_equal(z, 0);

int y = hexagon.calc_cube_y_from_cube_xz(x, z);
test_equal(y, 0);

let int dx, int dz = hexagon.calc_cube_offset_from_qr(2, 2, 3, 2);
test_equal(dx, -1);
test_equal(dz, 0);

test_equal(hexagon.get_distance(1, 1, 0, 0), 2);
test_equal(hexagon.get_distance(2, 2, 5, 0), 4);
test_equal(hexagon.get_distance(2, 2, 4, 0), 3);

let int q_in_right, int r_in_right = hexagon.get_neighbor_in_direction(2, 1, hexagon.DIRECTION_RIGHTTOP);
test_equal(q_in_right, 3);
test_equal(r_in_right, 0);

hexagon.iterate_line(0, 0, 3, 1, (int q, int r) {
printf("(%d, %d)\n", q, r);
});
printf("-----------------\n");
hexagon.iterate_rectangle(0, 0, 3, 2, (int q, int r) {
printf("(%d, %d)\n", q, r);
});