mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Converts the landmap to use MultiPolygon instead of a collection of polygons, since Shapely has explicit support for this. Because we've done that, we can use a single projection from a line instead of brute forcing the extent of the front line. This makes turn processing ~66% faster (3 seconds to 1.8). There are probably other places this should be used.
37 lines
889 B
Python
37 lines
889 B
Python
from dataclasses import dataclass
|
|
import pickle
|
|
from typing import Optional, Tuple, Union
|
|
import logging
|
|
|
|
from shapely import geometry
|
|
from shapely.geometry import MultiPolygon, Polygon
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Landmap:
|
|
inclusion_zones: MultiPolygon
|
|
exclusion_zones: MultiPolygon
|
|
sea_zones: MultiPolygon
|
|
|
|
|
|
def load_landmap(filename: str) -> Optional[Landmap]:
|
|
try:
|
|
with open(filename, "rb") as f:
|
|
return pickle.load(f)
|
|
except:
|
|
logging.exception(f"Failed to load landmap {filename}")
|
|
return None
|
|
|
|
|
|
def poly_contains(x, y, poly: Union[MultiPolygon, Polygon]):
|
|
return poly.contains(geometry.Point(x, y))
|
|
|
|
|
|
def poly_centroid(poly) -> Tuple[float, float]:
|
|
x_list = [vertex[0] for vertex in poly]
|
|
y_list = [vertex[1] for vertex in poly]
|
|
x = sum(x_list) / len(poly)
|
|
y = sum(y_list) / len(poly)
|
|
return (x, y)
|
|
|