forest_navigating_uav/worldgen/forest_worldgen/layouts/mixed_zones.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"""Generate a mixed-zones layout with per-zone distributions."""

from ..config import load_distribution
from ..patterns import PATTERN_SAMPLERS


def generate_mixed_zones(layout_config, world_config, project_root):
    """Generate zone-wise samples using each zone's configured distribution."""
    K = world_config["generation"]["area_size"]
    min_distance = world_config["generation"]["min_distance"]
    all_positions = []

    for zone in layout_config["layout"]["zones"]:
        region = zone["region"]
        count = zone["count"]
        dist_ref = zone["distribution_ref"]
        dist_config = load_distribution(dist_ref, project_root)
        dist_type = dist_config["distribution"]["type"]
        dist_params = dist_config["distribution"].get("params", {}) or {}

        sampler = PATTERN_SAMPLERS.get(dist_type)
        if sampler is None:
            raise ValueError(f"Unknown distribution type: {dist_type}")

        points = sampler(count, region, K, min_distance, all_positions, dist_params)
        all_positions.extend(points)
        print(f"  zone '{zone['name']}': placed {len(points)} objects ({dist_type})")

    return all_positions