Hier ist eine Möglichkeit, einen Punkt um einen beliebigen anderen Punkt in 2D zu drehen. Beachten Sie, dass dies in 3D als Drehung um die Z-Achse verwendet werden kann, wobei die Z-Koordinate eines Punktes als ingoriert gilt, da er sich nicht ändert. Die Drehung um die x-Achse und y-Achse in 3D kann ebenfalls einfach implementiert werden.
Der Code ist in JavaScript. Die kommentierten Zeilen am Anfang sind ein Testset für die Funktion. Sie dienen auch als ein Anwendungsbeispiel.
//A = new Array(0,0)
//S = new Array(-1,0)
//fi = 90
//alert("rotujBod: " + rotatePoint(A, S, fi))
function rotatePoint(A, S, fi) {
/** IN points A - rotated point, S - centre, fi - angle of rotation (rad)
* points in format [Ax, Ay, Az], angle fi (float)
* OUT point B
*/
r = Math.sqrt((A[0] - S[0])*(A[0] - S[0]) + (A[1] - S[1])*(A[1] - S[1]))
originOfRotation = new Array(S[0] + r, S[1])
if (A[1] < S[1]) {
A2 = new Array(A[0], -1*A[1])
originalAngle = -1*sizeOfAngle(originOfRotation, S, A2)
} else {
originalAngle = sizeOfAngle(originOfRotation, S, A)
}
x = S[0] + r*Math.cos(fi + originalAngle)
y = S[1] + r*Math.sin(fi + originalAngle)
B = new Array(x, y)
return(B)
}
function sizeOfAngle(A, S, B) {
ux = A[0] - S[0]
uy = A[1] - S[1]
vx = B[0] - S[0]
vy = B[1] - S[1]
if((Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)) == 0) {return 0}
return Math.acos((ux*vx + uy*vy)/(Math.sqrt(ux*ux + uy*uy)*Math.sqrt(vx*vx + vy*vy)))
}
Werfen Sie einen Blick auf diese .. es könnte helfen, Dinge zu klären: http://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions – Sednus