Skip to content

Commit 1ea8141

Browse files
committed
ui: apply logarithmic scaling to radar rings for consistency with blip positioning
1 parent 1f6c38c commit 1ea8141

1 file changed

Lines changed: 14 additions & 9 deletions

File tree

lib/src/features/location/presentation/radar_painter.dart

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ class RadarPainter extends CustomPainter {
2525
..strokeWidth = 1;
2626

2727
// Draw rings
28-
canvas.drawCircle(center, radius, ringPaint);
29-
canvas.drawCircle(center, radius * 0.75, ringPaint);
30-
canvas.drawCircle(center, radius * 0.5, ringPaint);
31-
canvas.drawCircle(center, radius * 0.25, ringPaint);
28+
final distances = [10.0, 20.0, 30.0, 40.0, 50.0];
29+
const double maxDist = 50.0;
30+
for (final d in distances) {
31+
final r = _getScaledRadius(d, maxDist, radius);
32+
canvas.drawCircle(center, r, ringPaint);
33+
}
3234

3335
// Draw Sweep
3436
final sweepPaint = Paint()
@@ -60,13 +62,9 @@ class RadarPainter extends CustomPainter {
6062
}
6163

6264
void _drawDeviceNode(Canvas canvas, Offset center, double maxRadius, RadarDevice device) {
63-
// Logarithmic scaling formula from thesis:
64-
// d_scaled = radius * log(1 + d * k) / log(1 + d_max * k)
65-
const double k = 0.5; // steepness coefficient
6665
const double maxDist = 50.0; // meters
67-
6866
final d = device.distance.clamp(0.0, maxDist);
69-
final scaledDistance = maxRadius * (log(1 + d * k) / log(1 + maxDist * k));
67+
final scaledDistance = _getScaledRadius(d, maxDist, maxRadius);
7068

7169
// Calculate bearing relative to user heading
7270
final double relativeBearing = (device.bearing - userHeading + 360) % 360;
@@ -111,6 +109,13 @@ class RadarPainter extends CustomPainter {
111109
);
112110
}
113111

112+
double _getScaledRadius(double distance, double maxDistance, double maxVisualRadius) {
113+
// Logarithmic scaling formula from thesis:
114+
// d_scaled = radius * log(1 + d * k) / log(1 + d_max * k)
115+
const double k = 0.5; // steepness coefficient
116+
return maxVisualRadius * (log(1 + distance * k) / log(1 + maxDistance * k));
117+
}
118+
114119
@override
115120
bool shouldRepaint(covariant RadarPainter oldDelegate) {
116121
return oldDelegate.sweepAngle != sweepAngle ||

0 commit comments

Comments
 (0)