kotlin - 圆角矩形坐标
问题描述
我正在绘制一个半径很大的圆角矩形(在 kotlin 的画布上)。为此,我定义了绘制矩形的坐标,并为角提供了x和y半径。
现在我想在圆角矩形周围绘制其他东西。
给定这个圆角矩形的角度,找到我的(x,y)点坐标的方程是什么?
非常感谢!
解决方案
我终于实现了自己的算法:
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
}
推荐阅读
- android - Android Groovy Gradle 重构代码以避免重复
- python - 是否可以使用 RANSAC(随机样本一致性算法)对两个参数数据进行线性回归相关分析?
- java - 如何在 jar 的构建过程中从 'src/main/java' 中排除类?
- css - Material ui 将元素置于移动设备、台式机、平板电脑的底部响应式
- r - 具有多个输入的 R Shiny ObserveEvent
- kubernetes - 查找以前 pod 的日志
- sql - PostgreSQL — 选择 column1 where MIN(column2)
- windows - 有没有办法识别 Telegram 在前台或后台运行的状态?
- bash - mysqldump - 将 greped STDERR 重定向到文件
- android - 如何以编程方式更改导航的根片段