围绕中心点旋转视图

Rotating a view around a center point

我遇到了一个我认为很简单的问题,但我却找不到答案。问题的前提很简单:我有一个以 vx、vy 为中心的视图(称之为点),我想围绕一个更大的圆 cx、cy 旋转。我研究过使用 sin、cos、radians、atan2,所有这些爵士乐,但由于某种原因,当我旋转视图时,它看起来好像在椭圆形而不是圆形中旋转。我无法理解这方面的数学知识。

我目前拥有的:

public void update(double matrixAngle) 
        double angleInDegs = Math.toDegrees(mAngle);
        double newAngle = (matrixAngle > 0) ? angleInDegs + matrixAngle : angleInDegs - matrixAngle;
        double angleInRads = Math.toRadians(newAngle);

        float dx = itemCircle.getCenterX() - getCenterX();
        float dy = itemCircle.getCenterY() - getCenterY();
        double radius = Math.sqrt(dx * dx + dy * dy);

        float x = (float) (getCenterX() + radius * Math.cos(angleInRads));
        float y = (float) (getCenterY() - radius * Math.sin(angleInRads));

        itemCircle.setCenterX(x);
        itemCircle.setCenterY(y);

澄清一下:

matrixAngle方法的参数是用于旋转整个视图的矩阵角度。它的范围是从0-180,然后是从-180到0,其中0是从圆的右边开始。

mAngle 是绘制视图的原始角度。范围从 0 到 360。

itemCircle 是表示视图边界的圆圈。它是一个圆圈(准确地说是一个扩展的 FloatingActionButton)。

getCenterX(), getCenterY() 是我要旋转的大圆的坐标。

非常感谢您的帮助。这个问题已经困扰我一天了。

您的对象正在以椭圆形移动,因为像素不是正方形。请注意,在 class DisplayMetrics 中,xdpiydpi 实际上有不同的值。您需要调整您的计算来解决这个问题。

知道了。参与更仔细地观察 cos、sin 角度以实现我想要的。工作代码:

public void update(double matrixAngle) {
        double angleInRads = Math.toRadians(matrixAngle);

        double cosAngle = Math.cos(angleInRads);
        double sinAngle = Math.sin(angleInRads);

        float dx = mItemCircle.getCenterX() - getCenterX();
        float dy = mItemCircle.getCenterY() - getCenterY();

        float rx = (float) (dx * cosAngle - dy * sinAngle);
        float ry = (float) (dx * sinAngle + dy * cosAngle);

        rx += getCenterX();
        ry += getCenterY();

        mItemCircle.setCenterX(rx);
        mItemCircle.setCenterY(ry);
}