oop — C ++ Объектно-ориентированный ромб

У меня проблемы с заданием, которое мне дали, проблема в том, что я не могу найти какие-либо ресурсы, в любом случае похожие на код, который мне дали. Я прочитал так много документов, пытаясь найти сходство, но не могу найти ничего полезного.

Мне нужна помощь, пытаясь понять этот код и как использовать его для создания ромба. Единственное, чего я не могу понять, это как создать форму Rhombus, которая принадлежит классу Shape. Примените центроид к этому ромбу, а затем добавьте вершины, используя метод push_back. К сожалению, этот метод отталкивания нужно использовать, я провалил экзамен, просто используя drawLine (10,10,40,10); и т. д. для рисования линий, где я хотел.

Я буду оттачивать это целую неделю, поэтому я должен ответить быстро.

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

0

Решение

Как вы видете, Rhombus уже подкласс Shape (class Rhombus : public Shape) так что вам просто нужно создать экземпляр Rhombus для всего волшебства случиться.

Shape определяется так, что Vertex перешел к нему (как point параметр) используется для инициализации centroid переменная экземпляра автоматически; так что вы можете использовать centroid в качестве центроида для любой операции, требующей данных, связанных с центроидом, либо изнутри Shape или из одного из его подклассов, таких как Rhombus,

Аналогично, список vertices доступно для Shape и все его подклассы как переменная экземпляра. Если вы посмотрите на остальную часть кода (например, Shape::drawShape), вы заметите, как vertices был использован для управления вершинами текущей фигуры.

То, что вы должны сделать здесь, очень похоже на это. Например,

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

Когда ты внутри Rhombus::Rhombus (конструктор), вы уже внутри ромб, который был только что создан; вам не нужно создавать Rhombus объект снова Вам просто нужно «украсить» экземпляр, добавив вершины и определив центроид (что уже было сделано).

Просто представьте, что вы создаете Rhombus из Shape; вам нужно создать 4 вершины и добавить их в структуру, которая отслеживает список всех вершин.

0

Другие решения