场景:我在SurfaceView上绘制圆形图像。用户触摸图像边框上的一个点并开始将其拖动到周围。我需要根据用户的移动旋转圆形图像。 我有两个重要的信息,图像中心X,Y坐标和触摸点坐标。
正如您在图像中看到的那样,用户触摸了一个点,根据我的绘制,触摸点角度应该在40左右。我无法正确计算它。
我尝试使用这个公式:
angle = Math.atan2(touchedY - centerY, touchedX - centerX) * 180 / Math.PI
我无法理解我应该如何计算角度,因为它现在已经无法正常工作且值不好。例如,在图像的情况下,角度计算是-50。
感谢您的时间,很高兴收到任何信息。
LE:实际上我认为我犯了一个错误,如下所述。圈子应该是这样的:
答案 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)