annoyance

This commit is contained in:
Alexey 2025-11-07 17:29:18 +03:00
commit b807e46978
4 changed files with 36 additions and 19 deletions

View file

@ -2,11 +2,7 @@ package com.mirenkov.ktheightmap
class Config { class Config {
companion object { companion object {
private var INSTANCE: Config = Config() const val MAP_START_OFFSET_X = -646.65625F
fun getInstance(): Config { const val MAP_START_OFFSET_Y = -1157.2814F
synchronized(this) {
return INSTANCE
}
}
} }
} }

View file

@ -6,6 +6,7 @@ import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -17,6 +18,7 @@ import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.ParagraphStyle import androidx.compose.ui.text.ParagraphStyle
@ -27,9 +29,12 @@ import androidx.compose.ui.text.drawText
import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.withStyle import androidx.compose.ui.text.withStyle
import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_X
import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_Y
import com.mirenkov.ktheightmap.parser.KhmParser import com.mirenkov.ktheightmap.parser.KhmParser
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
import kotlin.math.floor import kotlin.math.floor
import kotlin.math.min
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.sqrt import kotlin.math.sqrt
@ -43,15 +48,20 @@ fun MapCanvas(
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val ctx = LocalContext.current val ctx = LocalContext.current
var offsetX by rememberSaveable { viewModel.mapOffsetX } var offsetX by remember { viewModel.mapOffsetX }
var offsetY by rememberSaveable { viewModel.mapOffsetY } var offsetY by remember { viewModel.mapOffsetY }
val scale by rememberSaveable { viewModel.scale } val scale by remember { viewModel.scale }
val textMeasurer = rememberTextMeasurer() val textMeasurer = rememberTextMeasurer()
val debug by rememberSaveable { viewModel.debug } val debug by remember { viewModel.debug }
var pointRequested by rememberSaveable { viewModel.pointRequested } var pointRequested by remember { viewModel.pointRequested }
var pointLat by rememberSaveable { viewModel.rememberedPointLat } var pointLat by remember { viewModel.rememberedPointLat }
var pointLon by rememberSaveable { viewModel.rememberedPointLon } var pointLon by remember { viewModel.rememberedPointLon }
var pointHeight by rememberSaveable { viewModel.rememberedPointHeight } var pointHeight by remember { viewModel.rememberedPointHeight }
var lastOrientation by rememberSaveable { viewModel.lastOrientation }
val orientationChanged = LocalConfiguration.current.orientation != lastOrientation
if (orientationChanged) {
lastOrientation = LocalConfiguration.current.orientation
}
Canvas( Canvas(
modifier = modifier.fillMaxSize() modifier = modifier.fillMaxSize()
.pointerInput(Unit) { .pointerInput(Unit) {
@ -61,9 +71,15 @@ fun MapCanvas(
} }
} }
) { ) {
if (viewModel.halvedOffsetX == null) { if (viewModel.halvedOffsetX == null || orientationChanged) {
viewModel.halvedOffsetX = size.width / 2 viewModel.halvedOffsetX = size.width / 2
viewModel.halvedOffsetY = size.height / 2 viewModel.halvedOffsetY = size.height / 2
if (orientationChanged) {
offsetX -= viewModel.halvedOffsetY!!
offsetX += viewModel.halvedOffsetX!!
offsetY -= viewModel.halvedOffsetX!!
offsetY += viewModel.halvedOffsetY!!
}
} }
val halvedX = viewModel.halvedOffsetX!! val halvedX = viewModel.halvedOffsetX!!
val halvedY = viewModel.halvedOffsetY!! val halvedY = viewModel.halvedOffsetY!!
@ -241,7 +257,7 @@ fun DrawScope.drawPointInfo(
val latDiff = lat - pointLat val latDiff = lat - pointLat
val lonDiff = lon - pointLon val lonDiff = lon - pointLon
val distance = sqrt((latDiff).pow(2) + (lonDiff).pow(2)) val distance = sqrt((latDiff).pow(2) + (lonDiff).pow(2))
val valuesCount = floor(distance / valueDistance).toInt() val valuesCount = min(floor(distance / valueDistance).toInt(),1000)
val array: Array<Pair<Float, Float>> = Array(valuesCount) { step -> val array: Array<Pair<Float, Float>> = Array(valuesCount) { step ->
val interCoef = 1F - step.toFloat() / valuesCount val interCoef = 1F - step.toFloat() / valuesCount
Pair(lon - lonDiff * interCoef, lat - latDiff * interCoef) Pair(lon - lonDiff * interCoef, lat - latDiff * interCoef)

View file

@ -11,7 +11,7 @@ class TileContainer(private val vm: TileViewModel, private val coroutineScope: C
private var endX = 0 private var endX = 0
private var endY = 0 private var endY = 0
private var level = 1 private var level = 2
fun getLevel(): Int = level fun getLevel(): Int = level

View file

@ -1,11 +1,14 @@
package com.mirenkov.ktheightmap package com.mirenkov.ktheightmap
import android.app.Application import android.app.Application
import android.content.res.Configuration
import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.TextFieldValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_X
import com.mirenkov.ktheightmap.Config.Companion.MAP_START_OFFSET_Y
class TileViewModel(application: Application): ViewModel() { class TileViewModel(application: Application): ViewModel() {
val repository: TileRepository val repository: TileRepository
@ -16,8 +19,8 @@ class TileViewModel(application: Application): ViewModel() {
var latitudeText = mutableStateOf(TextFieldValue("")) var latitudeText = mutableStateOf(TextFieldValue(""))
var longitudeText = mutableStateOf(TextFieldValue("")) var longitudeText = mutableStateOf(TextFieldValue(""))
val mapOffsetX = mutableFloatStateOf(-646.65625F) val mapOffsetX = mutableFloatStateOf(MAP_START_OFFSET_X)
val mapOffsetY = mutableFloatStateOf(-1157.2814F) val mapOffsetY = mutableFloatStateOf(MAP_START_OFFSET_Y)
val scale = mutableFloatStateOf(2F) val scale = mutableFloatStateOf(2F)
var maxLevel = mutableIntStateOf(2) var maxLevel = mutableIntStateOf(2)
@ -28,6 +31,8 @@ class TileViewModel(application: Application): ViewModel() {
var rememberedPointLat = mutableFloatStateOf(0F) var rememberedPointLat = mutableFloatStateOf(0F)
var rememberedPointHeight = mutableIntStateOf(0) var rememberedPointHeight = mutableIntStateOf(0)
var lastOrientation = mutableIntStateOf(Configuration.ORIENTATION_PORTRAIT)
init { init {
val tileDb = TileDB.getInstance(application) val tileDb = TileDB.getInstance(application)
val tileDao = tileDb.tileDao() val tileDao = tileDb.tileDao()