我已经得到了我认为是一个简单的问题,但解决方案却让我望而却步。这个问题的前提很简单:我有一个视图(称之为点)与中心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()
是我想要旋转的更大圆圈的坐标。
我非常感谢这里的一些帮助。这个问题一直困扰着我一天。
答案 0 :(得分:0)
您的对象正在以椭圆形状移动,因为像素不是方形。请注意,在课程DisplayMetrics中,xdpi
和ydpi
实际上有不同的值。您需要调整计算以解决此问题。
答案 1 :(得分:0)
知道了。参与进一步密切关注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);
}