Hier sind drei Funktionen aus meinen Open Source-Bibliotheken. Die Funktionen sind vollständig in Java getestet, aber die Formeln können leicht in jede Sprache übersetzt werden.
Die Unterschriften sind:
public static float getAngleFromPoint (Endpunkt centerPoint, Endpunkt touchPoint)
public static float getTwoFingerDistance (float firstTouchX, float firstTouchY, float secondTouchX, float secondTouchY)
Punkt getPointFromAngle (endgültiger Doppelwinkel, endgültiger Doppelradius)
Diese Lösung setzt voraus, dass die Pixeldichte gleichmäßig verteilt ist. Gehen Sie vor dem Drehen des Objekts wie folgt vor:
Verwenden Sie getAngleFromPoint, um den Winkel von der Mitte zur oberen rechten Ecke zu berechnen (sagen wir, dies ergibt 20 Grad), was bedeutet, dass die obere linke Ecke -20 Grad oder 340 Grad beträgt.
Verwenden Sie getTwoFingerDistance, um den diagonalen Abstand zwischen dem Mittelpunkt und der oberen rechten Ecke zurückzugeben (dieser Abstand sollte offensichtlich für alle Ecken gleich sein. Dieser Abstand wird in der nächsten Berechnung verwendet).
Nehmen wir nun an, wir drehen das Objekt um 30 Grad im Uhrzeigersinn. Wir wissen jetzt, dass die obere rechte Ecke bei 50 Grad und die obere linke Ecke bei 10 Grad sein muss.
Sie sollten jetzt in der Lage sein, die Funktion getPointFromAngle in der oberen linken und oberen rechten Ecke zu verwenden. Verwenden Sie den aus Schritt 2 zurückgegebenen Radius. Die X-Position multipliziert mit 2 aus der oberen rechten Ecke sollte die neue Breite ergeben, und die Y-Position mal 2 aus der oberen linken Ecke sollte die neue Höhe ergeben.
Diese obigen 4 Schritte sollten in Bedingungen versetzt werden, die davon abhängen, wie weit Sie Ihr Objekt gedreht haben. Andernfalls können Sie die Höhe als Breite und die Breite als Höhe zurückgeben.
Beachten Sie jedoch, dass die Winkelfunktionen in Faktoren von 0-1 anstelle von 0-360 ausgedrückt werden (multiplizieren oder dividieren Sie sie gegebenenfalls durch 360):
// Ruft einen Winkel von zwei Punkten ab, ausgedrückt als Faktor 0 -1 (0 ist 0/360, 0,25 ist 90 Grad usw.)
public float getAngleFromPoint(final Point centerPoint, final Point touchPoint) {
float returnVal = 0;
if(touchPoint.x > centerPoint.x) {
returnVal = (float) (Math.atan2((touchPoint.x - centerPoint.x), (centerPoint.y - touchPoint.y)) * 0.5 / Math.PI);
}
else if(touchPoint.x < centerPoint.x) {
returnVal = (float) (1 - (Math.atan2((centerPoint.x - touchPoint.x), (centerPoint.y - touchPoint.y)) * 0.5 / Math.PI));
}
return returnVal;
}
// Misst den diagonalen Abstand zwischen zwei Punkten
public float getTwoFingerDistance(final float firstTouchX, final float firstTouchY, final float secondTouchX, final float secondTouchY) {
float pinchDistanceX = 0;
float pinchDistanceY = 0;
if(firstTouchX > secondTouchX) {
pinchDistanceX = Math.abs(secondTouchX - firstTouchX);
}
else if(firstTouchX < secondTouchX) {
pinchDistanceX = Math.abs(firstTouchX - secondTouchX);
}
if(firstTouchY > secondTouchY) {
pinchDistanceY = Math.abs(secondTouchY - firstTouchY);
}
else if(firstTouchY < secondTouchY) {
pinchDistanceY = Math.abs(firstTouchY - secondTouchY);
}
if(pinchDistanceX == 0 && pinchDistanceY == 0) {
return 0;
}
else {
pinchDistanceX = (pinchDistanceX * pinchDistanceX);
pinchDistanceY = (pinchDistanceY * pinchDistanceY);
return (float) Math.abs(Math.sqrt(pinchDistanceX + pinchDistanceY));
}
}
// XY-Koordinaten aus einem Winkel mit einem bestimmten Radius abrufen (Der Winkel wird in einem Faktor von 0-1 0 ausgedrückt, der 0/360 Grad und 0,75 ist, 270 usw.)
public Point getPointFromAngle(final double angle, final double radius) {
final Point coords = new Point();
coords.x = (int) (radius * Math.sin((angle) * 2 * Math.PI));
coords.y = (int) -(radius * Math.cos((angle) * 2 * Math.PI));
return coords;
}
Diese Codefragmente stammen aus meinen Open Source-Bibliotheken: https://bitbucket.org/warwick/hgdialrepo und https://bitbucket.org/warwick/hacergestov2 . Eine ist eine Gestenbibliothek für Android und die andere ist eine Wählsteuerung für Android. Es gibt auch eine OpenGLES 2.0-Implementierung der Wählsteuerung unter: https://bitbucket.org/warwick/hggldial