mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
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.
This commit is contained in:
parent
d14b964f1d
commit
ee9cdd647a
@ -1,25 +1,21 @@
|
|||||||
from __future__ import annotations
|
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 dcs.triggers import TriggerZone, TriggerZoneCircular, TriggerZoneQuadPoint
|
||||||
|
|
||||||
from game.theater.theatergroundobject import NAME_BY_CATEGORY
|
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
|
def _point_in_zone(zone: TriggerZone, pos: Point) -> bool:
|
||||||
radius = 0.0
|
if isinstance(zone, TriggerZoneCircular):
|
||||||
mids = []
|
return zone.position.distance_to_point(pos) < zone.radius
|
||||||
for i in range(len(tz.verticies)):
|
elif isinstance(zone, TriggerZoneQuadPoint):
|
||||||
for j in range(i, len(tz.verticies)):
|
return Polygon(pos._terrain, zone.verticies).point_in_poly(pos)
|
||||||
if i is j:
|
raise RuntimeError(f"Invalid trigger-zone: {zone.name}")
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
class SceneryGroupError(RuntimeError):
|
class SceneryGroupError(RuntimeError):
|
||||||
@ -57,13 +53,6 @@ class SceneryGroup:
|
|||||||
|
|
||||||
# For each objective definition.
|
# For each objective definition.
|
||||||
for zone_def in zone_definitions:
|
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_position = zone_def.position
|
||||||
zone_def_name = zone_def.name
|
zone_def_name = zone_def.name
|
||||||
|
|
||||||
@ -78,7 +67,7 @@ class SceneryGroup:
|
|||||||
valid_white_zones = []
|
valid_white_zones = []
|
||||||
|
|
||||||
for zone in list(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)
|
valid_white_zones.append(zone)
|
||||||
white_zones.remove(zone)
|
white_zones.remove(zone)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user