2012-10-17 4 views
7

Ich versuche, benutzerdefinierte Komponenten in Android mit Surfaceview und Leinwandzeichnung zu erstellen. Die Komponenten sind durch Berührung verstellbar und drehbar. Sie können eine Bildansicht erstellen, deren obere, rechte, untere und linke Ränder skalierbar sind, indem Sie die gewünschte Kante berühren und ziehen. Ich benutze RectF, um die Grenzen der Komponente zu behalten, für die Rotation verwende ich canvas.rotate(angle, bounds.centerX(),bounds.centerY()) Methode. Das Problem besteht darin, dass beim Verändern der Oberkante die Let-, Right- und Bottom-Kanten fixiert sein sollten und ich es nicht beheben kann, wenn der Drehwinkel nicht 0 Grad ist. Ich brauche eine mathematische Lösung, um die X, Y-Koordinaten eines gedrehten Rechtecks ​​in Bezug auf die Grenzen des tatsächlichen Rechtecks ​​herauszufinden.Rectangle Koordinaten in Bezug auf den Rotationswinkel

Ich kann es mit Hilfe einiger Bilder erklären. Die folgende Abbildung zeigt zwei Rechtecke, deren Grenzen ebenfalls bekannt sind und in entsprechenden Farben angezeigt werden. Betrachten Sie das Green Rect als Anfangsbegrenzung der Komponenten, d. gedreht um -45 Grad, Zentrum ist (10,10). würde nun wieder das Größe Oberkante des Rechtecks ​​und angezeigt in nächster Abbildung 2.

Figure 1

Aus der Figur 2 ist ersichtlich, daß die Y-Position der gedrehten bis 4 aus 6 reduziert wird Rechteck wird auch in rosa Farbe angezeigt. Denken Sie daran, ich Ändern der Größe mache, während die Komponente bei Drehwinkel -45 Grad ist, so beim Ziehen Oberkante Rechtecks ​​links, rechts und unten Positionen nicht geändert werden soll. So die Abbildung 2 Pink Rechteck sollte links, rechts und unten Koordinaten gleiche wie Abbildung 1 der grünen Rechteck. Vergleich der erhaltenen und erwarteten Rechteck ist in Abbildung 3

gezeigt

Figure 2

In 3 ist die gelbe Farbe Rechteck ist die erwartete/Erforderlich löschte. Die erhaltene Rechteck rosae Farbe nach oben verschoben wird, im Vergleich zu dem grünen Rechteck gedreht und variiert abhängig von dem Drehwinkel.

  • Ich habe Drehwinkel = -45 Grad
  • Bounds von Actual (nicht re-sized) Rechteck.
  • Grenzen des tatsächlichen (nicht redimensionierten) Rechtecks ​​bei Rotation = -45 Grad.
  • Grenzen von Re-sized-Rechteck.
  • Bounds von Re-sized Rechteck bei Rotation = -45 Grad.

Wie berechne ich die Bounds/Mitte des gelben Rechtecks. Damit ich die Größenanpassung meiner Komponenten korrekt umsetzen kann? Lassen Sie mich wissen, gibt es irgendeine Mathematik, die angewendet werden kann?

Die erforderlichen Punkte/Koordinaten als rote Farbe Kreise in Abbildung 3.

Figure 3

+0

Gerade drehen Punkte am Ende, Grundformeln sind: x_ = x * cos (Winkel) - y * sin (Winkel); y_ = y * sin (Winkel) + y * cos (Winkel); http://en.wikipedia.org/wiki/Rotation_(mathematik) – user1410657

Antwort

0

Alle Farben 3 auf Ihre Figur beziehen sich in dieser Antwort markiert sind.

Wenn ich Ihre Frage richtig verstanden habe, wissen Sie, wie Sie alle Details über das rosa Rechteck sowie das grüne Rechteck berechnen können. Nehmen Sie einfach den Unterschied zwischen einer Ecke des rosa Rechtecks ​​und der entsprechenden Ecke des grünen Rechtecks. Addiert man diese Differenz (einen zweielementigen Vektor, d. H. x und y Differenz getrennt) in die Mitte des rosafarbenen Rechtecks, erhält man die gewünschte Mitte des gelben Dreiecks.

Wenn Sie auch die Abmessungen des pinkfarbenen Rechtecks ​​berechnen müssen, können Sie dies im nicht gedrehten Koordinatensystem tun. Nehmen Sie Ihr grünes Rechteck zusammen mit den Koordinaten des Punktes, auf den Sie das Rechteck ausdehnen möchten, und drehen Sie es um + 45 ° zurück. Dann können Sie die Höhe des Rechtecks ​​auf den gewünschten Wert erweitern, wodurch Ihnen das blaue Rechteck und damit das rosa Rechteck zur Verfügung steht.

1

Der Schlüssel ist: "Ich kann es nicht reparieren, wenn der Drehwinkel nicht 0 Grad ist."

Nehmen wir an, Ihr Rechteck ist um 10 Grad gedreht.

1) dreht sich die Maus auf dem Bildschirm, um -10 Grad

2) drehen sich die Mitte des Rechtecks ​​um -10 Grad

... nun um einiges Punktkoordinate das Problem auf eine reduzierte Rechteck, das bei 0 Grad ist. Das Rechteck bewegte sich, ja, die Maus bewegte sich, aber sie sind relativ zueinander, wie sie sein sollten.

3) Jetzt die Rechteckbearbeitung durchführen. Die Mitte des Rechtecks ​​verschiebt sich.

4) Drehen Sie das neue Rechteck Mitte um 10 Grad

Auf diese Weise muss man darüber nicht denken, und Sie arbeiten immer in ungedrehten Koordinaten.

Punkt bei [x, y] durch Winkel gedreht a wird bei [x*cos(a) - y*sin(a), x*sin(a) + y*cos(a)]