计算触摸点的角度并在Android中旋转它

时间:2011-10-28 08:26:56

标签: android math geometry atan2

数学再一次打败了我。这是一项非常简单的任务,但我无法完成任务。

场景:我在SurfaceView上绘制圆形图像。用户触摸图像边框上的一个点并开始将其拖动到周围。我需要根据用户的移动旋转圆形图像。 我有两个重要的信息,图像中心X,Y坐标和触摸点坐标。

enter image description here

正如您在图像中看到的那样,用户触摸了一个点,根据我的绘制,触摸点角度应该在40左右。我无法正确计算它。

我尝试使用这个公式:

angle = Math.atan2(touchedY - centerY, touchedX - centerX) * 180 / Math.PI 

我无法理解我应该如何计算角度,因为它现在已经无法正常工作且值不好。例如,在图像的情况下,角度计算是-50。

感谢您的时间,很高兴收到任何信息。

LE:实际上我认为我犯了一个错误,如下所述。圈子应该是这样的:

enter image description here

6 个答案:

答案 0 :(得分:11)

让我们重新解决问题:你想找到两个向量之间的角度。第一个向量是从中心点向上延伸的向上向量( u ),第二个向量是从中心点到触摸点的向量( v

现在我们可以召回(或谷歌)那个

cos a = uv /(| u | * | v |)

其中 a 是向量与| u |之间的角度是矢量的长度。向上的 u 是(0,1),长度为1。

手动乘以向量会取消x-term并给我们这样的东西。

double tx = touch_x - center_x, ty = touch_y - center_y;
double t_length = Math.sqrt(tx*tx + ty*ty);
double a = Math.acos(ty / t_length);

注意如何通过从触摸点减去中心点来获得v向量。如果需要,请记得转换为学位。

答案 1 :(得分:5)

首先,旋转角度应由CenterX和CenterY的原点确定。 所以你的(touchY - centerY,touchX - centerX)应该是(centerY - touchY,centerX - 的touchX)。

正确答案可能是:

(int) (Math.toDegrees(Math.atan2(centerY - touchedY, centerX - touchedX)));

希望有所帮助

答案 2 :(得分:1)

角度需要3个点。你只有2(中心和触摸)。 选择固定的第3个点,例如图片中的第9个点,然后使用@ vidstige的答案找到你的等式。

答案 3 :(得分:1)

我尝试过很多事情来做这样的事情,然后来了:

它获取视图位置而不是屏幕的中心,但你可以添加它:

基于触控点旋转图像视图:

     iv = (ImageView) findViewById(R.id.soldier); // img view to rotate
     int touch_x = (int) event.getX(); // touch point x
     int touch_y = (int) event.getY(); // touch point y
     int[] location = new int[2];
     iv.getLocationInWindow(location);   // get img location on screen

       float angle = (float) Math.toDegrees(Math.atan2( touch_x - location[0],    touch_y -   location[1]));

        if(angle < 0){
            angle += 360;
        }


     iv.setRotation(-angle);

答案 4 :(得分:1)

private fun getAngle(touchX: Float, touchY: Float): Double {
    var angle: Double
    val x2 = touchX - centerX
    val y2 = touchY - centerY
    val d1 = Math.sqrt((centerY * centerY).toDouble())
    val d2 = Math.sqrt((x2 * x2 + y2 * y2).toDouble())
    if (touchX >= centerX) {
        angle = Math.toDegrees(Math.acos((-centerY * y2) / (d1 * d2)))
    } else
        angle = 360 - Math.toDegrees(Math.acos((-centerY * y2) / (d1 * d2)))
    return angle
}

其中touchX = event.getX和touchY = event.getY

答案 5 :(得分:0)

这个角度与度数中的两个点相交

angle = (Math.atan2(y2-y1,x2-x1) *180 / Math.PI)