diff --git a/lib/dev_config.dart b/lib/dev_config.dart index 9bab540..44eed81 100644 --- a/lib/dev_config.dart +++ b/lib/dev_config.dart @@ -12,9 +12,11 @@ const int kPreviewTileY = 101300; const int kPreviewTileX = 41904; // Direction cone for map view -const double kDirectionConeHalfAngle = 30.0; // degrees -const double kDirectionConeBaseLength = 0.001; // multiplier -const Color kDirectionConeColor = Color(0xFF000000); // FOV cone color +const double kDirectionConeHalfAngle = 35.0; // degrees +const double kDirectionConeBaseLength = 5; // multiplier +const Color kDirectionConeColor = Color(0xD0767474); // FOV cone color +const double kDirectionConeOpacity = 0.6; // Fill opacity for FOV cones +const double kDirectionConeBorderWidth = 1.6; // Border stroke width for FOV cones // Bottom button bar positioning const double kBottomButtonBarOffset = 4.0; // Distance from screen bottom (above safe area) @@ -87,8 +89,8 @@ const int kAbsoluteMaxZoom = 23; // Node icon configuration const double kNodeIconDiameter = 18.0; -const double kNodeRingThickness = 3.0; -const double kNodeDotOpacity = 0.4; // Opacity for the grey dot interior +const double kNodeRingThickness = 2.5; +const double kNodeDotOpacity = 0.3; // Opacity for the grey dot interior const Color kNodeRingColorReal = Color(0xFF3036F0); // Real nodes from OSM - blue const Color kNodeRingColorMock = Color(0xD0FFFFFF); // Add node mock point - white const Color kNodeRingColorPending = Color(0xD09C27B0); // Submitted/pending nodes - purple diff --git a/lib/widgets/camera_icon.dart b/lib/widgets/camera_icon.dart index 61f4018..46e2578 100644 --- a/lib/widgets/camera_icon.dart +++ b/lib/widgets/camera_icon.dart @@ -40,7 +40,7 @@ class CameraIcon extends StatelessWidget { height: kNodeIconDiameter, decoration: BoxDecoration( shape: BoxShape.circle, - color: Colors.black.withOpacity(kNodeDotOpacity), + color: _ringColor.withOpacity(kNodeDotOpacity), border: Border.all( color: _ringColor, width: kNodeRingThickness, diff --git a/lib/widgets/map/direction_cones.dart b/lib/widgets/map/direction_cones.dart index f8393d9..c715847 100644 --- a/lib/widgets/map/direction_cones.dart +++ b/lib/widgets/map/direction_cones.dart @@ -73,36 +73,47 @@ class DirectionConesBuilder { bool isSession = false, }) { final halfAngle = kDirectionConeHalfAngle; - final length = kDirectionConeBaseLength * math.pow(2, 15 - zoom); - // Number of points to create the arc (more = smoother curve) + // Calculate pixel-based radii + final outerRadiusPx = kNodeIconDiameter + (kNodeIconDiameter * kDirectionConeBaseLength); + final innerRadiusPx = kNodeIconDiameter + (2 * kNodeRingThickness); + + // Convert pixels to coordinate distances with zoom scaling + final pixelToCoordinate = 0.00001 * math.pow(2, 15 - zoom); + final outerRadius = outerRadiusPx * pixelToCoordinate; + final innerRadius = innerRadiusPx * pixelToCoordinate; + + // Number of points for the outer arc (within our directional range) const int arcPoints = 12; - LatLng project(double deg) { + LatLng project(double deg, double distance) { final rad = deg * math.pi / 180; - final dLat = length * math.cos(rad); + final dLat = distance * math.cos(rad); final dLon = - length * math.sin(rad) / math.cos(origin.latitude * math.pi / 180); + distance * math.sin(rad) / math.cos(origin.latitude * math.pi / 180); return LatLng(origin.latitude + dLat, origin.longitude + dLon); } - // Build pizza slice with curved edge - final points = [origin]; + // Build outer arc points only within our directional sector + final points = []; - // Add arc points from left to right + // Add outer arc points from left to right (counterclockwise for proper polygon winding) for (int i = 0; i <= arcPoints; i++) { final angle = bearingDeg - halfAngle + (i * 2 * halfAngle / arcPoints); - points.add(project(angle)); + points.add(project(angle, outerRadius)); } - // Close the shape back to origin - points.add(origin); + // Add inner arc points from right to left (to close the donut shape) + for (int i = arcPoints; i >= 0; i--) { + final angle = bearingDeg - halfAngle + (i * 2 * halfAngle / arcPoints); + points.add(project(angle, innerRadius)); + } return Polygon( points: points, - color: kDirectionConeColor.withOpacity(0.25), + color: kDirectionConeColor.withOpacity(kDirectionConeOpacity), borderColor: kDirectionConeColor, - borderStrokeWidth: 1, + borderStrokeWidth: kDirectionConeBorderWidth, ); } } \ No newline at end of file