围绕中心点旋转视图
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 中,xdpi
和 ydpi
实际上有不同的值。您需要调整您的计算来解决这个问题。
知道了。参与更仔细地观察 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);
}
我遇到了一个我认为很简单的问题,但我却找不到答案。问题的前提很简单:我有一个以 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 中,xdpi
和 ydpi
实际上有不同的值。您需要调整您的计算来解决这个问题。
知道了。参与更仔细地观察 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);
}