Korrespondierendes gedrehtes Objekt zu numerischen Werten

8

Ich habe ein Kombinationsschloss, das sich in einem 360-Grad-Kreis dreht.

Das Zahlenschloss hat Zahlenwerte, diese sind rein grafisch.

Ich brauche eine Möglichkeit, die Drehung des Bildes auf die 0-99-Werte in der Grafik zu übertragen.

In dieser ersten Grafik sollte der Wert in der Lage sein, mir "0"

zu sagen

Ссылка

In dieser Grafik sollte der Wert, nachdem der Benutzer das Bild gedreht hat, "72"

sagen können

Ссылка

Hier ist der Code:

%Vor%

Ich denke, ich muss einige Informationen aus der Matrix in einen 0-99-Wert übersetzen.

    
CQM 12.07.2012, 19:33
quelle

4 Antworten

8

Sie sollten Ihren Code vollständig reorganisieren. Die wiederholte Multiplikation neuer Rotationen in eine Matrix ist eine numerisch instabile Berechnung. Schließlich wird die Bitmap verzerrt. Der Versuch, den Rotationswinkel aus der Matrix zu erhalten, ist zu komplex und unnötig.

Bitte beachten Sie, dass dies ist ein nützlicher vorheriger Artikel zum Zeichnen von Bitmaps mit Drehung um einen ausgewählten Punkt.

Behalten Sie einfach eine einzige double dialAngle = 0 , die der aktuelle Drehwinkel des Zifferblattes ist.

Sie tun viel zu viel Arbeit, um den Winkel von der Berührungsstelle abzurufen. Lassen Sie (x0,y0) den Ort sein, an dem die Berührung beginnt. Zu dieser Zeit,

%Vor%

Dies ist der Startwinkel. Wenn die Berührung auf (x,y) reduziert wird, verwenden Sie diese Koordinate, um das Zifferblatt in Bezug auf die anfängliche Berührung anzupassen. Aktualisieren Sie dann die Matrix und zeichnen Sie neu:

%Vor%

Hinweis Math.atan2(y, x) macht alles, was Sie tun, mit Quadranten und Bogen.

Um das "Häkchen" des aktuellen Winkels zu erhalten, benötigen Sie 2 Radianten, um 100 zu entsprechen, also ist es sehr einfach:

%Vor%

Um den tatsächlich nächsten Tick als Integer zu finden, runden Sie den Bruch und den Mod um 100. Beachten Sie, dass Sie die Matrix ignorieren können!

%Vor%

Dies wird immer funktionieren, weil dialAngle in [0..2pi] steht. Der Mod wird benötigt, um einen gerundeten Wert von 100 zurück auf 0 zu setzen.

    
Gene 20.07.2012, 04:02
quelle
5

Um besser zu verstehen, was die Matrix tut, ist es hilfreich, 2D-Grafik-Transformationsmatrizen zu verstehen: Ссылка . Wenn Sie nur rotieren (nicht etwa transformieren oder skalieren), ist es relativ einfach, die Rotation zu extrahieren. Praktischerweise können Sie jedoch den Rotationscode ändern und eine Statusvariable speichern

%Vor%

Behalten Sie eine Variable, um die Gesamtrotation in Grad zu speichern, die Sie in Ihrer Rotationsfunktion erhöhen. Jetzt wissen wir, dass 3,6 Grad eine Zecke ist. Einfache Mathematik ergibt

%Vor%

Die letzte Sache, nach der Sie suchen müssen: Wenn Sie eine Drehung von genau 360 Grad oder eine Tick-Nummer von 100 haben, müssen Sie sie als 0 behandeln (da es kein Häkchen gibt 100)

    
dmi_ 12.07.2012 19:52
quelle
4

Dies sollte eine einfache Multiplikation mit einem "Skalierungsfaktor" sein, der Ihren Gradwert (0-359) auf Ihre 0-99 Skala skaliert:

%Vor%

EDIT: Korrigieren der Funktion getAngle

Für getAngle können Sie stattdessen die Funktion atan2 verwenden, die kartesische Koordinaten in einen Winkel umwandelt.

Speichern Sie einfach die erste Touch-Koordinate bei der Berührung und bei der Bewegung können Sie die folgende Berechnung anwenden:

%Vor%

Die Radianten haben eine Reichweite von zwei Pi. die Modulo-Berechnungen drehen es also um einen Wert von 0 Punkten nach oben. Die Drehrichtung ist gegen den Uhrzeigersinn.

Sie müssten das also in Grad umwandeln und die Drehrichtung ändern, um den richtigen Winkel zu erhalten.

    
tiguchi 12.07.2012 19:43
quelle
2

Das Einstellrad sollte genau um 3,6 Grad gedreht werden, um von einer Markierung zur nächsten oder zur vorherigen zu gelangen. Jedes Mal, wenn sich die Berührung des Benutzers um 3,6 Grad dreht (um die Mitte), sollte das Einstellrad um eine Markierung (3,6 Grad) gedreht werden.

Codeausschnitt:

%Vor%
  • getTouchAngle() berechnet den Winkel des Berührungspunkts des Benutzers, um die Mitte mit atan2 zu wählen.
  • setDialMark dreht das Zifferblatt um die Anzahl der geänderten Marken.

.

%Vor%     
Ronnie 20.07.2012 11:26
quelle