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!
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!
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));
}
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.
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.