#hexagonal #hexagon #grid #bestagon

hexing

一个基本的Rust库,用于操作六边形网格

9个版本

0.3.3 2024年8月21日
0.3.2 2024年8月21日
0.2.1 2024年8月15日
0.1.3 2024年8月4日
0.1.2 2024年7月20日

#162 in 数学

Download history 338/week @ 2024-07-19 82/week @ 2024-07-26 178/week @ 2024-08-02 91/week @ 2024-08-09 477/week @ 2024-08-16

842 每月下载量

GPL-3.0 许可证

65KB
567

Contributors Forks Stargazers Issues License


Logo

Hexing


"六边形是最好的六边形"
一个基本的Rust库,用于操作六边形网格。


hexing是一个Rust库,旨在处理和计算六边形网格。它提供用于处理六边形位置和方向的工具,以及用于探索六边形环和螺旋的迭代器。

功能

  • 六边形坐标操作:使用轴坐标表示和操作六边形网格中的位置。
  • 距离计算:计算两个六边形位置之间的距离。
  • 像素坐标转换:将六边形位置转换为像素坐标以供图形使用。
  • 反射和旋转:将反射和旋转应用于六边形位置。
  • 环和螺旋迭代器:获取围绕中心位置环或螺旋中的位置。
  • 边界:计算一个点是否在六边形边界框内。
  • 线迭代器:获取两个六边形位置之间的线上的位置。
  • 数字特质:允许使用各种数值类型进行泛型计算。
  • 序列化和反序列化:使用serde功能序列化和反序列化六边形位置和方向。
  • 路径查找:使用A*算法在两个六边形位置之间找到最短路径。
  • 视野:计算六边形网格的视野。
  • 行动场:计算六边形网格的行动场。
  • 噪声生成:使用noisecrate为六边形网格生成噪声图。

关于Serde功能的文档位于docs/serde.md文件中。路径查找、视野、行动场和噪声生成功能的文档位于docs/layout.md文件中。

数字特质

该库使用Number特质来允许使用各种数值类型进行泛型计算。此特质为几种类型实现,包括整数和浮点数。

主要类型

HexPosition<T>

表示具有坐标T的六边形网格中的位置。坐标为轴格式(x, y)

  • 创建:使用给定的 qr 坐标在轴向格式中创建一个新的 [HexPosition]。坐标解释见此 文档

    let pos = HexPosition::new(1, 2);
    let pos2 = HexPosition(3, 4);
    
    // Constant: The origin of the hexagonal grid.
    let origin = HexPosition::ORIGIN;
    
  • 转换为像素坐标:将当前 [HexPosition] 转换为像素坐标。基本上,它将六边形网格中的一个位置转换为正交网格中的一个位置。

    let pixel_coords = pos.to_pixel_coordinates();
    let pixel_coords2 = HexPosition::from_pixel_coordinates(pixel_coords);
    
  • 距离计算:使用 曼哈顿距离 计算两个六边形位置之间的距离。

    let distance = pos.distance(HexPosition::new(3, 4));
    
  • 旋转:将对原点进行 2 x 60 度的旋转。

    let rotated_pos = pos.rotation(2);
    
  • 反射:将在原点周围进行中心对称反射。

    let reflected_pos = pos.reflect();
    
  • 环迭代器:一个迭代器,返回围绕中心位置的环上的位置。迭代器将返回给定半径的环上的位置。

    for ring_pos in pos.ring(2) {
        println!("{:?}", ring_pos);
    }
    
  • 螺旋迭代器:一个迭代器,返回围绕中心位置的螺旋上的位置。迭代器将返回给定半径的螺旋上的位置。

    for spiral_pos in pos.spiral(2) {
        println!("{:?}", spiral_pos);
    }
    
  • 线迭代器:一个迭代器,返回两个六边形位置之间的线上的位置。

    let a = HexPosition(0, 0);
    let b = HexPosition(-2, -1);
    for line_pos in a.line(b) {
        println!("{:?}", line_pos);
    }
    
  • 边界:一个实用函数,用于计算六边形网格的边界框。

    use hexing::{utils::HexBound, HexPosition};
    
    let center = HexPosition(0, 0);
    let radius = 3;
    
    let bounding_box = HexBound::new(center, radius);
    
    assert!(bounding_box.contains(HexPosition(0, 0)));
    assert_eq!(bounding_box.radius(), 3);
    assert_eq!(bounding_box.center(), HexPosition(0, 0));
    

HexDirection

枚举,表示六边形网格中的六个可能方向。

  • 可用方向:

    • (1, 0)
    • 右上 (1, -1)
    • 左上 (0, -1)
    • (-1, 0)
    • 左下 (-1, 1)
    • 右下 (0, 1)
  • 转换为向量:您可以使用 to_vector 方法将 [HexDirection] 转换为 [HexPosition]。

    let direction = HexDirection::Right;
    let vector = direction.to_vector();
    

用法示例

以下是一些示例,说明 hexing 的功能。

创建六边形位置

use hexing::HexPosition;

let pos = HexPosition::new(1, 2);
let pos2 = HexPosition(3, 4);
let origin = HexPosition::ORIGIN;

println!("Position 1: {:?}", pos);
println!("Position 2: {:?}", pos2);
println!("Origin: {:?}", origin);

转换为像素坐标

use hexing::HexPosition;

let position = HexPosition::new(1, 0);
let pixel_coords = position.to_pixel_coordinates();
println!("Pixel coordinates: {:?}", pixel_coords);

let new_position: HexPosition<i32> = HexPosition::from_pixel_coordinates(pixel_coords);
println!("New position: {:?}", new_position);

assert!(position == new_position);

计算位置之间的距离

use hexing::HexPosition;

let pos1 = HexPosition::new(0, 0);
let pos2 = HexPosition::new(-2, -1);
let dist = pos1.distance(pos2);
println!("Distance: {:?}", dist);

遍历环和螺旋

use hexing::{HexPosition, HexRing, HexSpiral};

let center = HexPosition::new(0, 0);

// Ring of radius 1
let ring = center.ring(1);
for pos in ring {
    println!("Ring position: {:?}", pos);
}

// Spiral of radius 2
let spiral = center.spiral(2);
for pos in spiral {
    println!("Spiral position: {:?}", pos);
}

旋转六边形位置

use hexing::HexPosition;
let rotation = 120;
let pos = HexPosition::new(1, 2);
let rotated_pos = pos.rotation(rotation/60); // Rotates 120 degrees
println!("Rotated Position: {:?}", rotated_pos);

反射六边形位置

use hexing::HexPosition;

let pos = HexPosition::new(1, 2);
let reflected_pos = pos.reflect();
println!("Reflected Position: {:?}", reflected_pos);

线迭代器

use hexing::HexPosition;

let start = HexPosition::new(0, 0);
let end = HexPosition::new(3, -3);
for pos in start.line(end) {
    println!("Line Position: {:?}", pos);
}

使用 HexDirection

use hexing::HexDirection;

let direction = HexDirection::UpRight;
let vector = direction.to_vector();
println!("Vector for Right Direction: {:?}", vector);

let new_position = HexPosition::new(0, 0) + vector * 3;
println!("New Position after moving Right: {:?}", new_position);

完整文档

有关六边形网格的更多详细文档和解释,请参阅 Red Blob Games 六边形网格文档

安装

hexing 添加到您的 Cargo.toml

[dependencies]
hexing = "0.3.3"

依赖项

~0.8–1.3MB
~23K SLoC