首页 > 解决方案 > 圆角矩形坐标

问题描述

我正在绘制一个半径很大的圆角矩形(在 kotlin 的画布上)。为此,我定义了绘制矩形的坐标,并为角提供了xy半径。

现在我想在圆角矩形周围绘制其他东西。

给定这个圆角矩形的角度,找到我的(x,y)点坐标的方程是什么?

非常感谢!

标签: kotlincoordinatesrectanglesellipse

解决方案


我终于实现了自己的算法:

fun roundedRectanglePerimeterPoints(positions: Int, rect: RectF, xRadius: Float, yRadius: Float): List<PointF> {

    val segments = listOf(
        Line(rect.centerX(), rect.bottom, rect.left + xRadius, rect.bottom),
        EllipseQuarter(rect.left + xRadius, rect.bottom - yRadius, xRadius, yRadius, EllipseQuarter.Direction.SOUTH_WEST),
        Line(rect.left, rect.bottom - yRadius, rect.left, rect.top + yRadius),
        EllipseQuarter(rect.left + xRadius, rect.top + yRadius, xRadius, yRadius, EllipseQuarter.Direction.NORTH_WEST),
        Line(rect.left + xRadius, rect.top, rect.right - xRadius, rect.top),
        EllipseQuarter(rect.right - xRadius, rect.top + yRadius, xRadius, yRadius, EllipseQuarter.Direction.NORTH_EAST),
        Line(rect.right, rect.top + yRadius, rect.right, rect.bottom - yRadius),
        EllipseQuarter(rect.right - xRadius, rect.bottom - yRadius, xRadius, yRadius, EllipseQuarter.Direction.SOUTH_EAST),
        Line(rect.right - xRadius, rect.bottom, rect.centerX(), rect.bottom)
    )

    val perimeter = segments.sumByDouble { it.length.toDouble() }
    val distancePerPlayer = perimeter / positions

    val playerPoints = mutableListOf<PointF>()
    for (i in 0 until positions) {
        var distanceFromOrigin = i * distancePerPlayer.toFloat()
        var pathIndex = 0

        while (distanceFromOrigin > segments[pathIndex].length) {
            distanceFromOrigin -= segments[pathIndex].length
            pathIndex++
        }

        val p = segments[pathIndex].pointForDistance(distanceFromOrigin)
        playerPoints.add(p)
    }

    return playerPoints
}

推荐阅读