C++Builder - prekrývanie

Programovacie jazyky, rady, poradňa...
matoa
Star
Star
Príspevky: 636
Registrovaný: 10 dec 2006, 13:24
Kontaktovať používateľa:

C++Builder - prekrývanie

Príspevok od používateľa matoa »

zdravím... pomocou tohto :

Kód: Vybrať všetko

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  vymaz();
randomize();

Form1->Image1->Canvas->Brush->Color=clRed;


for (int i=1;i<=20;i++)
        {
         int x1=20+random(185);
         int y1=20+random(410);
         int x2=x1+20;
         int y2=y1+20;
         Form1->Image1->Canvas->Ellipse(x1,y1,x2,y2);
        }

Form1->Image1->Canvas->Brush->Color=clBlue;
for (int i=1;i<=20;i++)
        {
         int X1=225+random(185);
         int Y1=20+random(410);
         int X2=X1+20;
         int Y2=Y1+20;
         Form1->Image1->Canvas->Ellipse(X1,Y1,X2,Y2);
        };

Form1->Image1->Canvas->Pen->Color=clBlack;
Form1->Image1->Canvas->LineTo(Form1->Image1->Width/2,0);
Form1->Image1->Canvas->MoveTo(Form1->Image1->Width/2,Form1->Image1->Height);

}
sa mi nakreslí takéto niečo, ako je v prílohe.

1. otázka - Vedeli by ste mi niekto pomôcť, ako spraviť to, že by sa tie "guličky" neprekrívali?
2. ak som sa nepomýlil, tak tá čiara, čo he hore do polky bielej plochy, by mala ísť zhora dole, a nie takto... ako to opraviť? keď som to mal spravené cez Timer, aby sa mi stále menili, tak po druhom "tiknutí" timera sa objavila tam kde mala.
Prílohy
toto.png
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++Builder - prekrývanie

Príspevok od používateľa BX »

Aby sa neprekrývali? Kontrolovať súradnice a pri "zle" vygenerovaných súradniciach vygenerovať nové. (tu bude treba si nejako súradnice každého kruhu zapamätať) Prípadne si plochu rozdelíš na akoby "bunky" a do každej nakreslíš jeden kruh. Už je na tebe, aké bunky si zvolíš. (napríklad obdĺžniky o šírke WIDTH/2 a výške HEIGHT/5 Tak nakreslíš 5 zdanlivo náhodne umiestnených kruhov po celej polploche)

K tej čiare: Najpr ide MoveTo a až potom LineTo (MoveTo ti akoby položí pero na papier a LineTo ti perom potiahne)
matoa
Star
Star
Príspevky: 636
Registrovaný: 10 dec 2006, 13:24
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa matoa »

aha, dikes zatial :)

a vedel by si mi napovedať, ako kontrolovať tie súradnice?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++Builder - prekrývanie

Príspevok od používateľa BX »

Teraz som si uvedomil, C++ builder a delphi? wtf?

Súradnice kruhov môžeš nahádzať trebárs do poľa (xovú a yovú súr) Ak je polomer vždy rovnaký, môžeš to kontrolovať tak, že vygeneruješ novú x a y súradnicu a prebehneš poľom všetkých. Tu si môžeš vytvoriť vektor zo súradníc nových a tých z poľa a kontroluješ, či je jeho veľkosť menšia ako 2*polomer. Ak áno, tak sú súradnice zlé = vygenerujú sa nové a ideš odznovu.
Samozrejme tento postup sa dá ešte dosť zoptimalizovať. toto môže byť veľmi nespoľahlivé.

(Ja by som to riešil skôr rozdelením obrazovky na časti)
matoa
Star
Star
Príspevky: 636
Registrovaný: 10 dec 2006, 13:24
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa matoa »

ok... dikes, ale podme na to inak :)

Kód: Vybrať všetko

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   vymaz();
randomize();

Form1->Image1->Canvas->Brush->Color=clRed;


for (int i=1;i<=20;i++)
        {
         int x1=20+random(410);
         int y1=20+random(410);
         int x2=x1+20;
         int y2=y1+20;
         Form1->Image1->Canvas->Ellipse(x1,y1,x2,y2);
        }

Form1->Image1->Canvas->Brush->Color=clBlue;
for (int i=1;i<=20;i++)
        {
         int X1=20+random(410);
         int Y1=20+random(410);
         int X2=X1+20;
         int Y2=Y1+20;
         Form1->Image1->Canvas->Ellipse(X1,Y1,X2,Y2);
        };
}
teraz sa to vykresluje na celu plochu náhodne, dajme tomu, že modré s modrými a červené s červenými by sa mohli prekrývať...
ale modré s červenými nie... fungovalo by to tak, že by som porovnával hodnotu x1 s X1 a y1 s Y1 a rozdiel by musel byť väčší o 20? či to je blbosť?
ak nie, tak existuje príkaz, pomocou ktorého zistím aktuálne súradnice tých bodov, pretože keď som skúsal len tak odveci aby vypísalo rozdiel medzi x1 a X1 tak chyba bola, že ich nepozná...skúšal som to dať aj do len jedného cyklu, ale to mi nakreslilo len jednu červenú a mrte modrých...
a ak bude rozdiel záporný, ako spraviť aby to nevadilo (absolútnu hodnotu? či ? a ako? :) )
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa johny3212 »

Pocitaj vektory medzi dvoma bodmi, ked bude ten vektor mensi ako polovica polomeru, tak nemusis generovat nove suradnice, ale uz ten vygenerovany bod dokazes po tom vektore posunut a tu cast, ktora chyba k tomu aby sa neprekrivali. Na tieto veci by si si mal troska nastudovat vektorovu matematiku, taketo veci sa riesia cez vektory.
Dalej si pozri niektore sofistikovanejsie pehladavacie algoritmi, lebo prehladavat tie prvky od 0 po n, nie je moc efektivne. Tu ti s linearnim narastom poctu prvkov bude exponencialne stupat prehladavanie.

//autoeditácia príspevku (12 Máj 2011, 16:44)
Suradnice tych bodov musis uchovavat niekde. Samozrejme, ze ti to nepojde, ak to mas iba ako docasne premenne. Myslel som, ze tu riesime algoritmi a nie jazyk :).
matoa
Star
Star
Príspevky: 636
Registrovaný: 10 dec 2006, 13:24
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa matoa »

fu... kks... dikes,ale toto už je vela na mna... pri našej výučbe som rád, že sa mi podarilo toto, čo mám zatial... ale dikes za odpovede, budem sa trápiť dalej :)
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa johny3212 »

Preco, nic komplikovane. Mas dva body A a B so suradnicami

Kód: Vybrať všetko

A = [3,2]; bod A - prva gulicka
B = [5,5]; bod B - druha gulicka
vypocet vektora
c = B - A = [2, 3]; mas vypocitany vektor, teraz porovnavat absolutnu hodnotu (dlzku) toho vektora
ak polovica tej dlzky bude mensia ako polomer kruhu, tak sprav (polomer - polovica dlzky) a ziskas rozdiel, kt. ti chyba. Zmenis vektor c a ten potom pripocitas ku bodu B a tym sa ti posunie von z kruhu. Neviem ci som to uplne vsetko dobre napisal, lebo som to pisal z hlavy :).
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: C++Builder - prekrývanie

Príspevok od používateľa BX »

johny3212: Tu je ale možné, i keď málo pravdepodobné pri veľkých plochách, ale možné, že sa kruhy prekryjú. Keď sa vygeneruje jeden kruh na súradniciach [100,100], následne druhý na [99,100], posunie sa na (vymyslím si) [80,100], potom ďalší sa vygeneruje na [86,95] a posunie sa síce mimo jedného, ale bude prekrývať druhý.
Pre 100% neprekrytie to aj tak bude treba ešte raz prejsť celým cyklom.
Pravdepodobnosť takéhoto scenára je len o čosi menšia, ako keby generoval nové náhodné súradnice.
Čiže matoa, ak sa ti nechce zisťovať dĺžka vektora a následne upravovať pozície, myslím, že môžeš kľudne generovať novú náhodu.
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: C++Builder - prekrývanie

Príspevok od používateľa johny3212 »

Ano, ten vypocet bude troska komplikovanejsi, s tym generovanim to asi bude prenho jednoduchsie. Ale to porovnabanie dlzky vektora moze ostat :).
Napísať odpoveď