From 004b498ee98fa9727b949a43cb433787ee1d96b8 Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Tue, 30 Sep 2025 14:15:09 +0300 Subject: [PATCH] distance to point measurer --- .../com/mirenkov/ktheightmap/MapCanvas.kt | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt b/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt index 1a3f31f..fd78007 100644 --- a/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt +++ b/app/src/main/java/com/mirenkov/ktheightmap/MapCanvas.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.ParagraphStyle import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -25,11 +26,27 @@ import androidx.compose.ui.text.drawText import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle +import kotlin.math.abs import kotlin.math.absoluteValue import kotlin.math.floor +import kotlin.math.max +import kotlin.math.min import kotlin.math.pow import kotlin.math.sqrt +fun distanceString(targetMeters: Int): AnnotatedString { + return buildAnnotatedString { + withStyle(ParagraphStyle(textAlign = TextAlign.Center)) { + withStyle(SpanStyle(color = Color.White)) { + val text = if (targetMeters >= 100000) + "${targetMeters / 1000}km" + else + "${targetMeters}m" + append(text) + } + } + } +} @OptIn(ExperimentalUnsignedTypes::class) @Composable fun MapCanvas( @@ -189,6 +206,7 @@ fun MapCanvas( } } } + // Placed point and line to center if (pointLat != 0F) { val pointOffsetX = SphereMercator.mercateLon(pointLon.toDouble(), level, -TILE_SIZE.toDouble()).toFloat() - offsetX @@ -203,6 +221,8 @@ fun MapCanvas( start = Offset(pointOffsetX, pointOffsetY), end = Offset(halvedX, halvedY) ) + + val startHeight = KhmParser.getHeight(pointLon, pointLat, ctx) if (pointOffsetX >= 0 && pointOffsetY >= 0 && pointOffsetX < size.width && pointOffsetY < size.height) drawText( @@ -241,6 +261,17 @@ fun MapCanvas( ) } } + val lineLength = sqrt((pointOffsetX - halvedX).pow(2) + (pointOffsetY - halvedY).pow(2)) + val lineMeters = (lineLength * SphereMercator.scaledMetersPerPixel(level + 1)).toInt() + drawText( + textMeasurer = textMeasurer, + text = distanceString(lineMeters), + size = Size(160F, 48F), + topLeft = Offset( + halvedX, + halvedY - 80F + ) + ) } // Cursor path @@ -316,17 +347,7 @@ fun MapCanvas( // Distance measurer text drawText( textMeasurer = textMeasurer, - text = buildAnnotatedString { - withStyle(ParagraphStyle(textAlign = TextAlign.Center)) { - withStyle(SpanStyle(color = Color.White)) { - val text = if (targetMeters >= 100000) - "${targetMeters / 1000}km" - else - "${targetMeters}m" - append(text) - } - } - }, + text = distanceString(targetMeters), topLeft = Offset(targetPixels.toFloat() * 2F, measurerHeight), size = Size(targetPixels.toFloat() * 2F, 48F) )