Vykreslování objektů – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vykreslování objektů – C / C++ – Fórum – Programujte.comVykreslování objektů – C / C++ – Fórum – Programujte.com

 

delicacyy0
Newbie
10. 9. 2012   #1
-
0
-

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..

Nahlásit jako SPAM
IP: 78.45.255.–
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #2
-
0
-

sme zase u nastavovani parametru u kopii objektu....

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
10. 9. 2012   #3
-
0
-

mužu se zeptat, proč jednoduše nezačneš po kouskách? resp. naučíš se pořádně základy, tim myslim třeba kompletně pole, funkce, ukazatele, alokaci, dealokaci apod... potom k tomu přidáš OOP s tím, že už budeš dobře znát tyto základy... a na konec přidáš kreslení

nějaká kniha je podle mě na nic, ti dá spíše teorii ale většina praxe je na internetu a neustálém zkoušení i toho co znáš a postupném přidávání nových prvkůty

ty sem vždycka pastneš takovej kus kódu a na konci tvrdíš že tomu nerozumíš, to podle mě nemá logiku.. prostě začít pomalu a od základů :)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #4
-
0
-

a jeste  g2_rectangle ocekava  x1 y1 x2 y2  ... pokud mas   x100 y100 w100 h100 tak mas mit parametry 100 100 200 200

+ ten obdelnik neni skoro videt za tim kruhem

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
delicacyy0
Newbie
10. 9. 2012   #5
-
0
-

mě prostě nejvíc mate to, že učitel po nás chce program, aniž se zmiňuje ve výuce o tom, že třeba nějaké kopírování hodnot existuje, že se věci předávají nejlíp odkazem, a další podstatné věci, které si nejsem schopna nyní sama domyslet, protože o nich nemám ani páru a ani mít nemůžu.. no já to nějak udělám..

KIIV: dík za ty hodnoty, zase jedna úplně zbytečná chyba..

Nahlásit jako SPAM
IP: 78.45.255.–
KIIV
~ Moderátor
+43
God of flame
10. 9. 2012   #6
-
0
-

ale tak kopirovani u parametru sme tu nedavno resili jednou :)

kazdopadne u toho rectangle proste k druhemu paru parametru prictes jeste x a y (aby byl vysledkem druhy bod)

+ nejlip zjistis ze se ti nepredavaji hodnoty ze vypises v ty funkci a pak je vypises po ni... hned je pak videt ze neco nefunguje

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Vykreslování v assembleru — založil maherik

C# vykreslovani grafů — založil ondra

Bitmap vykreslování — založil Mutagen

Vykreslování grafů — založil ondra

Vykreslování obnovování — založil hráč

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý