Pratham200Rajbhar
first commit
78013c4
Raw
History Blame Contribute Delete
1.29 kB
import math
from dataclasses import dataclass
EARTH_RADIUS_M = 6371000.0
@dataclass(frozen=True)
class GPSCoordinate:
latitude: float
longitude: float
def calculate_haversine_distance(coord_a: GPSCoordinate, coord_b: GPSCoordinate) -> float:
lat_rad_a = math.radians(coord_a.latitude)
lat_rad_b = math.radians(coord_b.latitude)
delta_lat = math.radians(coord_b.latitude - coord_a.latitude)
delta_lon = math.radians(coord_b.longitude - coord_a.longitude)
haversine_term = (
math.sin(delta_lat / 2.0) ** 2
+ math.cos(lat_rad_a) * math.cos(lat_rad_b) * (math.sin(delta_lon / 2.0) ** 2)
)
angular_distance = 2.0 * math.atan2(math.sqrt(haversine_term), math.sqrt(1.0 - haversine_term))
return EARTH_RADIUS_M * angular_distance
def is_within_geofence(
student_coord: GPSCoordinate,
classroom_coord: GPSCoordinate,
base_radius: float,
student_accuracy: float,
) -> bool:
"""Validates if student is within the classroom geofence, accounting for GPS drift.
The effective radius is the base classroom radius plus student accuracy.
"""
distance = calculate_haversine_distance(student_coord, classroom_coord)
effective_radius = base_radius + student_accuracy
return distance <= effective_radius