提问人:Noki 提问时间:3/15/2023 最后编辑:Noki 更新时间:3/15/2023 访问量:162
在喷气背包组合中计算弧的正确旋转角度时遇到麻烦
Troubles calculating the correct rotation angle for an arc in jetpack compose
问:
当前状态
我目前正在玩一个应用程序,我在其中显示多个圆弧。
中心圆有 6 个圆弧
当您点击其中一个圆弧时,圆弧会旋转,使点击的圆弧位于底部(90 度),并且会出现带有多个圆弧的第二层圆弧。
单击弧线的第二层时,该层也会发生相同的旋转。此外,当一个弧线聚焦时(意味着 90 度在其边界内),它会缩放并且它的扫描角度与内圆的扫描角度相同。
由于聚焦的弧线变“宽”,所有其他弧线都变小:
聚焦前的弧宽:360/8 = 45
焦点弧宽 = 60
所有其他未聚焦的圆弧的宽度 = ~42.86
当焦点上至少有一个弧线时,很容易计算出如何旋转:
fullAngle = 360
rotation=current rotation offset if the layer already rotated
arc=arc which is tapped on
...
val currentMiddleAngle = getCenteredAngleOfCurrentItem(arc, rotation, fullAngle)
var angleToRotate = 0f;
if (isItemCenterInLeftTopAndBottomQuarter(currentMiddleAngle)) {
angleToRotate = currentMiddleAngle - 90f
} else if (isItemCenterInRightTopQuarter(currentMiddleAngle, fullAngle)) {
angleToRotate = fullAngle - currentMiddleAngle + 90
} else if (isItemInRightBottomQuarter(currentMiddleAngle)) {
angleToRotate = 90 - currentMiddleAngle
}
return angleToRotate
...
private fun getCenteredAngleOfCurrentItem(
arc: PieChartInput,
rotation: Float,
fullAngle: Float
): Float {
val middleOfItemAngel = arc.angleToDraw / 2
val currentMiddleAngle =
(arc.currentStartAngle + rotation + middleOfItemAngel).mod(fullAngle)
return currentMiddleAngle
}
如果已经有一个圆弧在焦点上,而其他圆弧较小,则上述代码工作正常。如果圆的右半部分有弧,则它顺时针旋转。在另一种情况下,它逆时针旋转。
问题
我的问题是,当第二层第一次膨胀时,没有选择弧线(这是有意的)。如果在其中一个弧上点击,则该弧应移动到 bottm 中心(90 度)
我尝试了不同的计算,但总是有一些差异,而且它没有正确旋转到中心
这就是我点击右侧所有弧线时的样子。我添加了一些数字以方便识别它们。
我不明白的是,当胶带弧远离 90 度时,为什么“偏移量”会变大。
当然,圆圈的左边也有类似的问题
我试图添加所选项目的宽度与未选择项目时的宽度之间的差值,但这仅对其中一个弧线有帮助。其他人仍然有错误的偏移量。
我知道必须有一个“简单”的公式来计算这一点。但经过几天的思考,我的大脑不会向我展示正确的解决方案。
更新当当前旋转方向为顺时针时,选定的圆弧顺时针“增长”。这意味着,如果弧线聚焦,起始角度不会改变,只有结束角度会改变。如果电流旋转逆时针方向,则电弧也会逆时针方向增长
答: 暂无答案
评论