feat: dual-station radar track plot (satlover/satmatch style)

- MutualPass now carries TrackSample (azimuth/elevation for both stations)
- New MutualRadarView: polar plot with elevation rings (30/60/90),
  cardinal spokes, solid A-track vs dashed B-track, AOS/LOS markers
- Shown in expanded mutual pass card and radar page mutual card
This commit is contained in:
atsunatsu committed 2026-08-03 00:21:20 +08:00
1 parent 4baf3821e5
commit bd42e643ea
6 files changed
+276 -4

No files matched your search

@@ -32,8 +32,10 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
@@ -72,6 +74,8 @@ import com.rtbishop.look4sat.core.presentation.getDefaultPass
import com.rtbishop.look4sat.core.presentation.isVerticalLayout
import com.rtbishop.look4sat.core.presentation.layoutPadding
import com.rtbishop.look4sat.feature.mutual.ElevationCurveChart
import com.rtbishop.look4sat.feature.mutual.MutualRadarView
import com.rtbishop.look4sat.feature.mutual.TrackSample
import kotlinx.coroutines.launch
private enum class RadarPage(val title: String) {
@@ -319,6 +323,22 @@ private fun RadarLabel(
private fun MutualElevationCard(mutualData: MutualPassData, modifier: Modifier = Modifier) {
ElevatedCard(modifier = modifier) {
Column(modifier = Modifier.fillMaxSize().padding(8.dp)) {
if (mutualData.trackSamples.isNotEmpty()) {
MutualRadarView(
trackSamples = mutualData.trackSamples.map {
TrackSample(
time = 0L,
azimuthA = it.azimuthA,
elevationA = it.elevationA,
azimuthB = it.azimuthB,
elevationB = it.elevationB
)
},
labelA = mutualData.labelA,
labelB = mutualData.labelB
)
Spacer(Modifier.height(4.dp))
}
if (mutualData.samples.isNotEmpty()) {
ElevationCurveChart(
samples = mutualData.samples,