【问题标题】:DisplayObject.rotation not matching trig functionsDisplayObject.rotation 与三角函数不匹配
【发布时间】:2025-12-27 02:40:07
【问题描述】:

我正在尝试为动画饼图添加标签,但在将旋转对象与三角定位对象对齐时遇到了很多麻烦。因此,例如,如果我有一个中间是角度 theta 并且在补间中旋转 n 度的饼图,然后我尝试使用如下代码定位标签:

label.x = center.x + Math.cos((theta + n)/180 * Math.PI) * radius;
label.y = center.y + Math.sin((theta + n)/180 * Math.PI) * radius;

标签通常不与饼图的中心对齐。由于我也在大量放大饼图,因此错误变得足够严重,以至于有时会导致标签完全错过饼图。该错误似乎相对不可预测,并且看起来很像舍入错误,但我没有看到任何明显的舍入(三角函数计算到十位左右的小数位,这在这里应该绰绰有余)。

如何让这些标签正确定位?

【问题讨论】:

  • 请注意:仅使用旋转移动标签也不能很好地工作,因为当我尝试编写算法以防止标签重叠时再次遇到问题。啊!
  • theta + n 是饼图围绕饼图中心的旋转?
  • theta 是饼图的中间部分。 (所以如果第一块代表 25%,它的 theta 将是 45 度,如果第二块代表 50%,它的 theta 将是 180 度。)然后整个饼图通过动画旋转 n 度。
  • rx = xcos@ - ysin@ ry = xsin@ + ycos@ 如果您从 (0,1) 旋转,则: rx = -sin@ ry = cos@ 所以然后代替 cos for x 和 sin 代表 y,你应该使用 -sin 代表 x 和 cos 代表 y。如果可行,我会将其发布为解决方案 LOL
  • 不幸的是,这不起作用。标签最终从它们应该去的地方旋转了大约 90 度。

标签: flash actionscript-3 animation


【解决方案1】:

rx = xcos@ + ysin@

ry = -xsin@ + ycos@

如果您从 (0,1) 旋转,则:

rx = sin@

ry = cos@

那么你应该用 sin 表示 x 和 cos 表示 y,而不是上面的 x 的 cos 和 y 的 sin。

label.x = center.x + Math.sin((theta + n) * Math.PI / 180) * radius;
label.y = center.y + Math.cos((theta + n) * Math.PI / 180) * radius;

【讨论】:

  • 所有关于“Math.PIE”的讨论都让我感到饥饿 :)
  • 据我所知,我的数学是正确的。至少,我使用了正确的三角函数。