5 Stimmen

Winkel aus Matrix ermitteln

Ich kenne eine Matrix [x-Skala, y-Skala, x-Skala, y-Skala, trans x, trans y] und möchte den Winkel in Grad ermitteln.

Danke!

7voto

Behnam Mohammadi Punkte 5748

Sehr einfach

1: Matrix holen und in Variable speichern

matrix='matrix(0.8660254037844387, 0.49999999999999994, -0.49999999999999994, 0.8660254037844387, 0, 0)';

2: geteilter Wert

var values = matrix.split('(')[1],
    values = values.split(')')[0],
    values = values.split(',');

var sin = values[1]; // 0.5

3: Winkel berechnen

var angle = Math.round(Math.asin(sin) * (180/Math.PI));

Ergebnis:

function convertToAngle(matrix) {
     var values = matrix.split('(')[1],
        values = values.split(')')[0],
        values = values.split(',');

    var sin = values[1]; // 0.5

    return Math.round(Math.asin(sin) * (180/Math.PI));
}

4voto

Dancrumb Punkte 24965

Betrachten Sie die folgende Matrix

| x_sc  y_sk  0  |
| x_sk  y_sc  0  |
| x_tr  y_tr  1  |

mit sk die eine Schieflage anzeigen, sc Anzeige der Skala und tr mit Angabe der Übersetzung.

Dies stellt nur eine rein Rotation, wenn alle drei Kriterien erfüllt sind

y_sk == -x_sk
y_sc == x_sc
x_sc * y_sc - x_sk * y_sk == 1

In diesem Fall, wenn theta ist der Drehwinkel, dann

theta == arcos(x_sc)

Damit erhalten Sie die Antwort in Radiant (höchstwahrscheinlich), also müssen Sie in Grad umrechnen.

Angenommen, Sie haben ein Objekt namens M, das die Matrix darstellt, die Eigenschaften, die meinen obigen Definitionen entsprechen, könnten Sie tun:

function toPureRotation(var M) {
    if( (M.y_sk != (-1 * M.x_sk)) ||
        (M.y_sc != M.x_sc) ||
        ((M.x_sc * M.y_sc - M.x_sk * M.y_sk) != 1)
    ) {
        return Number.NaN;
    }
    else {
        return Math.acos(M.x_sc); // For radians
        return Math.acos(M.x_sc) * 180 / Math.PI; // For degrees
    }
}

EDITAR

Für eine reine Drehung, gefolgt (oder vorausgehend) von einer Skalierungstransformation, die das Seitenverhältnis beibehält:

| sc   0  0 |
|  0  sc  0 |
|  0   0  1 |

Dann können Sie die folgende Identität verwenden:

x_sc * y_sc - x_sk * y_sk == sc^2

Dies gibt uns

function toRotation(var M) {
    if( (M.y_sk != (-1 * M.x_sk)) ||
        (M.y_sc != M.x_sc)
      )
    ) {
        return Number.NaN;
    }
    else {
        var scale_factor = Math.sqrt((M.x_sc * M.y_sc - M.x_sk * M.y_sk));
        return Math.acos(M.x_sc/scale_factor); // For radians
        return Math.acos(M.x_sc/scale_factor) * 180 / Math.PI; // For degrees
    }
}

Wenn Sie Übersetzungen mit einbeziehen wollen, werden Sie in eine Welt des Schmerzes geraten.

2voto

Wilhelm Murdoch Punkte 1796

Ich werde das hier nur als Referenz für die Zukunft einfügen. Ich ging voran und erstellt eine schnelle jQuery-Methode, die versucht, den Winkel der Drehung eines bestimmten HTML-Elements zu berechnen. Hoffentlich wird dies jemandem die Mühe ersparen, die ich hatte.

https://gist.github.com/1492454

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X