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.