Hilfe bei Geometrischen Figuren!!!!



  • Hallo Leute! Ich hoffe jemand kann mir helfen!

    Ich habe folgendes vor... Ich habe in Qt ein Quadrat ein Dreieck und einen Kreis zeichnen lassen...

    jetzt will ich das ganze vom Mittelpunkt verschieben... ich kann es bereits verschieben nur nimmt Qt da die erste Koordinate der jeweiligen Figur...

    Als nächstes soll um den Mittelpunkt rotiert werden...

    Ich sitze schon tage und nächte daran und hab keinen blassen Schimmer...

    Bitte helft mir hier ein ausschnitt vom Code:

    #include "Square.h"
    
    Square::Square(int x0, int y0, int length0)
      :GeoForm(x0,y0),
      length(length0)
    {
    }
    
    void Square::Grow(int lengthgrowth)
    {
       length += lengthgrowth; // !!!!
    }
    
    void Square::Show(QPainter &p1)
    {
      p1.drawRect(x,y,length,length);
      cout << "Square: x=" << x << ", y=" << y << ", length=" <<  length << endl;
    }
    

    das ganze ist in Klassen programmiert... also eine Oberklasse "Geoform" und danach die unterklassen Square, Circle, Triangle:

    Hier ist dann der Ablauf was passiert:

    #include "geoformgui.h"
    #include "ui_geoformgui.h"
    #include "GeoForm.h"
    #include "Circle.h"
    #include "Square.h"
    #include "Triangle.h"
    #include <QPainter>
    
    GeoFormGUI::GeoFormGUI(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::GeoFormGUI)
    {
        ui->setupUi(this);
        c1 = new Circle(50,50,20);
        c2 = new Circle(135,50,20);
        s1 = new Square(50,50,-40);
        s2 = new Square(130,50,-40);
        d1 = new Triangle(50,50,-40);
        d2 = new Triangle(130,50,-40);
        d3 = new Triangle(50,50,40);
        draw = false;
        draw1= false;
        draw2= false;
        draw3= false;
        draw4= false;
        draw5= false;
        draw6= false;
    
    }
    
    GeoFormGUI::~GeoFormGUI()
    {
        delete ui;
    }
    
    void GeoFormGUI::paintEvent(QPaintEvent *)
    {
        if (draw)
        {
    
            QPainter p1(this);
            p1.setPen(Qt::blue);
            //p1.rotate(30);
            c1->Show(p1);
            //c2->Show(p1);
            //s1->Show(p1);
            //s2->Show(p1);
            //d1->Show(p1);
            //d2->Show(p1);
            //d3->Show(p1);
        }
        if (draw1)
        {
            QPainter p1(this);
            p1.setPen(Qt::red);
            //p1.rotate(30);
            c1->Show(p1);
            c2->Show(p1);
        }
        if (draw2)
        {
            QPainter p1(this);
            p1.setPen(Qt::blue);
            //p1.rotate(30);
            s1->Show(p1);
    
        }
        if (draw3)
        {
            QPainter p1(this);
            p1.setPen(Qt::red);
            //p1.rotate(30);
            s1->Show(p1);
            s2->Show(p1);
        }
        if (draw4)
        {
            QPainter p1(this);
            p1.setPen(Qt::blue);
            //p1.rotate(30);
            d1->Show(p1);
    
        }
        if (draw5)
        {
            QPainter p1(this);
            p1.setPen(Qt::red);
            //p1.rotate(30);
            d1->Show(p1);
            d2->Show(p1);
        }
        if (draw6)
        {
    
        }
    }
    void GeoFormGUI::on_one_circle_clicked()
    {
    
        //c1->Grow(5);
        //c2->Grow(-5);
        //s1->Grow(5);
        //s2->Grow(-5);
        //d1->Grow(5);d1->Move(20,0);
        //d2->Grow(5);d2->Move(30,0);
        //d3->Grow(5);d3->Move(25,0);
        //draw=true;
        draw= ! draw;
        draw1= false;
        draw2= false;
        draw3= false;
        draw4= false;
        draw5= false;
        repaint();
    }
    void GeoFormGUI::on_two_circle_clicked()
    {
    
        //c1->Grow(5);
        //c2->Grow(-5);
        //s1->Grow(5);
        //s2->Grow(-5);
        //d1->Grow(5);d1->Move(20,0);
        //d2->Grow(5);d2->Move(30,0);
        //d3->Grow(5);d3->Move(25,0);
        draw= false;
        draw1= ! draw1;
        draw2= false;
        draw3= false;
        draw4= false;
        draw5= false;
        repaint();
    }
    void GeoFormGUI::on_one_square_clicked()
    {
        delete ui;
        draw = false;
        draw1= false;
        draw2=!draw2;
        draw3= false;
        draw4= false;
        draw5= false;
        repaint();
    }
    void GeoFormGUI::on_two_sqare_clicked()
    {
        draw = false;
        draw1= false;
        draw2= false;
        draw3=!draw3;
        draw4= false;
        draw5= false;
        repaint();
    }
    void GeoFormGUI::on_one_triangle_clicked()
    {
        draw = false;
        draw1= false;
        draw2= false;
        draw3= false;
        draw5= false;
        draw4=!draw4;
        repaint();
    }
    void GeoFormGUI::on_two_triangle_clicked()
    {
        draw = false;
        draw1= false;
        draw2= false;
        draw3= false;
        draw4= false;
        draw5=!draw5;
        repaint();
    }
    void GeoFormGUI::on_move_up_clicked()
    {
        c1->Move(0,-5);
        c2->Move(0,-5);
        s1->Move(0,-5);
        s2->Move(0,-5);
        d1->Move(0,-5);
        d2->Move(0,-5);
        repaint();
    
    }
    void GeoFormGUI::on_move_down_clicked()
    {
        c1->Move(0,5);
        c2->Move(0,5);
        s1->Move(0,5);
        s2->Move(0,5);
        d1->Move(0,5);
        d2->Move(0,5);
        repaint();
    
    }
    void GeoFormGUI::on_move_left_clicked()
    {
        c1->Move(-5,0);
        c2->Move(-5,0);
        s1->Move(-5,0);
        s2->Move(-5,0);
        d1->Move(-5,0);
        d2->Move(-5,0);
        repaint();
    }
    void GeoFormGUI::on_move_right_clicked()
    {
        c1->Move(5,0);
        c2->Move(5,0);
        s1->Move(5,0);
        s2->Move(5,0);
        d1->Move(5,0);
        d2->Move(5,0);
        repaint();
    
    }
    

    Ich weiss nicht wie ich da rangehen soll!!!

    Danke!



  • Als erstes solltest du mal einen QVector (wenns sowas gibt) oder std::vector, std::list (je nach Anforderung) für deine Objekte hernehmen. So ist das grausam.
    Vor allem hast du ein schön großes Memoryleak, weil zu jedem new gehört ein delete. Mit einem vector würde man das verhindern.



  • Scorcher24 schrieb:

    Als erstes solltest du mal einen QVector (wenns sowas gibt) oder std::vector, std::list (je nach Anforderung) für deine Objekte hernehmen. So ist das grausam.
    Vor allem hast du ein schön großes Memoryleak, weil zu jedem new gehört ein delete. Mit einem vector würde man das verhindern.

    Man sieht eindeutig das ich Anfänger bin aber der Weg ist das Ziel und ich brauche echt hilfe weil mein Kopf schon raucht...Programmierer werd ich sicher kein guter.. 🙂



  • azureus schrieb:

    Scorcher24 schrieb:

    Als erstes solltest du mal einen QVector (wenns sowas gibt) oder std::vector, std::list (je nach Anforderung) für deine Objekte hernehmen. So ist das grausam.
    Vor allem hast du ein schön großes Memoryleak, weil zu jedem new gehört ein delete. Mit einem vector würde man das verhindern.

    Man sieht eindeutig das ich Anfänger bin aber der Weg ist das Ziel und ich brauche echt hilfe weil mein Kopf schon raucht...Programmierer werd ich sicher kein guter.. 🙂

    Dann fang doch mal mit einem Buch an. C++ ist keine Sprache wo man sich eben mal ne GUI zusammenklicken kann.



  • oder lass das selbermachen und nimm QGraphicsScene, QGraphicsView und QGraphicsViewItem's (da gibts schon 4 ecke usw. - mit allen Transformationsmöglichkeiten die du da reinbaust). Falls das ganze natürlich ne vorgegebene Aufgabe ist, schlag ich vor du suchst dir auf Wikipedia oder irgendwelchen Matheseiten raus, wie man Mittelpunkte deiner Objekte berechnet - dann lies gleich noch was noch ein bisschen was über Rotationen und Translationen und feddich. Achja und spendier doch mal deinem Basisobject ein Member bool visible plus getter und setter. Dann verschiebst du die Überprüfung ob du was zeichnen sollst in das draw() der abgeleiteten Objekte - das wäre logischer, konsistenter und schöner - deine Gui sagt dann nur noch show() und hide() auf dem Objekt.



  • padreigh schrieb:

    oder lass das selbermachen und nimm QGraphicsScene, QGraphicsView und QGraphicsViewItem's (da gibts schon 4 ecke usw. - mit allen Transformationsmöglichkeiten die du da reinbaust). Falls das ganze natürlich ne vorgegebene Aufgabe ist, schlag ich vor du suchst dir auf Wikipedia oder irgendwelchen Matheseiten raus, wie man Mittelpunkte deiner Objekte berechnet - dann lies gleich noch was noch ein bisschen was über Rotationen und Translationen und feddich. Achja und spendier doch mal deinem Basisobject ein Member bool visible plus getter und setter. Dann verschiebst du die Überprüfung ob du was zeichnen sollst in das draw() der abgeleiteten Objekte - das wäre logischer, konsistenter und schöner - deine Gui sagt dann nur noch show() und hide() auf dem Objekt.

    Danke für deine Hilfe...

    Ich werd mir mal die Transformationen anschauen....wie ich sie anwenden soll weiss ich zwar noch nicht...


Anmelden zum Antworten