Verwenden Math.atan2 (dy, dx) den Winkel gegen den Uhrzeigersinn von der positiven Horizontalen des in Radianten Koordinate erhalten
double pressed = Math.atan2(dY, dX);
subtrahieren den Drehbetrag (gegen den Uhrzeigersinn Drehbetrag in Radiant) von diesem Winkel , den Winkel in das Koordinatensystem des Knopfs
pressed -= buttonRotation;
setzen oder wenn Sie in Graden Ihren Winkel haben, wandelt es
012.351 bis radians
pressed -= Math.toRadians(buttonRotation);
Sie können dann eine einfachere Richtung Nummer aus diesem Winkel
int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);
Dies gibt rechts 0 bis 1, links 2 und ab 3. Wir haben den Fall korrigieren müssen berechnen, wo der Winkel negativ ist, wie das Modulo-Ergebnis wird ebenfalls negativ sein.
if (dir < 0) {
dir += 4;
}
nun angenommen, dass diese Zahlen sind schlecht, und Sie wollen nicht, sie benutzen, können Sie auf das Ergebnis schalten nur, was Sie für jede Richtung wie zurückzukehren. Putting, dass alle zusammen:
/**
* @param dY
* The y difference between the touch position and the button
* @param dX
* The x difference between the touch position and the button
* @param buttonRotationDegrees
* The anticlockwise button rotation offset in degrees
* @return
* The direction number
* 1 = left, 2 = right, 3 = up, 4 = down, 0 = error
*/
public static int getAngle(int dY, int dX, double buttonRotationDegrees)
{
double pressed = Math.atan2(dY, dX);
pressed -= Math.toRadians(buttonRotationDegrees);
// right = 0, up = 1, left = 2, down = 3
int dir = (int)(Math.round(2.0d*pressed/Math.PI) % 4);
// Correct negative angles
if (dir < 0) {
dir += 4;
}
switch (dir) {
case 0:
return 2; // right
case 1:
return 3; // up
case 2:
return 1; // left;
case 3:
return 4; // down
}
return 0; // Something bad happened
}
Dank Matt, ich denke, das ist genau das, was ich brauche. Tolle Antwort! – MikeT