Zdravím,
mám takový problém, že potřebuji vykreslit 3 kružnice v obdelniku, avšak vždy se mi vykreslí pouze kružnice. Pokud zakomentuji jistý úsek v kódu a odkomentuji jiný (jak mám uvnitř označeno), vykreslí se mi pro změnu pouze obdelník a kružnice ne. Navíc si nevím rady s tím, že uživatel má pouze jedenkrát zadat číslo barvy a touto barvou se mají vykreslit všechny kružnice (mám použít odkaz nebo ukazatel nebo to udělat jinak?), program se nemá ptát na 3 barvy.
Pro upřesnění přidám zadání:
Vytvořte program který vykreslí obrazec se třemi vyplněnými kružnicemi ohraničenými obdélníkem (viz. obrázek níže), barva výplně kružnic bude specifikována uživatelem. Program bude vycházet z předchocí úlohy. V programu implementujte novou třídu Drawing, která bude obsahovat 3 objekty vyplněné kružnice (typu FilledCircle) a jeden objekt obdélníku (typu Rectangle). Dále bude obsahovat:
konstruktor Drawing()
metodu readValues() pro načtení barvy výplně
metodu setFillColor(int fc) pro nastavení barvy výplně všech tří
kružnic
metodu draw(), která otevře okno a vykreslí do něj tři vyplněné kružnice
a ohraničující obdélník.
Podle potřeby upravte existující třídy (např. budou potřebovat konstruktory bez parametrů, do třídy FilledCircle doplňte metodu setFillColor(int fc), okno pro kreslení bude otevřeno v Drawing::draw(), a metody draw() grafických tříd budou přijímat parametr s číslem okna a budou provádět pouze operace kreslení do tohoto okna).
#include <iostream>
#include <g2.h>
#include <g2_X11.h>
using namespace std;
int dev = 0;
class Graphic
{
public:
Graphic();
Graphic (int ax, int ay);
void setValues(int ax, int ay);
void printValues();
int getCentreX();
int getCentreY();
private:
int x, y;
};
Graphic::Graphic()
{
x = 10;
y = 10;
}
Graphic::Graphic(int ax, int ay)
{
x = ax;
y = ay;
}
void Graphic::setValues(int ax, int ay)
{
x = ax;
y = ay;
}
void Graphic::printValues()
{
cout << "Hodnota X: " << x <<endl;
cout << "Hodnota Y: " << y <<endl;
}
int Graphic::getCentreX()
{
return x;
}
int Graphic::getCentreY()
{
return y;
}
/*---------------------------------------------------*/
class FilledCircle : public Graphic
{
public:
FilledCircle();
FilledCircle(int ax, int ay, int r, int c);
void setValues(int ax, int ay, int r);
void setColor(int c);
void readColor();
void printValues();
int getRadius();
void draw();
private:
int radius, color;
};
FilledCircle::FilledCircle() : Graphic()
{
radius = 0;
}
FilledCircle::FilledCircle(int ax, int ay, int r, int c) : Graphic(ax, ay)
{
radius = r;
color = c;
}
void FilledCircle::setValues(int ax, int ay, int r)
{
Graphic::setValues(ax, ay);
radius = r;
}
void FilledCircle::setColor(int c)
{
color = c;
}
void FilledCircle::printValues()
{
Graphic::printValues();
//cout << "Hodnota X fc: " << x << endl;
//cout << "Hodnota Y fc: " << y << endl;
cout << "Hodnota r fc: " << radius << endl;
cout << "Hodnota c fc: " << color << endl;
}
void FilledCircle::readColor()
{
int c;
cout << "Zadejte barvu fc: " << endl;
cin >> c;
setColor(c);
}
int FilledCircle::getRadius()
{
return radius;
}
void FilledCircle::draw()
{
g2_set_line_width (dev, 2);
g2_pen (dev, color);
g2_filled_circle (dev, Graphic::getCentreX(), Graphic::getCentreY(), getRadius());
}
/*-------------------------------------------------------------*/
class Rectangle : public Graphic
{
public:
Rectangle();
Rectangle (int ax, int ay, int h, int w);
void setValues (int ax, int ay, int h, int w);
int getWidth();
int getHeight();
void printValues();
void drawR();
private:
int height;
int width;
};
Rectangle::Rectangle() : Graphic ()
{
height = 590;
width = 590;
}
Rectangle::Rectangle(int ax, int ay, int h, int w) : Graphic(ax, ay)
{
height = h;
width = w;
}
void Rectangle::setValues(int ax, int ay, int h, int w)
{
Graphic::setValues(ax, ay);
height = h;
width = w;
}
int Rectangle::getWidth()
{
return width;
}
int Rectangle::getHeight()
{
return height;
}
void Rectangle::printValues()
{
Graphic::printValues();
//cout << "Hodnota X fc: " << x << endl;
//cout << "Hodnota Y fc: " << y << endl;
cout << "Hodnota h rect: " << height << endl;
cout << "Hodnota w rect: " << width << endl;
}
void Rectangle::drawR()
{
g2_set_line_width (dev, 5);
g2_pen(dev, 1);
g2_rectangle (dev, Graphic::getCentreX(), Graphic::getCentreY(), getWidth(), getHeight());
}
/*-------------------------------------------------------*/
class Drawing
{
Drawing();
};
/*-------------------------------------------------------*/
//pokud tato cast kodu bude odkomentovana, vykresli se pouze obdelnik
/*void setAndPrintValues(FilledCircle fcirc1, FilledCircle fcirc2, FilledCircle fcirc3, Rectangle rect)
{
fcirc1.readColor();
fcirc2.readColor();
fcirc3.readColor();
rect.setValues(100, 100, 100, 100);
rect.printValues();
fcirc1.setValues(150, 150, 70);
fcirc1.printValues();
fcirc2.setValues(300, 450, 70);
fcirc2.printValues();
fcirc3.setValues(450, 150, 70);
fcirc3.printValues();
}*/
void Drawing(FilledCircle fcirc1, FilledCircle fcirc2, FilledCircle fcirc3, Rectangle rect)
{
fcirc1.draw();
fcirc2.draw();
fcirc3.draw();
rect.drawR();
}
void setFillColor();
{
}
int main()
{
FilledCircle fcirc1, fcirc2, fcirc3;
Rectangle rect;
//setAndPrintValues(fcirc1, fcirc2, fcirc3, rect);
//pokud nasledujici blok bude zakomentovan a odkomentovan blok void setAndPrintValues, prestanou se zobrazovat kruznice
fcirc1.readColor();
fcirc2.readColor();
fcirc3.readColor();
rect.setValues(100, 100, 100, 100);
rect.printValues();
fcirc1.setValues(150, 150, 70);
fcirc1.printValues();
fcirc2.setValues(300, 450, 70);
fcirc2.printValues();
fcirc3.setValues(450, 150, 70);
fcirc3.printValues();
dev = g2_open_X11(600, 600);
Drawing(fcirc1, fcirc2, fcirc3, rect);
cin.get();
cin.get();
return 0;
}
Začínám se v tom pořádně topit, protože nerozumím, co a jak a proč funguje.. ..i přestože čtu nyní knihu o c++ a jsem někde na straně 230..