Frage

Ich habe Probleme mit einer Aufgabe, die mir gegeben wurde. Das Problem besteht darin, dass ich keine Ressourcen finden kann, die dem Code ähneln, den ich erhalten habe.Ich habe so viele Dokumente durchgelesen, um Ähnlichkeiten zu finden, konnte aber nichts Nützliches finden.

Ich brauche Hilfe beim Versuch, diesen Code zu verstehen und wie man ihn zum Erstellen einer Raute verwendet. Das Einzige, was ich nicht begreifen kann, ist, wie man eine Rhombus-Form erstellt, die zur Shape-Klasse gehört.Wenden Sie einen Schwerpunkt auf diese Raute an und fügen Sie dann mithilfe einer push_back-Methode Scheitelpunkte hinzu. Leider muss diese Push-Back-Methode verwendet werden. Ich habe die Prüfung nicht bestanden, indem ich einfach drawLine(10,10,40,10);usw. zum Zeichnen von Linien, wo ich wollte.

Ich werde eine ganze Woche lang daran arbeiten, daher sollte ich schnell reagieren.

//This is the rhombus.cpp file
#include "rhombus.h"

Rhombus::Rhombus(Vertex point, int radius) : Shape(point)
{
    if((radius>centroid.getX()/2) || (radius>centroid.getY()/2)) // Inteded to be a y?
    {
        cout << "Object must fit on screen." << endl;
        system("pause");
        exit(0);
    }

    Rhombus shape1(20, 20);
    shape1.plotVertices();

}

void Rhombus::plotVertices()
{
    //vertices.push_back(Vertex(centroid.getX(), centroid.getY() + radius));
    //vertices.push_back(Vertex(centroid.getX(), centroid.getY()));
    //vertices.push_back(Vertex(centroid.getX(), centroid.getY()));
    //vertices.push_back(Vertex(centroid.getX(), centroid.getY()));
}

// This is the rhombus.h file
#include "shape.h"

class Rhombus : public Shape 
{
    int radius;
    void plotVertices();
    Rhombus(Vertex point, int radius = 10);
    int area();
    int perimeter();
};

// This is the shape.cpp file
#include "shape.h"

Shape::Shape(Vertex point) : centroid(point)
{
    // constructs a shape

}

void Shape::drawShape()
{

    list<Vertex>::iterator current = vertices.begin();
    list<Vertex>::iterator previous = vertices.begin();
    while(current!=vertices.end())
    {
        Console::gotoXY((*current).getX(),(*current).getY());
        cout << "*";
        if(current!=vertices.begin())
            drawLine((*current).getX(),(*current).getY(), (*previous).getX(),            (*previous).getY());
        previous = current;
        current++;
    }
    previous = vertices.begin();

    //Debug assertion error here.
    drawLine(vertices.back().getX(), vertices.back().getY(), vertices.front().getX(),     vertices.front().getY());
}

void Shape::drawLine(int x1, int y1, int x2, int y2)
{      

    bool steep = (abs(y2 - y1) > abs(x2 - x1));
    if(steep)
    {
        swap(x1, y1);
        swap(x2, y2);
    }

    if(x1 > x2)
    {
        swap(x1, x2);
        swap(y1, y2);
    }

    int dx = x2 - x1;
    int dy = abs(y2 - y1);

    float error = dx / 2.0f;
    int ystep = (y1 < y2) ? 1 : -1;
    int y = y1;
    int maxX = x2;

    for(int x=x1; x<maxX; x++)
    {
        if(steep)
        {
            Console::gotoXY(y,x);
            cout << "*";
        }
        else
        {
            Console::gotoXY(x,y);
        cout << "*";
        }
        error -= dy;
        if(error < 0)
        {
            y += ystep;
            error += dx;
        }
    }
}


double Shape::round(double x)
{
    if (ceil(x+0.5) == floor(x+0.5))
    {
        int a = (int) ceil(x);
        if (a%2 == 0)
            return ceil(x);
        else
            return floor(x);
    }
    else 
        return floor(x+0.5);
}

void Shape::outputStatistics()
{

}

// This is the shape.h file
#pragma once
#include "console.h"
#include "vertex.h"
#include <iostream>
#include <list>
#include <cstdlib>
#include <cmath>
using namespace std;

#define PI 3.14159265358979323846

class Shape
{
    list<Vertex>::iterator itr;
protected:
    list<Vertex> vertices;
    Vertex centroid;
    void drawLine(int x1, int y1, int x2, int y2);

    Shape(Vertex point);
    double round(double x);

public:
    void drawShape();
    virtual int area() = 0;
    virtual int perimeter() = 0;
    virtual void outputStatistics();
    void rotate(double degrees);
    void scale(double factor);
};
War es hilfreich?

Lösung

Wie du sehen kannst, Rhombus ist bereits eine Unterklasse von Shape (class Rhombus : public Shape), Sie müssen also nur eine Instanz von erstellen Rhombus damit all die Magie geschieht.

Shape ist so definiert, dass die Vertex an ihn übergeben (als die point Parameter) wird zur Initialisierung des verwendet centroid Instanzvariable automatisch;damit Sie es verwenden können centroid als Schwerpunkt für jede Operation, die schwerpunktbezogene Daten benötigt, entweder von innen Shape oder aus einer seiner Unterklassen wie Rhombus.

Ebenso die Liste vertices ist verfügbar für Shape und alle seine Unterklassen als Instanzvariable.Wenn Sie sich den Rest des Codes ansehen (z. B. Shape::drawShape), werden Sie merken wie vertices wurde zum Bearbeiten der Eckpunkte der aktuellen Form verwendet.

Was Sie hier tun müssen, ist dem ziemlich ähnlich.Zum Beispiel,

Rhombus::Rhombus(Vertex point, int radius) : Shape(point)
{
    if((radius>centroid.getX()/2) || (radius>centroid.getY()/2)) // Inteded to be a y?
    {
        cout << "Object must fit on screen." << endl;
        system("pause");
        exit(0);
    }

    // create vertices for a rhombus with horizontal and vertical diagonals
    vertices.push_back(Vertex(point.getX() - radius, point.getY()));
    vertices.push_back(Vertex(point.getX(), point.getY() - radius));
    vertices.push_back(Vertex(point.getX() + radius, point.getY()));
    vertices.push_back(Vertex(point.getX(), point.getY() + radius));
}

Wenn du drinnen bist Rhombus::Rhombus (der Konstruktor), das bist du bereits innen eine gerade entstandene Raute;Sie müssen kein erstellen Rhombus noch einmal widersprechen.Sie müssen die Instanz lediglich „dekorieren“, indem Sie Scheitelpunkte hinzufügen und einen Schwerpunkt definieren (was bereits geschehen ist).

Stellen Sie sich vor, Sie erstellen ein Rhombus aus einem Shape;Sie müssen 4 Scheitelpunkte erstellen und sie der Struktur hinzufügen, die die Liste aller Scheitelpunkte verfolgt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top