在喷气背包组合中计算弧的正确旋转角度时遇到麻烦

Troubles calculating the correct rotation angle for an arc in jetpack compose

提问人:Noki 提问时间:3/15/2023 最后编辑:Noki 更新时间:3/15/2023 访问量:162

问:

当前状态

我目前正在玩一个应用程序,我在其中显示多个圆弧。
中心圆有 6 个圆弧

当您点击其中一个圆弧时,圆弧会旋转,使点击的圆弧位于底部(90 度),并且会出现带有多个圆弧的第二层圆弧。

第二层有 8 个圆弧

单击弧线的第二层时,该层也会发生相同的旋转。此外,当一个弧线聚焦时(意味着 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 度时,为什么“偏移量”会变大。

当然,圆圈的左边也有类似的问题

我试图添加所选项目的宽度与未选择项目时的宽度之间的差值,但这仅对其中一个弧线有帮助。其他人仍然有错误的偏移量。

我知道必须有一个“简单”的公式来计算这一点。但经过几天的思考,我的大脑不会向我展示正确的解决方案。

更新当当前旋转方向为顺时针时,选定的圆弧顺时针“增长”。这意味着,如果弧线聚焦,起始角度不会改变,只有结束角度会改变。如果电流旋转逆时针方向,则电弧也会逆时针方向增长

java 数学 android-jetpack-compose android-canvas

评论

0赞 Dawood ibn Kareem 3/15/2023
所有其他弧的宽度应为 (360 - 60) / 7 度,约为 42.86,而不是 50。
0赞 Noki 3/15/2023
@DawoodibnKareem你是对的,但对这个问题的估计是错误的。我会调整这个问题。谢谢

答: 暂无答案