Fix view rectangle computation
This commit is contained in:
parent
d34c5099f6
commit
7643968d39
@ -5,7 +5,6 @@ import androidx.compose.material.icons.filled.Home
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.rememberCoroutineScope
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.ui.geometry.Offset
|
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.graphics.PointMode
|
import androidx.compose.ui.graphics.PointMode
|
||||||
import androidx.compose.ui.unit.DpSize
|
import androidx.compose.ui.unit.DpSize
|
||||||
@ -65,9 +64,9 @@ fun App() {
|
|||||||
|
|
||||||
image(pointOne, Icons.Filled.Home)
|
image(pointOne, Icons.Filled.Home)
|
||||||
|
|
||||||
val marker1 = rectangle(55.744 to 37.614, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
val marker1 = rectangle(55.744 to 38.614, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
||||||
val marker2 = rectangle(55.8 to 37.5, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
val marker2 = rectangle(55.8 to 38.5, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
||||||
val marker3 = rectangle(56.0 to 37.5, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
val marker3 = rectangle(56.0 to 38.5, size = DpSize(10.dp, 10.dp), color = Color.Magenta)
|
||||||
|
|
||||||
draggableLine(marker1, marker2, color = Color.Blue)
|
draggableLine(marker1, marker2, color = Color.Blue)
|
||||||
draggableLine(marker2, marker3, color = Color.Blue)
|
draggableLine(marker2, marker3, color = Color.Blue)
|
||||||
@ -94,10 +93,10 @@ fun App() {
|
|||||||
it.copy(color = Color(Random.nextFloat(), Random.nextFloat(), Random.nextFloat()))
|
it.copy(color = Color(Random.nextFloat(), Random.nextFloat(), Random.nextFloat()))
|
||||||
}
|
}
|
||||||
|
|
||||||
draw(position = pointThree) {
|
// draw(position = pointThree) {
|
||||||
drawLine(start = Offset(-10f, -10f), end = Offset(10f, 10f), color = Color.Red)
|
// drawLine(start = Offset(-10f, -10f), end = Offset(10f, 10f), color = Color.Red)
|
||||||
drawLine(start = Offset(-10f, 10f), end = Offset(10f, -10f), color = Color.Red)
|
// drawLine(start = Offset(-10f, 10f), end = Offset(10f, -10f), color = Color.Red)
|
||||||
}
|
// }
|
||||||
|
|
||||||
arc(pointOne, 10.0.kilometers, (PI / 4).radians, -Angle.pi / 2)
|
arc(pointOne, 10.0.kilometers, (PI / 4).radians, -Angle.pi / 2)
|
||||||
|
|
||||||
|
@ -86,7 +86,6 @@ fun App() {
|
|||||||
},
|
},
|
||||||
onViewChange = { viewPoint = this }
|
onViewChange = { viewPoint = this }
|
||||||
),
|
),
|
||||||
schemeFeaturesState.features.values,
|
|
||||||
initialViewPoint = initialViewPoint,
|
initialViewPoint = initialViewPoint,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ public fun MapView(
|
|||||||
mapTileProvider,
|
mapTileProvider,
|
||||||
config,
|
config,
|
||||||
initialViewPoint = initialViewPoint,
|
initialViewPoint = initialViewPoint,
|
||||||
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(WebMercatorSpace, 1f),
|
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(WebMercatorSpace, Float.MAX_VALUE),
|
||||||
)
|
)
|
||||||
|
|
||||||
MapView(mapState, featureState, modifier)
|
MapView(mapState, featureState, modifier)
|
||||||
@ -67,7 +67,7 @@ public fun MapView(
|
|||||||
mapTileProvider,
|
mapTileProvider,
|
||||||
config,
|
config,
|
||||||
initialViewPoint = initialViewPoint,
|
initialViewPoint = initialViewPoint,
|
||||||
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(WebMercatorSpace, 1f),
|
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(WebMercatorSpace, Float.MAX_VALUE),
|
||||||
)
|
)
|
||||||
|
|
||||||
MapView(mapState, featureState, modifier)
|
MapView(mapState, featureState, modifier)
|
||||||
|
@ -16,7 +16,7 @@ public class MapViewScope internal constructor(
|
|||||||
) : CoordinateViewScope<Gmc>(config) {
|
) : CoordinateViewScope<Gmc>(config) {
|
||||||
override val space: CoordinateSpace<Gmc> get() = WebMercatorSpace
|
override val space: CoordinateSpace<Gmc> get() = WebMercatorSpace
|
||||||
|
|
||||||
public val scaleFactor: Float
|
private val scaleFactor: Float
|
||||||
get() = WebMercatorProjection.scaleFactor(zoom)
|
get() = WebMercatorProjection.scaleFactor(zoom)
|
||||||
|
|
||||||
public val intZoom: Int get() = floor(zoom).toInt()
|
public val intZoom: Int get() = floor(zoom).toInt()
|
||||||
|
@ -6,10 +6,6 @@ import androidx.compose.runtime.mutableStateOf
|
|||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.geometry.Offset
|
import androidx.compose.ui.geometry.Offset
|
||||||
import androidx.compose.ui.unit.*
|
import androidx.compose.ui.unit.*
|
||||||
import kotlin.math.pow
|
|
||||||
import kotlin.math.sqrt
|
|
||||||
|
|
||||||
private fun distanceBetween(a: DpOffset, b: DpOffset): Dp = sqrt((b.x - a.x).value.pow(2) + (b.y - a.y).value.pow(2)).dp
|
|
||||||
|
|
||||||
public abstract class CoordinateViewScope<T : Any>(
|
public abstract class CoordinateViewScope<T : Any>(
|
||||||
public val config: ViewConfig<T>,
|
public val config: ViewConfig<T>,
|
||||||
@ -17,8 +13,8 @@ public abstract class CoordinateViewScope<T : Any>(
|
|||||||
|
|
||||||
public abstract val space: CoordinateSpace<T>
|
public abstract val space: CoordinateSpace<T>
|
||||||
|
|
||||||
protected var canvasSizeState: MutableState<DpSize?> = mutableStateOf(null)
|
private var canvasSizeState: MutableState<DpSize?> = mutableStateOf(null)
|
||||||
protected var viewPointState: MutableState<ViewPoint<T>?> = mutableStateOf(null)
|
private var viewPointState: MutableState<ViewPoint<T>?> = mutableStateOf(null)
|
||||||
|
|
||||||
public var canvasSize: DpSize
|
public var canvasSize: DpSize
|
||||||
get() = canvasSizeState.value ?: DpSize(512.dp, 512.dp)
|
get() = canvasSizeState.value ?: DpSize(512.dp, 512.dp)
|
||||||
|
@ -156,8 +156,8 @@ public class LineFeature<T : Any>(
|
|||||||
override fun getBoundingBox(zoom: Float): Rectangle<T> =
|
override fun getBoundingBox(zoom: Float): Rectangle<T> =
|
||||||
space.Rectangle(a, b)
|
space.Rectangle(a, b)
|
||||||
|
|
||||||
override fun contains(veiwPoint: ViewPoint<T>): Boolean = with(space) {
|
override fun contains(viewPoint: ViewPoint<T>): Boolean = with(space) {
|
||||||
veiwPoint.focus in space.Rectangle(a, b) && veiwPoint.focus.distanceToLine(a, b, veiwPoint.zoom).value < 5f
|
viewPoint.focus in space.Rectangle(a, b) && viewPoint.focus.distanceToLine(a, b, viewPoint.zoom).value < 5f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ public fun SchemeView(
|
|||||||
val state = rememberMapState(
|
val state = rememberMapState(
|
||||||
config,
|
config,
|
||||||
initialViewPoint = initialViewPoint,
|
initialViewPoint = initialViewPoint,
|
||||||
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(XYCoordinateSpace, 1f),
|
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(XYCoordinateSpace, Float.MAX_VALUE),
|
||||||
)
|
)
|
||||||
|
|
||||||
SchemeView(state, featureState, modifier)
|
SchemeView(state, featureState, modifier)
|
||||||
@ -121,87 +121,9 @@ public fun SchemeView(
|
|||||||
val mapState: XYViewScope = rememberMapState(
|
val mapState: XYViewScope = rememberMapState(
|
||||||
config,
|
config,
|
||||||
initialViewPoint = initialViewPoint,
|
initialViewPoint = initialViewPoint,
|
||||||
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(XYCoordinateSpace, 1f),
|
initialRectangle = initialRectangle ?: featureState.features.values.computeBoundingBox(XYCoordinateSpace, Float.MAX_VALUE),
|
||||||
)
|
)
|
||||||
|
|
||||||
SchemeView(mapState, featureState, modifier)
|
SchemeView(mapState, featureState, modifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
///**
|
|
||||||
// * A builder for a Scheme with static features.
|
|
||||||
// */
|
|
||||||
//@Composable
|
|
||||||
//public fun SchemeView(
|
|
||||||
// initialViewPoint: XYViewPoint? = null,
|
|
||||||
// initialRectangle: XYRectangle? = null,
|
|
||||||
// featureMap: Map<FeatureId<*>,>,
|
|
||||||
// config: SchemeViewConfig = SchemeViewConfig(),
|
|
||||||
// modifier: Modifier = Modifier.fillMaxSize(),
|
|
||||||
//) {
|
|
||||||
// val featuresState = key(featureMap) {
|
|
||||||
// SchemeFeaturesState.build {
|
|
||||||
// featureMap.forEach(::addFeature)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// val viewPointOverride: XYViewPoint = remember(initialViewPoint, initialRectangle) {
|
|
||||||
// initialViewPoint
|
|
||||||
// ?: initialRectangle?.computeViewPoint()
|
|
||||||
// ?: featureMap.values.computeBoundingBox(1f)?.computeViewPoint()
|
|
||||||
// ?: XYViewPoint(XY(0f, 0f))
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// SchemeView(viewPointOverride, featuresState, config, modifier)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * Draw a map using convenient parameters. If neither [initialViewPoint], noe [initialRectangle] is defined,
|
|
||||||
// * use map features to infer view region.
|
|
||||||
// * @param initialViewPoint The view point of the map using center and zoom. Is used if provided
|
|
||||||
// * @param initialRectangle The rectangle to be used for view point computation. Used if [initialViewPoint] is not defined.
|
|
||||||
// * @param buildFeatures - a builder for features
|
|
||||||
// */
|
|
||||||
//@Composable
|
|
||||||
//public fun SchemeView(
|
|
||||||
// initialViewPoint: XYViewPoint? = null,
|
|
||||||
// initialRectangle: Rectangle<XY>? = null,
|
|
||||||
// config: ViewConfig<XY> = ViewConfig(),
|
|
||||||
// modifier: Modifier = Modifier.fillMaxSize(),
|
|
||||||
// buildFeatures: FeaturesState<XY>.() -> Unit = {},
|
|
||||||
//) {
|
|
||||||
// val featureState = FeaturesState.remember(XYCoordinateSpace, buildFeatures)
|
|
||||||
//
|
|
||||||
// val features = featureState.features
|
|
||||||
//
|
|
||||||
// val viewPointOverride: XYViewPoint = remember(initialViewPoint, initialRectangle) {
|
|
||||||
// initialViewPoint
|
|
||||||
// ?: initialRectangle?.computeViewPoint()
|
|
||||||
// ?: features.values.computeBoundingBox(1f)?.computeViewPoint()
|
|
||||||
// ?: XYViewPoint(XY(0f, 0f))
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
//// val featureDrag = DragHandle.withPrimaryButton { _, start, end ->
|
|
||||||
//// val zoom = start.zoom
|
|
||||||
//// featureState.findAllWithAttribute(DraggableAttribute) { it }.forEach { id ->
|
|
||||||
//// val feature = features[id] as? DraggableMapFeature ?: return@forEach
|
|
||||||
//// val boundingBox = feature.getBoundingBox(zoom) ?: return@forEach
|
|
||||||
//// if (start.focus in boundingBox) {
|
|
||||||
//// featureState.addFeature(id, feature.withCoordinates(end.focus))
|
|
||||||
//// return@withPrimaryButton false
|
|
||||||
//// }
|
|
||||||
//// }
|
|
||||||
//// return@withPrimaryButton true
|
|
||||||
//// }
|
|
||||||
////
|
|
||||||
////
|
|
||||||
//// val newConfig = config.copy(
|
|
||||||
//// dragHandle = DragHandle.combine(featureDrag, config.dragHandle)
|
|
||||||
//// )
|
|
||||||
//
|
|
||||||
// SchemeView(
|
|
||||||
// initialViewPoint = viewPointOverride,
|
|
||||||
// featuresState = featureState,
|
|
||||||
// config = config,
|
|
||||||
// modifier = modifier,
|
|
||||||
// )
|
|
||||||
//}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user