we have fov cones

This commit is contained in:
stopflock
2025-07-18 23:12:54 -05:00
parent f06894062f
commit 95df976475
3 changed files with 33 additions and 8 deletions

View File

@@ -15,8 +15,20 @@ class OsmCameraNode {
tags.containsKey('direction') || tags.containsKey('camera:direction');
double? get directionDeg {
final val = tags['direction'] ?? tags['camera:direction'];
return double.tryParse(val ?? '');
final raw = tags['direction'] ?? tags['camera:direction'];
if (raw == null) return null;
// Keep digits, optional dot, optional leading sign.
final match = RegExp(r'[-+]?\d*\.?\d+').firstMatch(raw);
if (match == null) return null;
final numStr = match.group(0);
final val = double.tryParse(numStr ?? '');
if (val == null) return null;
// Normalize: wrap negative or >360 into 0359 range.
final normalized = ((val % 360) + 360) % 360;
return normalized;
}
}

View File

@@ -27,7 +27,6 @@ class _HomeScreenState extends State<HomeScreen> {
builder: (_) => const AddCameraSheet(),
);
// null == closed via system back (treat as cancel)
if (submitted == true) {
appState.commitSession();
if (mounted) {

View File

@@ -95,6 +95,19 @@ class _MapViewState extends State<MapView> {
Widget build(BuildContext context) {
final appState = context.watch<AppState>();
final session = appState.session;
// If we just entered addmode and no target yet, seed it with current map center.
if (session != null && session.target == null) {
try {
final center = _controller.camera.center;
WidgetsBinding.instance.addPostFrameCallback(
(_) => appState.updateSession(target: center),
);
} catch (_) {
// controller not ready yet; will update onPositionChanged soon
}
}
final zoom = _safeZoom();
final markers = <Marker>[
@@ -141,8 +154,7 @@ class _MapViewState extends State<MapView> {
),
children: [
TileLayer(
urlTemplate:
'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.flock_map_app',
),
PolygonLayer(polygons: overlays),
@@ -161,7 +173,7 @@ class _MapViewState extends State<MapView> {
Polygon _buildCone(LatLng origin, double bearingDeg, double zoom) {
const halfAngle = 15.0;
final length = 0.002 * math.pow(2, 15 - zoom);
final length = 0.002 * math.pow(2, 15 - zoom); // scale with zoom
LatLng _project(double deg) {
final rad = deg * math.pi / 180;
@@ -175,9 +187,11 @@ class _MapViewState extends State<MapView> {
final right = _project(bearingDeg + halfAngle);
return Polygon(
points: [origin, left, right],
points: [origin, left, right, origin],
isFilled: true,
color: Colors.redAccent.withOpacity(0.25),
borderStrokeWidth: 0,
borderColor: Colors.redAccent,
borderStrokeWidth: 1,
);
}
}