Rotation eines punktes um den ursprung



  • Ich suche eine Formel, mit der ich für einen Punkt die Koordinaten so neu berechnen kann, als würde ich sie im Winkel alpha um den ursprung drehen.
    ich hab schon folgende Formel gefunden, aber die ist irgendwie fehlerhaft.
    Je größer der Winkel ist, desto verzerrter ist das ergebnis.
    x=xcos(α)ysin(α)x' = x\cdot cos(\alpha)-y\cdot sin(\alpha)
    y=ycos(α)+xsin(α)y' = y\cdot cos(\alpha)+x\cdot sin(\alpha)
    je größer der winkel wird, desto komischer wird das ergebnis
    hier ist ein kleines testprogramm, um zu verdeutlichen, wie das ergebnis aussieht.

    #include <iostream>
    #include <string>
    #include "GL/glfw.h"
    #include <cmath>
    
    using namespace std;
    
    void rotate_xy(double &x, double &y, double dir);
    
    int main(int argc, char** argv) {
        glfwInit();
        glfwOpenWindow(640,480,0,0,0,0,0,0,GLFW_WINDOW);
    
        gluOrtho2D(-320,320,-240,240);
        glViewport(0,0,640,480);
    
        //koordinaten vom bekannten Haus des Nikolaus
        double pos[][2] = {
            {-100,-100},
            { 100, 100},
            {-100, 100},
            {   0, 200},
            { 100, 100},
            { 100,-100},
            {-100, 100},
            {-100,-100},
            { 100,-100},
        };
    
        //zeichnet die koordinaten;
        glBegin(GL_LINE_STRIP);
            for (int i = 0; i < 9; i++)
                glVertex2dv(pos[i]);
        glEnd();
    
        //kleine rotationen funktionieren in etwa
        for (int i = 0; i < 9; i++) {
            rotate_xy(pos[i][0],pos[i][1],.1);
        }
    
        glColor3ub(0,255,0);
        glBegin(GL_LINE_STRIP);
            for (int i = 0; i < 9; i++)
                glVertex2dv(pos[i]);
        glEnd();
    
        //größere überhaupt nicht
        for (int i = 0; i < 9; i++) {
            rotate_xy(pos[i][0],pos[i][1],1.);
        }
    
        glColor3ub(255,0,0);
        glBegin(GL_LINE_STRIP);
            for (int i = 0; i < 9; i++)
                glVertex2dv(pos[i]);
        glEnd();
    
        bool running = true;
        while (running){
            glfwSwapBuffers();
            if (glfwGetKey(GLFW_KEY_ESC))//  || !);
                running = false;
            if (!glfwGetWindowParam(GLFW_OPENED))
                running = false;
        }
        glfwTerminate();
    }
    
    void rotate_xy(double &x, double &y, double dir){
        x = x*cos(dir)-y*sin(dir);
        y = y*cos(dir)+x*sin(dir);
    }
    

    linker braucht -lGLU -lGL -lglfw -lX11 unter Linux.

    oder ein screenshot, damit ihr euch die arbeit nicht machen müsst.

    hier click

    Edit:
    bitte kein Beitrag mit glRotate posten, ich hab meinen Grund, warum das hier im Mathe Forum drin ist.



  • Implementierungsfehler in rotate_xy. Du benutzt x in der zweiten Formel, obwohl du es in der Zuweisung davor gerade verändert hast, x stellt also jetzt x' dar.



  • oh danke, ich werds gleich neu ausprobieren

    edit:
    klappt 😃



  • ich glaube diesen fehler macht jeder beim ersten mal, der sollte nen eigenen namen bekommen *hehe* 🙂


Anmelden zum Antworten