2016-08-21 4 views
-1

Da ich nicht die beste in Mathematik bin, würde ich gerne verstehen, wie ich eine Skala und Neigungswert aus gegebenen Variablen berechnen kann.Berechnen Sie Maßstab und Neigung aus der Ferne oder Punkte

  • Zoom: Ein Benutzer legt zwei Finger auf den Bildschirm und verschiebt sie zusammen/auseinander. Der Detektor meldet sowohl den anfänglichen als auch den aktuellen Abstand zwischen Fingern in Pixeln. Nützlich, um Kamera-Zoom zu implementieren.
  • Prise: Ähnlich wie bei Zoom. Der Detektor meldet die anfängliche und aktuelle Fingerposition anstelle der Entfernung. Nützlich für das Zoomen von Kameras und anspruchsvollere Gesten wie zum Beispiel Drehen.

Mein Ziel ist es auf einer Karte klemmen zu können und vergrößern/verkleinern zu/von der Mitte der Karte, aber als ich bin in die Mitte Zoomen, sollte die Kamera nach oben kippen und vice versa.

@Override 
public boolean zoom (float originalDistance, float currentDistance){ 

    return false; 
} 

@Override 
public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){ 

    return false; 
} 

der folgenden Methoden lassen Sie mich Maßstab und die Karte kippen:

public boolean scaleMap(float scale, float pivotX, float pivotY) {} 
public boolean setTilt(float tilt) {} 

Ich mag würde meine Karte entsprechend skalieren und zu aktualisieren, aber das scheint nicht zu funktionieren:

float yScale = (pointer2.y-initialPointer2.y)/pointer2.y; 
changed = mViewport.scaleMap(yScale, 0, 0); 
if (changed) { 
    mMap.updateMap(true); 
} 
return changed; 

EDIT: Beispiel Kippen während ein-:

enter image description hereenter image description here

Antwort

1

Um den Zoom zu finden, müssen Sie das Verhältnis der euklidischen Abstände zwischen den Fingern vor und nach dem Zoomen verwenden.

dy = initialpointer2.y - initialpointer1.y 
dx = initialpointer2.x - initialpointer1.x 
new_dy = pointer2.y - pointer1.y 
new_dx = pointer2.x - pointer1.x 

float Scale = Sqrt((new_dy * new_dy + new_dx * new_dx)/(dy * dy + dx * dx)) 

Wenn Sie Ihre mathematische Bibliothek Hypot Funktion enthält, verwenden Sie es

float Scale = Math.Hypot(new_dy, new_dx)/Math.Hypot(dy, dx) 

Drehung zu erhalten, berechnet Winkeldifferenz zwischen Finger-Finger-Richtungen vor und nach

Dir = Marh.atan2(dy, dx) 
New_Dir = Marh.atan2(new_dy, new_dx) 
RotAngleRadians = New_Dir - Dir 
+0

Das ist großartig und wirklich informativ! Haben Sie eine Idee, wie Sie basierend auf Ihrer Vergrößerung einen neigungsbasierten Wert berechnen können? Ich möchte, dass meine Kamera beim Zoomen leicht nach oben kippt, während ich einen Fokuspunkt behalte – Verhelst

+0

Ich weiß nicht, wie die Kamera nach oben kippen könnte, während der Mittelpunkt gleich bleibt – MBo

+0

Ich habe meine Frage falsch formuliert. Ich möchte meine Karte nach oben neigen, je mehr Sie hineinzoomen. Ich habe eine Funktion tiltMap (float move), die die Karte basierend auf einem bestimmten Wert neigt. Ich habe mich gefragt, wie ich diesen Wert basierend auf dem Zoomfaktor berechnen könnte. – Verhelst

Verwandte Themen