C++ Vorhandes Dreieck Positions Änderung...

ItzKray

Cadet 2nd Year
Registriert
Mai 2016
Beiträge
18
Schönen Guten Tag!
Gestern hab ich schon einen Beitrag gepostet zu einem Programm wo durch eine .txt Datei ein Dreieck eingefügt wurde und die Farbe ändern kann. Jetzt wollte ich das ganze modifizieren oder muss besser gesagt. Wir müssen das gleiche Dreieck unendlich lang mit einer Random Positionen weiter erstellen und immer eine weitere random Farbe zugewießen...

Meine Idee:
Ich hätte das Ganze über einen Timer gemacht und natürlich mit der random Funktion nur ist die Frage wie und mit welcher Koordinate sich die Position ändert.
Wegen der Farbe hätte ich RGB Farben nur bin ich mir auch nicht sicher wie ich die Zuweise Random...

Das wäre das momentane Programm:
Code:
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
     liste = new TStringList();
     liste->LoadFromFile("dreieck.txt");

     A[0]= StrToInt(liste->Strings[0]);
     A[1]= StrToInt(liste->Strings[1]);

     B[0]= StrToInt(liste->Strings[2]);
     B[1]= StrToInt(liste->Strings[3]);

     C[0]= StrToInt(liste->Strings[4]);
     C[1]= StrToInt(liste->Strings[5]);

     PaintBox1->Canvas->MoveTo(A[0],A[1]);
     PaintBox1->Canvas->LineTo(B[0],B[1]);
     PaintBox1->Canvas->LineTo(C[0],C[1]);
     PaintBox1->Canvas->LineTo(A[0],A[1]);

     int Center[2];
     Center[0] = (A[0]+B[0]+C[0])/3;
     Center[1] = (A[1]+B[1]+C[1])/3;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      Label1->Caption="";
      int Center[2];
      Center[0] = (A[0]+B[0]+C[0])/3;
      Center[1] = (A[1]+B[1]+C[1])/3;
      if((zaehler % 3) == 0)
      {
           PaintBox1->Canvas->Pen->Width = 1;
           PaintBox1->Canvas->Pen->Color = clBlack;
           PaintBox1->Canvas->Brush->Color = clGreen;
           PaintBox1->Canvas->FloodFill(Center[0], Center[1], clBlack, fsBorder);
           Label1->Font->Color = clGreen;
           Label1->Caption = "Grün";
      }
      else if((zaehler % 3) == 1)
      {
           PaintBox1->Canvas->Pen->Width = 1;
           PaintBox1->Canvas->Pen->Color = clBlack;
           PaintBox1->Canvas->Brush->Color = clBlue;
           PaintBox1->Canvas->FloodFill(Center[0], Center[1], clBlack, fsBorder);
           Label1->Font->Color = clBlue;
           Label1->Caption = "Blau";
      }
      else //zahler % 3 == 2
      {
           PaintBox1->Canvas->Pen->Width = 1;
           PaintBox1->Canvas->Pen->Color = clBlack;
           PaintBox1->Canvas->Brush->Color = clRed;
           PaintBox1->Canvas->FloodFill(Center[0], Center[1], clBlack, fsBorder);
           Label1->Font->Color = clRed;
           Label1->Caption = "Rot";
      }
      zaehler++;
}

Danke im Voraus :D
 
Zuletzt bearbeitet:
ItzKray schrieb:
Gestern hab ich schon einen Beitrag gepostet
Und warum hast du deinen Code noch nicht entsprechend korrigiert wie ich es geschrieben hatte? :D

Für Zufallswerte gibt es die Funktion "Random()".
Beispiel:
Code:
Random(10);
gibt dir einen Wert zwischen 0 und 9.

Für dein Dreieck könntest du das so machen:
Code:
A[0] = Random(PaintBox1->Width);
A[1] = Random(PaintBox1->Height);
Die anderen Punkte natürlich auch entsprechend.
Das Laden der Punkte aus der Textdatei muss natürlich entfernt werden.

Ich glaube deine PaintBox muss vor dem neu Zeichnen auch "gesäubert" werden, da du das neue Dreieck sonst einfach dazu zeichnest:
Code:
PaintBox1->Canvas->Brush->Color = clWhite;
PaintBox1->Canvas->FillRect(TRect(0, 0, Form1->PaintBox1->Width, Form1->PaintBox1->Height));
(Hier musst du aufpassen, dass du dein eigentliches Brush nicht überschreibst.)

Dein Code gehört eigentlich auch nicht in die PaintBox, sondern in eine extra Funktion:
Code:
void draw(TPaintBox *paintbox)
{
	paintbox->Canvas->Brush->Color = clWhite;
	paintbox->Canvas->FillRect(TRect(0, 0, paintbox->Width, paintbox->Height));

	paintbox->Canvas->MoveTo(A[0],A[1]);
	paintbox->Canvas->LineTo(B[0],B[1]);
	paintbox->Canvas->LineTo(C[0],C[1]);
	paintbox->Canvas->LineTo(A[0],A[1]);
}
Nach deinem "zaehler++;" schreibst du dann einfach "draw(PaintBox1);".

Auf einen Timer würde ich jetzt nicht unbedingt setzen. Aktuell benutzt du ja auch einen Button, wieso nicht weiterhin, nur dass jetzt immer etwas zufällig gezeichnet wird?

Zufallsfarbe:
Code:
...->Color = RGB(Random(256), Random(256), Random(256));
 
Zuletzt bearbeitet: (Random(256), nicht Random(255))
Gibt es einen Grund warum du die Calling-Convetion als __fastcall vorgibst?
 
Das hat er nicht selbst geschrieben, das ist so von der Borland IDE vorgegeben (für die VCL Lib so spezifiziert).
 
Vielen Danke für die Antwort aber wieso änderst du die höhe etc. um das Dreieck zu bewegen. Auser dem kann man Random nicht so verwenden sondern doch so:
Code:
randomize();
int r=Random(100);

RGB hat funktioniert nur ist es nur schwarz,weiß,grau...
 
Zuletzt bearbeitet:
ItzKray schrieb:
wieso änderst du die höhe etc. um das Dreieck zu bewegen.
Ich dachte ihr solltet ein zufälliges Dreieck erstellen.
Kannst es ja abändern. Einfach 2 Zufalls-Offsets erstellen (x und y) und auf alle 3 Koordinaten draufrechnen.

Das randomize brauchst du nur, wenn du die Funkion "random", also klein geschrieben, verwendest.
Ohne randomize bekommst du mit random nach dem Programmstart immer die selben Zahlen, bei Random nicht.

Welche Version benutzt du denn eigentlich? Den C++Builder gibt es ja nun schon einige Jahre, ich zumindest sitze hier vor XE 10. Könnte sein dass sich das ab einer bestimmten Version geändert hat.

ItzKray schrieb:
RGB hat funktioniert nur ist es nur schwarz,weiß,grau...
Kann eigentlich nicht sein. Ich habe den Code sogar noch getestet gehabt.
Hast du die Zeile genau so übernommen?

Code:
int A[2] = {200, 200}, B[2] = {200, 300}, C[2] = {350, 300};
void draw(TPaintBox *paintbox, TColor brushClr, TColor penClr)
{
	paintbox->Canvas->Brush->Color = clWhite;
	paintbox->Canvas->FillRect(TRect(0, 0, paintbox->Width, paintbox->Height));

	paintbox->Canvas->Pen->Color = penClr;
	paintbox->Canvas->MoveTo(A[0],A[1]);
	paintbox->Canvas->LineTo(B[0],B[1]);
	paintbox->Canvas->LineTo(C[0],C[1]);
	paintbox->Canvas->LineTo(A[0],A[1]);

	int Center[2];
	Center[0] = (A[0]+B[0]+C[0])/3;
	Center[1] = (A[1]+B[1]+C[1])/3;

	paintbox->Canvas->Brush->Color = brushClr;
	paintbox->Canvas->FloodFill(Center[0], Center[1], paintbox->Canvas->Pen->Color, fsBorder);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	A[0] = Random(PaintBox1->Width);
	A[1] = Random(PaintBox1->Height);
	B[0] = Random(PaintBox1->Width);
	B[1] = Random(PaintBox1->Height);
	C[0] = Random(PaintBox1->Width);
	C[1] = Random(PaintBox1->Height);

	TColor brushClr, penClr;
	penClr = TColor(RGB(Random(255), Random(255), Random(255)));
	brushClr = TColor(RGB(Random(255), Random(255), Random(255)));
	draw(PaintBox1, brushClr, penClr);
}
//---------------------------------------------------------------------------
Unbenannt.jpg
 

Ähnliche Themen

Zurück
Oben