Question

Je vais avoir des problèmes avec une tâche qui m'ai été donné, le problème est que je ne peux pas trouver toutes les ressources d'une façon similaire au code que j'ai donné.J'ai lu tellement de nombreux documents en essayant de trouver des similitudes, mais ne peut pas trouver quelque chose d'utile.

J'ai besoin d'aide pour essayer de comprendre ce code et comment l'utiliser pour créer un Losange. Les seules choses que je ne peux pas comprendre, c'est comment créer un Losange qui appartient à la classe Shape.Appliquer un centre de gravité pour que le Losange puis ajouter des sommets à l'aide d'une méthode push_back. Malheureusement, cette poussée de retour de la méthode doit être utilisée, j'ai échoué à l'examen en utilisant simplement drawLine(10,10,40,10);etc pour les lignes de dessin où je voulais.

Je vais être le meulage ce pour une bonne semaine donc je doit réagir rapidement.

//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);
};
Était-ce utile?

La solution

Comme vous pouvez le voir, Rhombus est déjà une sous-classe de Shape (class Rhombus : public Shape) donc vous avez juste à créer une instance de Rhombus pour que la magie se produire.

Shape est définie de telle façon que la Vertex passé (comme le point paramètre) est utilisé pour initialiser la centroid variable d'instance automatiquement;de sorte que vous pouvez utiliser centroid comme le centre de gravité pour toute opération nécessitant le centre de gravité de données liées, soit de l'intérieur Shape ou dans l'un de ses sous-classes comme Rhombus.

De même, la liste vertices est disponible pour Shape et toutes ses sous-classes comme une variable d'instance.Si vous regardez le reste du code (par ex. Shape::drawShape), vous verrez comment vertices a été utilisé pour manipuler les sommets de la forme actuelle.

Ce que vous avez à faire ici est tout à fait semblable.Par exemple,

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));
}

Lorsque vous êtes à l'intérieur Rhombus::Rhombus (le constructeur), vous êtes déjà à l'intérieur de un losange qui vient d'être créé;vous n'avez pas à créer un Rhombus l'objet de nouveau.Vous avez juste à "décorer" l'instance par l'ajout de sommets, et la définition d'un centre de gravité (qui a été déjà fait).

Imaginez que vous êtes la création d'un Rhombus d'un Shape;vous devez créer 4 sommets et les ajouter à la structure qui assure le suivi de la liste de tous les sommets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top