算法:笛卡尔平面坐标系上,若干连接点形成线,剔除距离小于阈值的点,Kotlin
Kotlin
const val THRESHOLD = 0.6f //距离小于这个点将被剔除。
data class Point(val x: Float, val y: Float)
fun removeNearbyPoint(points: List<Point>): List<Point> {
val result = mutableListOf<Point>()
var prevPoint: Point? = null
for (point in points) {
if (prevPoint == null || distance(prevPoint, point) > THRESHOLD) {
result.add(point)
prevPoint = point
}
}
return result
}
fun distance(p1: Point, p2: Point): Float {
val dx = p2.x - p1.x
val dy = p2.y - p1.y
return kotlin.math.sqrt(dx * dx + dy * dy)
}
fun main(args: Array<String>) {
val points = listOf(
Point(0.0f, 0.0f),
Point(0.1f, 0.1f),
Point(0.5f, 0.5f),
Point(0.6f, 0.6f),
Point(1.0f, 1.0f),
Point(1.4f, 1.4f),
Point(1.5f, 1.5f),
Point(2.0f, 2.0f),
Point(2.5f, 2.5f),
Point(3.0f, 3.0f),
Point(3.5f, 3.5f),
Point(4.0f, 4.0f)
)
val result = removeNearbyPoint(points)
println("原来的点 ${points.size} : $points")
println("处理的点 ${result.size} : $result")
}
原来的点 12 : [Point(x=0.0, y=0.0), Point(x=0.1, y=0.1), Point(x=0.5, y=0.5), Point(x=0.6, y=0.6), Point(x=1.0, y=1.0), Point(x=1.4, y=1.4), Point(x=1.5, y=1.5), Point(x=2.0, y=2.0), Point(x=2.5, y=2.5), Point(x=3.0, y=3.0), Point(x=3.5, y=3.5), Point(x=4.0, y=4.0)]
处理的点 9 : [Point(x=0.0, y=0.0), Point(x=0.5, y=0.5), Point(x=1.0, y=1.0), Point(x=1.5, y=1.5), Point(x=2.0, y=2.0), Point(x=2.5, y=2.5), Point(x=3.0, y=3.0), Point(x=3.5, y=3.5), Point(x=4.0, y=4.0)]