From ee9cdd647a38378732bbad749d22a78de6148173 Mon Sep 17 00:00:00 2001 From: Raffson Date: Sun, 25 Sep 2022 17:56:08 +0200 Subject: [PATCH] Improve check for 'valid white zones' Instead of comparing to some deduced radius in case of a quad-point trigger, use pydcs' Polygon.point_in_poly to determine if a position is located inside the zone. --- game/scenery_group.py | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/game/scenery_group.py b/game/scenery_group.py index f3427a70..8659f3ba 100644 --- a/game/scenery_group.py +++ b/game/scenery_group.py @@ -1,25 +1,21 @@ from __future__ import annotations -from typing import Iterable, List +from typing import Iterable, List, TYPE_CHECKING +from dcs.mapping import Polygon from dcs.triggers import TriggerZone, TriggerZoneCircular, TriggerZoneQuadPoint from game.theater.theatergroundobject import NAME_BY_CATEGORY +if TYPE_CHECKING: + from dcs.mapping import Point -def _deduce_radius_from_quad(tz: TriggerZoneQuadPoint) -> float: - pos = tz.position - radius = 0.0 - mids = [] - for i in range(len(tz.verticies)): - for j in range(i, len(tz.verticies)): - if i is j: - continue - mids.append(tz.verticies[i].midpoint(tz.verticies[j])) - for point in mids: - dist = pos.distance_to_point(point) - if dist > radius: - radius = dist - return radius + +def _point_in_zone(zone: TriggerZone, pos: Point) -> bool: + if isinstance(zone, TriggerZoneCircular): + return zone.position.distance_to_point(pos) < zone.radius + elif isinstance(zone, TriggerZoneQuadPoint): + return Polygon(pos._terrain, zone.verticies).point_in_poly(pos) + raise RuntimeError(f"Invalid trigger-zone: {zone.name}") class SceneryGroupError(RuntimeError): @@ -57,13 +53,6 @@ class SceneryGroup: # For each objective definition. for zone_def in zone_definitions: - if isinstance(zone_def, TriggerZoneCircular): - zone_def_radius = zone_def.radius - elif isinstance(zone_def, TriggerZoneQuadPoint): - zone_def_radius = _deduce_radius_from_quad(zone_def) - else: - raise RuntimeError(f"Invalid trigger-zone: {zone_def}") - print(zone_def_radius, zone_def.__dict__) zone_def_position = zone_def.position zone_def_name = zone_def.name @@ -78,7 +67,7 @@ class SceneryGroup: valid_white_zones = [] for zone in list(white_zones): - if zone.position.distance_to_point(zone_def_position) < zone_def_radius: + if _point_in_zone(zone_def, zone.position): valid_white_zones.append(zone) white_zones.remove(zone)