use rlwfc::{Cell, GridBuilder, GridError, GridSystem};
struct LinearGridBuilder {
length: usize,
}
impl LinearGridBuilder {
fn new(length: usize) -> Self {
Self { length }
}
}
impl GridBuilder for LinearGridBuilder {
fn build_grid_system(&mut self, grid: &mut GridSystem) -> Result<(), GridError> {
if self.length == 0 {
return Ok(());
}
let mut cells = Vec::with_capacity(self.length);
for i in 0..self.length {
let cell_id =
grid.add_cell_with_name(Cell::with_id(i as u32), format!("linear_cell_{}", i));
cells.push(cell_id);
}
for i in 0..self.length - 1 {
grid.create_edge(cells[i], Some(cells[i + 1]))?;
}
Ok(())
}
fn get_dimensions(&self) -> Vec<usize> {
vec![self.length]
}
fn get_grid_type_name(&self) -> &'static str {
"LinearGrid"
}
}
struct Orthogonal2DBuilder {
width: usize,
height: usize,
}
impl Orthogonal2DBuilder {
fn new(width: usize, height: usize) -> Self {
Self { width, height }
}
}
impl GridBuilder for Orthogonal2DBuilder {
fn build_grid_system(&mut self, grid: &mut GridSystem) -> Result<(), GridError> {
if self.width == 0 || self.height == 0 {
return Ok(());
}
let mut cells = vec![vec![]; self.height];
for y in 0..self.height {
cells[y] = Vec::with_capacity(self.width);
for x in 0..self.width {
let cell_id = grid.add_cell_with_name(
Cell::with_id((y * self.width + x) as u32),
format!("cell_{}_{}", x, y),
);
cells[y].push(cell_id);
}
}
for y in 0..self.height {
for x in 0..self.width {
let current = cells[y][x];
if x + 1 < self.width {
grid.create_edge(current, Some(cells[y][x + 1]))?;
}
if y + 1 < self.height {
grid.create_edge(current, Some(cells[y + 1][x]))?;
}
}
}
Ok(())
}
fn get_dimensions(&self) -> Vec<usize> {
vec![self.width, self.height]
}
fn get_grid_type_name(&self) -> &'static str {
"Orthogonal2D"
}
}
struct RingGridBuilder {
size: usize,
}
impl RingGridBuilder {
fn new(size: usize) -> Self {
Self { size }
}
}
impl GridBuilder for RingGridBuilder {
fn build_grid_system(&mut self, grid: &mut GridSystem) -> Result<(), GridError> {
if self.size < 3 {
return Err(GridError::InvalidDirection); }
let mut cells = Vec::with_capacity(self.size);
for i in 0..self.size {
let cell_id =
grid.add_cell_with_name(Cell::with_id(i as u32), format!("ring_cell_{}", i));
cells.push(cell_id);
}
for i in 0..self.size {
let next = (i + 1) % self.size;
grid.create_edge(cells[i], Some(cells[next]))?;
}
Ok(())
}
fn get_dimensions(&self) -> Vec<usize> {
vec![self.size] }
fn get_grid_type_name(&self) -> &'static str {
"RingGrid"
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== GridBuilder Trait 综合示例 ===\n");
println!("1. 线性网格构建器:");
demonstrate_linear_grid()?;
println!("\n2. 2D正交网格构建器:");
demonstrate_2d_grid()?;
println!("\n3. 环形网格构建器:");
demonstrate_ring_grid()?;
println!("\n4. 构建器对比:");
compare_grid_builders()?;
println!("\n=== 示例完成 ===");
Ok(())
}
fn demonstrate_linear_grid() -> Result<(), Box<dyn std::error::Error>> {
let linear_builder = LinearGridBuilder::new(5);
let linear_grid = GridSystem::from_builder(linear_builder)?;
println!(" 类型: LinearGrid");
println!(
" 单元格: {}, 边: {}",
linear_grid.get_cells_count(),
linear_grid.get_edges_count()
);
if let Some(first_cell) = linear_grid.get_cell_by_name("linear_cell_0") {
let neighbors = linear_grid.get_neighbors(first_cell);
println!(" 第一个单元格的邻居数: {}", neighbors.len());
}
validate_and_report(&linear_grid, "线性网格");
Ok(())
}
fn demonstrate_2d_grid() -> Result<(), Box<dyn std::error::Error>> {
let grid_builder = Orthogonal2DBuilder::new(3, 3);
let grid_2d = GridSystem::from_builder(grid_builder)?;
println!(" 类型: Orthogonal2D");
println!(
" 单元格: {}, 边: {}",
grid_2d.get_cells_count(),
grid_2d.get_edges_count()
);
if let Some(center_cell) = grid_2d.get_cell_by_name("cell_1_1") {
let neighbors = grid_2d.get_neighbors(center_cell);
println!(" 中心单元格的邻居数: {}", neighbors.len());
use rlwfc::{Direction4, DirectionTrait};
println!(" 方向查询:");
for direction in Direction4::all_directions() {
if let Some(neighbor) = grid_2d.get_neighbor_by_direction(center_cell, direction) {
println!(" {}: {:?}", direction.name(), neighbor);
} else {
println!(" {}: None", direction.name());
}
}
}
validate_and_report(&grid_2d, "2D网格");
Ok(())
}
fn demonstrate_ring_grid() -> Result<(), Box<dyn std::error::Error>> {
let ring_builder = RingGridBuilder::new(6);
let ring_grid = GridSystem::from_builder(ring_builder)?;
println!(" 类型: RingGrid");
println!(
" 单元格: {}, 边: {}",
ring_grid.get_cells_count(),
ring_grid.get_edges_count()
);
let mut all_have_one_neighbor = true;
for cell_id in ring_grid.get_all_cells() {
let neighbors = ring_grid.get_neighbors(cell_id);
if neighbors.len() != 1 {
all_have_one_neighbor = false;
break;
}
}
println!(" 所有节点都有1个邻居: {}", all_have_one_neighbor);
validate_and_report(&ring_grid, "环形网格");
Ok(())
}
fn compare_grid_builders() -> Result<(), Box<dyn std::error::Error>> {
println!(" | 类型 | 单元格 | 边数 | 验证结果 |");
println!(" |----------|--------|------|----------|");
{
let builder = LinearGridBuilder::new(5);
let grid = GridSystem::from_builder(builder)?;
let validation = if grid.validate_structure().is_ok() {
"✅"
} else {
"❌"
};
println!(
" | {:8} | {:6} | {:4} | {:8} |",
"线性(5)",
grid.get_cells_count(),
grid.get_edges_count(),
validation
);
}
{
let builder = Orthogonal2DBuilder::new(3, 3);
let grid = GridSystem::from_builder(builder)?;
let validation = if grid.validate_structure().is_ok() {
"✅"
} else {
"❌"
};
println!(
" | {:8} | {:6} | {:4} | {:8} |",
"2D(3x3)",
grid.get_cells_count(),
grid.get_edges_count(),
validation
);
}
{
let builder = RingGridBuilder::new(6);
let grid = GridSystem::from_builder(builder)?;
let validation = if grid.validate_structure().is_ok() {
"✅"
} else {
"❌"
};
println!(
" | {:8} | {:6} | {:4} | {:8} |",
"环形(6)",
grid.get_cells_count(),
grid.get_edges_count(),
validation
);
}
Ok(())
}
fn validate_and_report(grid: &GridSystem, grid_type: &str) {
match grid.validate_structure() {
Ok(()) => println!(" ✅ {}结构验证通过", grid_type),
Err(e) => println!(" ❌ {}结构验证失败: {:?}", grid_type, e),
}
}