Rysowanie w konsoli

0

Witam,
mam do zrobienia programik który jest jakby kontynuacją tego w tym temacie.
Opis wygląda tak:
Ćwiczenie jest kontynuacją zadania z klasą Image. Proszę napisać abstrakcyjną klasę Shape
oraz pochodne od niej klasy Rectangle, Square oraz Circle. Hierarchia klas przedstawiona
jest poniżej:

                             Shape
                                ^
                              /    \
                            /        \  
                Rectangle      Circle
                       |
                   Square

Na ocenę 4:
Klasa Shape ma mieć czysto wirtualną funkcję składową draw oraz wirtualny destruktor.
Funkcja draw jako argumenty przyjmuje obraz na którym ma pracować oraz odcień szarości
jakim ma narysować daną figurę (możliwe są inne warianty rozwiązania):
void draw(Image& image, byte grayLevel)
Przykładowy efekt działania programu:

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . r r r r r r r r r r . . . . . . . . . . . . . . . . . .
. . r r r r r r r r r r . . . . . . c c c c c . . . . . . .
. . r r r r r r r r r r . . . . c c c c c c c c c . . . . .
. . r r r r r r r r r r . . c c c c c c c c c c c c c . . .
. . r r r r r r r r r r . . c c c c c c c c c c c c c . . .
. . . . . . . . . . . . . c c c c c c c c c c c c c c c . .
. . . . . . . . . . . . . c c c c c c c c c c c c c c c . .
. . . . . . . . . . . . c c c c c c c c c c c c c c c c c .
. . . . . . . . . . . . c c c c c c c c c c c c c c c c c .
. . s s s s s s s . . . c c c c c c c c c c c c c c c c c .
. . s s s s s s s . . . c c c c c c c c c c c c c c c c c .
. . s s s s s s s . . . c c c c c c c c c c c c c c c c c .
. . s s s s s s s . . . . c c c c c c c c c c c c c c c . .
. . s s s s s s s . . . . c c c c c c c c c c c c c c c . .
. . s s s s s s s . . . . . c c c c c c c c c c c c c . . .
. . s s s s s s s . . . . . c c c c c c c c c c c c c . . .
. . . . . . . . . . . . . . . . c c c c c c c c c . . . . .
. . . . . . . . . . . . . . . . . . c c c c c . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Shape
Rectangle Circle
Square
Na ocenę 5:
Klasa Shape ma mieć dodatkową wersję funkcji draw rysującą figurę oraz jej krawędź innymi
odcieniami szarości. Funkcja ta będzie więc pobierała dodatkowy argument – odcień szarości
krawędzi (możliwe są inne warianty rozwiązania):
void drawWithBorder(Image& image, byte grayLevel, byte
borderGrayLevel)
Przykładowy efekt działania programu:

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . * * * * * * * * * * . . . . . . . . . . . . . . . . . .
. . * r r r r r r r r * . . . . . . * * * * * . . . . . . .
. . * r r r r r r r r * . . . . * * c c c c c * * . . . . .
. . * r r r r r r r r * . . * * c c c c c c c c c * * . . .
. . * * * * * * * * * * . . * c c c c c c c c c c c * . . .
. . . . . . . . . . . . . * c c c c c c c c c c c c c * . .
. . . . . . . . . . . . . * c c c c c c c c c c c c c * . .
. . . . . . . . . . . . * c c c c c c c c c c c c c c c * .
. . . . . . . . . . . . * c c c c c c c c c c c c c c c * .
. . * * * * * * * . . . * c c c c c c c c c c c c c c c * .
. . * s s s s s * . . . * c c c c c c c c c c c c c c c * .
. . * s s s s s * . . . * c c c c c c c c c c c c c c c * .
. . * s s s s s * . . . . * c c c c c c c c c c c c c * . .
. . * s s s s s * . . . . * c c c c c c c c c c c c c * . .
. . * s s s s s * . . . . . * c c c c c c c c c c c * . . .
. . * * * * * * * . . . . . * * c c c c c c c c c * * . . .
. . . . . . . . . . . . . . . . * * c c c c c * * . . . . .
. . . . . . . . . . . . . . . . . . * * * * * . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Wskazówki:

  1. Przed narysowaniem figur geometrycznych należy zdefiniować parametry figury
    niezbędne do jej narysowania (np. współrzędne położenia figury w obrazie, promień
    koła czy szerokość boków prostokąta itp.). Parametry te można podać w konstruktorze
    figury (możliwe są też inne warianty rozwiązania).

Trochę się porozjeżdżało ale jak sie skopiuje do notatnika to powinno być dobrze widać.

Napisałem taki szkielet i nie wiem czy dobrze.
Shape.h

#ifndef _Shape_hpp_
#define _Shape_hpp_

#include <iostream>
using namespace std;

typedef unsigned char byte;


class Shape
{
public:
       void draw(Image& image, byte grayLevel) = 0;
       virtual ~Shape();
       void getX();
       void getY();
protected:
          byte x,y;           // x,y - współrzędne
}


class Rectangle : public Shape
{
public:
       void draw(Image& image, byte grayLevel);
private:
        byte width;
        byte height;
}


class Square : public Rectangle
{
public:
       void draw(Image& image, byte grayLevel);
private:
        byte width;
}


class Circle : public Shape
{
public:
       void draw(Image& image, byte grayLevel);
private:
        byte radius;
}

#endif /*_Shape_hpp_*/ 

Bardzo proszę o pomoc.

0

Metoda draw powinna być wirtualna. Do samego rysowania tych figur w konsoli można użyć biblioteki ncurses.

Ponadto kwadrat nie powinien dziedziczyć po prostokącie. To idiotyzm w czystej postaci. Jeśli wymyślił to twój nauczyciel to daj mi do niego namiar, tak mu nabluzgam, że odechce mu się uczyć czegokolwiek.

0

ups.. zapomnialem odpisac jak wykrajalem watek z innego:)))

bystry: powienien-niepowienien, to zależy od modelu problemu i lokalnej definicji pojęcia, więc, bluzg zostaw na później, mimo iż tutaj faktycznie NIE powinien

btw, ..."a jak już musi, bo to jest Rusi, a nie w Polszcze", to przynajmniej ów kwadrat nie powinien mieć 'byte width'..

0

Hmm zmieniłem nieco koncepcję ale zostawiam hierarchię dziedziczenia ponieważ to polecenie (choć nie wiem czemu kwadrat nie powinien Waszym zdaniem dziedziczyć po prostokącie - przecież mają wiele wspólnego). A i nie wiem czemu nie powinien mieć 'byte width'.

Oto plik nagłówkowy:
Shape.h

#ifndef _Shape_hpp_
#define _Shape_hpp_

#include <iostream>
using namespace std;

typedef unsigned char byte;

//----------< Shape >----------
class Shape
{
public:
       virtual void draw(Image& image, byte fillerColour) const =0;
       virtual void drawWithBorder(Image& image, byte fillerColour, byte borderColour) const =0;
       virtual ~Shape();
       void getX() const;
       void getY() const;
       /*void setFillerColour();
       byte getFillerColour();
       void setBorderColour();
       byte getBorderColour();*/       
protected:
          byte X,Y;           // x,y - współrzędne
          byte fillerColour;  // fillerColour - kolor wypełniacza
          byte borderColour;  // borderColour - kolor ramki
};

//----------< Rectangle >----------
class Rectangle : public Shape
{
public:
       Rectangle (byte x, byte y, byte _width, byte _height);
       virtual void draw(Image& image, byte fillerColour) const;
       virtual void drawWithBorder(Image& image, byte fillerColour, byte borderColour) const;
private:
        byte width;
        byte height;
};

//----------< Square >----------
class Square : public Rectangle
{
public:
       Square (byte x, byte y, byte _width);
       virtual void draw(Image& image, byte fillerColour) const;
       virtual void drawWithBorder(Image& image, byte fillerColour, byte borderColour) const;
private:
        byte width;
};

//----------< Circle >----------
class Circle : public Shape
{
public:
       Circle (byte x, byte y, byte _radius);
       virtual void draw(Image& image, byte fillerColour) const;
       virtual void drawWithBorder(Image& image, byte fillerColour, byte borderColour) const;
private:
        byte radius;
};

        

#endif /*_Shape_hpp_*/

i definicje:
Shape.cpp

// Shape.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Shape.h"

typedef unsigned char byte;


//----------< Shape >----------

virtual Shape::~Shape()
{
        ;
}

void Shape::getX() const
{
     return X;
}

void Shape::getY() const
{
     return Y;
}

       /*void setFillerColour();
       byte getFillerColour();
       void setBorderColour();
       byte getBorderColour();*/


//----------< Rectangle >----------
Rectangle::Rectangle (byte x, byte y, byte _width, byte _height):
X(x), Y(y),
width(_width), height(_height)
{
               ;
}

virtual void Rectangle::draw(Image& image, byte fillerColour) const
{
      for (j=Y; j<height; j++)
      {
          for (i=X; i<width; i++)
          {
              Screen.writePixel(i,j,fillerColour);
          }
      }
}

virtual void Rectangle::drawWithBorder(Image& image, byte fillerColour, byte borderColour) const
{
      for (j=Y; j<height; j++)
      {
          for (i=X; i<width; i++)
          {
              Screen.writePixel(i,j,borderColour);
          }
      }
      for (j=Y+1; j<height-1; j++)
      {
          for (i=X+1; i<width-1; i++)
          {
              Screen.writePixel(i,j,fillerColour);
          }
      }
}

//----------< Square >----------
Square::Rectangle (byte x, byte y, byte _width):
X(x), Y(y),
width(_width)
{
               ;
}

virtual void Rectangle::draw(Image& image, byte fillerColour) const
{
      for (j=Y; j<width; j++)
      {
          for (i=X; i<width; i++)
          {
              Screen.writePixel(i,j,fillerColour);
          }
      }
}

virtual void Rectangle::drawWithBorder(Image& image, byte fillerColour, byte borderColour) const
{
      for (j=Y; j<width; j++)
      {
          for (i=X; i<width; i++)
          {
              Screen.writePixel(i,j,borderColour);
          }
      }
      for (j=Y+1; j<width-1; j++)
      {
          for (i=X+1; i<width-1; i++)
          {
              Screen.writePixel(i,j,fillerColour);
          }
      }
}

Poproszę uprzejmie o przynajmniej kilka słów komentarza.
Jak na razie jest to generator błędów. [wstyd]

1 użytkowników online, w tym zalogowanych: 0, gości: 1