Pergunta

Estou tendo problemas com uma tarefa que recebi. O problema é que não consigo encontrar nenhum recurso semelhante ao código que recebi.Li tantos documentos tentando encontrar semelhanças, mas não consigo encontrar nada de útil.

Preciso de ajuda para tentar entender esse código e como usá-lo para criar um Rhombus. A única coisa que não consigo entender é como criar uma forma Rhombus que pertença à classe Shape.Aplique um centróide a esse losango e adicione vértices usando um método push_back. Infelizmente, esse método push back precisa ser usado, fui reprovado no exame apenas usando drawLine(10,10,40,10);etc para desenhar linhas onde eu queria.

Estarei trabalhando nisso por uma semana inteira, então devo responder rapidamente.

//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);
};
Foi útil?

Solução

Como você pode ver, Rhombus já é uma subclasse de Shape (class Rhombus : public Shape) então você só precisa criar uma instância de Rhombus para que toda a magia aconteça.

Shape é definido tal que o Vertex passou para ele (como o point parâmetro) é usado para inicializar o centroid variável de instância automaticamente;então você pode usar centroid como o centróide para qualquer operação que exija dados relacionados ao centróide, seja de dentro Shape ou de dentro de uma de suas subclasses como Rhombus.

Da mesma forma, a lista vertices está disponível para Shape e todas as suas subclasses como uma variável de instância.Se você olhar o restante do código (por exemplo, Shape::drawShape), você notará como vertices foi usado para manipular os vértices da forma atual.

O que você deve fazer aqui é bastante semelhante a isso.Por exemplo,

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

Quando você está dentro Rhombus::Rhombus (o construtor), você já está dentro um losango que acaba de ser criado;você não precisa criar um Rhombus objeto novamente.Basta "decorar" a instância adicionando vértices e definindo um centróide (o que já foi feito).

Imagine que você está criando um Rhombus fora de um Shape;você precisa criar 4 vértices e adicioná-los à estrutura que acompanha a lista de todos os vértices.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top