Rotation



  • Guten Abend ich habe ein Programm zu schreiben dessen Aufgabe es ist ein Dreieck, ein Kreis und ein Rechteck zu zeichnen und dieses um deren jeweiligen Schwerpunkt rotieren zu lassen. ich habe es so weit geschafft das jede Form gezeichnet wird und sie sich rotieren jedoch rotieren sie nicht um ihren eiligen Schwerpunkt sonder um den Mittelpunkt der Koordinaten und rotiert dabei.
    Hier sind einmal die einzelnen Datein bis auf die ui. Vl. könnte mir hier jemanden einen Tipp geben
    geofromen.cpp

    #include "geoformen.h"
    
    crechteck::crechteck(int w, int h) : cgeo()
    {
        this->breite = w;
        this->hoehe = h;
        this->verschieben_rechteck( 0,0 );
        this->farbe = Qt::blue;
    }
    
    void crechteck::verschieben_rechteck(int _x, int _y)
    {
        this->x += _x;
        this->y += _y;
    
        this->ecke_oben_links.setX( (breite/2)*(-1)  + this->x );
        this->ecke_oben_links.setY( (hoehe/2)        + this->y );
    
        this->ecke_oben_rechts.setX( (breite/2)      + this->x );
        this->ecke_oben_rechts.setY( (hoehe/2)       + this->y );
    
        this->ecke_unten_links.setX( (breite/2)*(-1)  + this->x );
        this->ecke_unten_links.setY( (hoehe/2)*(-1)   + this->y );
    
        this->ecke_unten_rechts.setX( (breite/2)      + this->x );
        this->ecke_unten_rechts.setY( (hoehe/2)*(-1)  + this->y );
    }
    
    void crechteck::drehen_rechteck(qreal grad)
    {
        QMatrix m;
    
        m.rotate( grad );
    
        ecke_oben_links = ecke_oben_links * m;
        ecke_oben_links = ecke_oben_rechts * m;
        ecke_oben_links = ecke_unten_links * m;
        ecke_oben_links = ecke_unten_rechts * m;
    }
    
    cdreieck::cdreieck(int _seitenlaenge)
    {
        this->seitenlaenge = _seitenlaenge;
        this->verschieben_dreieck(0,0);
    }
    
    void cdreieck::seitenlaenge_festlegen(int neue_seitenlaenge)
    {
        this->seitenlaenge = neue_seitenlaenge;
        this->verschieben_dreieck( 0,0 );
    }
    
    void cdreieck::verschieben_dreieck(int _x, int _y)
    {
        this->x += _x;
        this->y += _y;
    
        //     ecke1
        //      / \
        //     /   \
        //    / 0,0 \
        //   /_______\
        // ecke2    ecke3
    
        // ecke1
        //    |\
        // hy | \
        //    |__\
        //      ecke3
    
        int hy = sqrt( seitenlaenge*seitenlaenge + (seitenlaenge/2)*(seitenlaenge/2) );
    
        ecke_1.setX( this->x );
        ecke_1.setY( this->y + (hy/2) );
    
        ecke_2.setX( this->x - (hy/2) );
        ecke_2.setY( this->y - (hy/2) );
    
        ecke_3.setX( this->x + (hy/2) );
        ecke_3.setY( this->y - (hy/2) );
    }
    
    void cdreieck::drehen_dreieck(qreal grad)
    {
        QMatrix m;
    
        m.rotate( grad );
    
        ecke_1 = ecke_1 * m;
        ecke_2 = ecke_2 * m;
        ecke_3 = ecke_3 * m;
    }
    

    main.cpp

    #include <QtGui/QApplication>
    #include "mainwindow.h"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
    }

    mainwindows.cpp
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    mein_widget::mein_widget()
        : dreieck( 4 ), kreis( 3 ), rechteck( 4,2 )
    {
        this->rechteck_anzeigen = false;
        this->kreis_anzeigen = false;
        this->dreieck_anzeigen = false;
    
        this->kreis.farbe = Qt::green;
        this->rechteck.farbe = Qt::blue;
        this->dreieck.farbe = Qt::red;
    
        this->winkel = 0;
        this->zoom = 1.0;
    }
    
    void mein_widget::paintEvent(QPaintEvent *ev)
    {
        // groeße ändern
        this->setMinimumSize( 100* this->zoom,
                              100* this->zoom );
    
        // zeichnen
        QPainter p( this );
    
        // hintergrund
        p.setBrush( Qt::white );
        p.drawRect( 0,0,this->width(),this->height() );
    
        // rahmen
        p.setPen( Qt::black );
        p.drawLine( 0,0,this->width(),this->height() );
        p.drawLine( 0,this->height(),this->width(),0 );
    
        // formen
        int zoom_faktor = this->zoom * 50;
        p.rotate( winkel );
    
        if ( this->rechteck_anzeigen )
        {
            p.setBrush( this->rechteck.farbe );
    
           QPoint neu_ecke_oben_links( this->rechteck.ecke_oben_links.x()-zoom_faktor  +(this->width()/2),
                                        this->rechteck.ecke_oben_links.y()-zoom_faktor  +(this->height()/2) );
         //   QPoint neu_ecke_oben_rechts( this->rechteck.ecke_oben_rechts.x()+zoom_faktor +(this->width()/2),
        //                                 this->rechteck.ecke_oben_rechts.y()-zoom_faktor +(this->height()/2) );
        //   QPoint neu_ecke_unten_links( this->rechteck.ecke_unten_links.x()-zoom_faktor  +(this->width()/2),
        //                                this->rechteck.ecke_unten_links.y()+zoom_faktor  +(this->height()/2) );
           QPoint neu_ecke_unten_rechts( this->rechteck.ecke_unten_rechts.x()+zoom_faktor  +(this->width()/2),
                                          this->rechteck.ecke_unten_rechts.y()+zoom_faktor  +(this->height()/2) );
            p.drawRect( QRect( neu_ecke_oben_links, neu_ecke_unten_rechts) );
        }
    
        if ( this->kreis_anzeigen )
        {
            p.setBrush( this->kreis.farbe );
            p.drawEllipse( this->width()/2 - (this->kreis.radius*zoom_faktor)/2,
                           this->height()/2 - (this->kreis.radius*zoom_faktor)/2,
                           this->kreis.radius*zoom_faktor, this->kreis.radius*zoom_faktor );
        }
    
        if ( this->dreieck_anzeigen )
        {
            //     ecke1
            //      / \
            //     /   \
            //    / 0,0 \
            //   /_______\
            // ecke2    ecke3
    
            p.setBrush( this->dreieck.farbe );
    
            p.drawLine( this->dreieck.ecke_1.x()+(this->width()/2),
                        this->dreieck.ecke_1.y()-zoom_faktor+(this->height()/2),
                        this->dreieck.ecke_2.x()-zoom_faktor+(this->width()/2),
                        this->dreieck.ecke_2.y()+zoom_faktor+(this->height()/2) );
    
            p.drawLine( this->dreieck.ecke_1.x()+(this->width()/2),
                        this->dreieck.ecke_1.y()-zoom_faktor+(this->height()/2),
                        this->dreieck.ecke_3.x()+zoom_faktor+(this->width()/2),
                        this->dreieck.ecke_3.y()+zoom_faktor+(this->height()/2) );
    
            p.drawLine( this->dreieck.ecke_3.x()+zoom_faktor+(this->width()/2),
                        this->dreieck.ecke_3.y()+zoom_faktor+(this->height()/2),
                        this->dreieck.ecke_2.x()-zoom_faktor+(this->width()/2),
                        this->dreieck.ecke_2.y()+zoom_faktor+(this->height()/2) );
        }
    
        p.end();
        ev->accept();
    }
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        this->barbara = new mein_widget();
        this->ui->scrollArea->setWidget( this->barbara );
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_3_clicked()
    {
        // rechteck anzeigen
        this->barbara->rechteck_anzeigen = !this->barbara->rechteck_anzeigen;
    }
    
    void MainWindow::on_pushButton_2_clicked()
    {
        // kreis anzeigen
        this->barbara->kreis_anzeigen = !this->barbara->kreis_anzeigen;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        // dreieck anzeigen
        this->barbara->dreieck_anzeigen = !this->barbara->dreieck_anzeigen;
    }
    
    void MainWindow::on_pushButton_4_clicked()
    {
        // neu zeichnen
        this->barbara->update();
    }
    
    void MainWindow::on_doubleSpinBox_valueChanged(const QString &arg1)
    {
        this->barbara->zoom = this->ui->doubleSpinBox->value();
    }
    
    void MainWindow::on_spinBox_valueChanged(int arg1)
    {
        // alles drehen
    //    this->barbara->rechteck.drehen_rechteck( arg1 );
    //    this->barbara->dreieck.drehen_dreieck( arg1 );
     //   this->barbara->winkel = arg1;
        this->barbara->rechteck.drehen_rechteck(arg1);
    }
    

    Die Header datein sind:

    geoformen.h

    #ifndef GEOFORMEN_H
    #define GEOFORMEN_H
    
    #include <stdio.h>
    #include <iostream>
    #include <QObject>
    #include <QPoint>
    #include <QMatrix>
    #include <math.h>
    using namespace std;
    
    //crechteck rechteck;
    //ckreis kreis;
    //cdreieck dreieck;
    
    class cgeo
    {
    public:
        cgeo()
            : x( 0 ), y( 0 ), farbe( Qt::green ) {}
        int x;
        int y;
        Qt::GlobalColor farbe;
    
        int winkel;
    };
    
    class crechteck : public cgeo
    {
    public:
        crechteck( int w, int h );
    
        int breite;
        int hoehe;
    
        QPointF ecke_oben_links;
        QPointF ecke_oben_rechts;
        QPointF ecke_unten_links;
        QPointF ecke_unten_rechts;
    
        void verschieben_rechteck( int x, int y );
        void drehen_rechteck( qreal grad );
    };
    
    class ckreis : public cgeo
    {
    public:
        ckreis( int radiuz ) : radius(radiuz) {}
    
        int radius;
        void verschieben_kreis( int _x, int _y )
        {this->x = _x; this->y = _y;}
    };
    
    class cdreieck : public cgeo
    {
        // gleichseitiges dreieck
    public:
        cdreieck( int seitenlaenge );
    
        int seitenlaenge;
    
        QPointF ecke_1;
        QPointF ecke_2;
        QPointF ecke_3;
    
        void seitenlaenge_festlegen( int neue_seitenlaenge );
        void verschieben_dreieck( int _x, int _y );
        void drehen_dreieck( qreal grad );
    };
    
    #endif // GEOFORMEN_H
    

    mainwindows.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QPainter>
    #include <QPaintEvent>
    #include "geoformen.h"
    #include <QRect>
    
    namespace Ui {
        class MainWindow;
    }
    
    class mein_widget : public QWidget
    {
        Q_OBJECT
    public:
        mein_widget();
    
        crechteck rechteck;
        ckreis kreis;
        cdreieck dreieck;
    
        bool rechteck_anzeigen;
        bool kreis_anzeigen;
        bool dreieck_anzeigen;
    
        int winkel;
        double zoom;
    
    protected:
        void paintEvent(QPaintEvent *ev);
    };
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        mein_widget* barbara;
    
    private slots:
        void on_pushButton_3_clicked();
    
        void on_pushButton_2_clicked();
    
        void on_pushButton_clicked();
    
        void on_pushButton_4_clicked();
    
        void on_doubleSpinBox_valueChanged(const QString &arg1);
    
        void on_spinBox_valueChanged(int arg1);
    
    private:
        Ui::MainWindow *ui;
    };
    
    #endif // MAINWINDOW_H
    


  • die objekte um -schwerpunkt verschieben, rotieren, danach wieder zurückschieben.


Anmelden zum Antworten