Entwickler-Ecke

Multimedia / Grafik - Kreis zeichnen


maxrus - Di 06.12.11 17:26
Titel: Kreis zeichnen
Hallo,


jetzt will ich im Programm einpaar zusätzliche Änderungen vornehmen, und zwar innerhalb des Viertekreises will ich rote Pixel rein regnen lassen und ausserhalb blaue. Irgendwie geht es wieder nicht?!!!!
Kann mir jemand sagen warum?

Das ist mein Programm


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
procedure TForm1.Button1Click(Sender: TObject);
var       x2,y2,j,xm,ym,x,y,x1,y1,r,anzahl_der_ecken,i:integer;
          winkel:double;
begin
  x:=image1.Width;
  y:=image1.Height;
  //xm:=x div 2;
  //ym:=y div 2;
  image1.Canvas.Brush.Color:=clwhite;
  image1.Canvas.FillRect(0,0,x,y);
  r:=99;
  anzahl_der_ecken:=1360;
  winkel:=(2*pi)/anzahl_der_ecken;

  for i:=0 to 360 do
  begin
  x1:=round(r*cos(winkel*i));
  y1:=round(r*sin(winkel*i));

  image1.Canvas.Pen.Color:=clgreen;
  //image1.Canvas.MoveTo(0,0);
  image1.Canvas.LineTo(x1,y1);
//-----------------------Ab hier gehts los mit Pixeln 
 if r<100 then
  begin
  application.ProcessMessages;
  x2:=random(300);
  y2:=random(300);
  image1.Canvas.Pixels[x2,y2]:=clred;
  end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

end.


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt


Gausi - Di 06.12.11 17:31

Das sollte gehen, indem du das MoveTo aus der Schleife rausnimmst. Dadurch gehst du mit dem Zeichenstift ja immer wieder zurück zum Mittelpunkt des Kreises, wenn ich das richtig sehe.


maxrus - Di 06.12.11 17:49

danke, hat geklappt


ub60 - Di 06.12.11 19:09

Übrigens gibt es dafür auch einen Befehl. Probiere doch mal


Delphi-Quelltext
1:
Arc(0020020010000100);                    

Den Rest zum Befehl findest Du in der Hilfe.

ub60


maxrus - Mi 07.12.11 14:54

user profile iconub60 hat folgendes geschrieben Zum zitierten Posting springen:
Übrigens gibt es dafür auch einen Befehl. Probiere doch mal


Delphi-Quelltext
1:
Arc(0020020010000100);                    

Den Rest zum Befehl findest Du in der Hilfe.

ub60






wir dürfen leider solche Befehle nicht benutzen :(


maxrus - Mi 07.12.11 17:29

Hallo,






jetzt will ich im Programm einpaar zusätzliche Änderungen vornehmen, und zwar innerhalb des Viertekreises will ich rote Pixel rein regnen lassen und ausserhalb blaue. Irgendwie geht es wieder nicht?!!!!
Kann mir jemand sagen warum?

PS: ein Teil der Aufgabe hab ich aus versehen gelöscht: das war ein viertelkreis im imagefeld zeichnen

---------------------------------------------------------------------
Das ist mein Programm



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
procedure TForm1.Button1Click(Sender: TObject);
var       x2,y2,j,xm,ym,x,y,x1,y1,r,anzahl_der_ecken,i:integer;
          winkel:double;
begin
  x:=image1.Width;
  y:=image1.Height;
  //xm:=x div 2;
  //ym:=y div 2;
  image1.Canvas.Brush.Color:=clwhite;
  image1.Canvas.FillRect(0,0,x,y);
  r:=99;
  anzahl_der_ecken:=1360;
  winkel:=(2*pi)/anzahl_der_ecken;


  for i:=0 to 360 do
  begin
  x1:=round(r*cos(winkel*i));
  y1:=round(r*sin(winkel*i));


  image1.Canvas.Pen.Color:=clgreen;
  //image1.Canvas.MoveTo(0,0);
  image1.Canvas.LineTo(x1,y1);
-----------------------------------------Ab hier gehts los mit Pixeln 
 if r<100 then
  begin
  application.ProcessMessages;
  x2:=random(300);
  y2:=random(300);
  image1.Canvas.Pixels[x2,y2]:=clred;
  end;
  end;
  


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

end.


Moderiert von user profile iconMartok: Quote- durch Delphi-Tags ersetzt


Holg_i - Mi 07.12.11 18:04

Da ich schon mal hier bin und verzweifelt nachschaue ob sich einer mein Problem annimt, möchte ich mal versuchen Dir zu helfen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
procedure TForm1.Button1Click(Sender: TObject); 
var x2,y2,j,xm,ym,x,y,x1,y1,r,anzahl_der_ecken,i:integer; 
    winkel:double; 

begin 
     x:=image1.Width; 
     y:=image1.Height; 
 
     image1.Canvas.Brush.Color:=clwhite; 
     image1.Canvas.FillRect(0,0,x,y); 
     r:=99
     anzahl_der_ecken:=1360
     winkel:=(2*pi)/anzahl_der_ecken; 

     for i:=0 to 360 do 
     begin 
          x1:=round(r*cos(winkel*i)); 
          y1:=round(r*sin(winkel*i)); 

          image1.Canvas.Pen.Color:=clgreen; 
          image1.Canvas.LineTo(x1,y1); 

          {**  Ab hier gehts los mit Pixeln **} 

          if r<100 then 
          begin 
               application.ProcessMessages; 
               x2:=random(300); 
               y2:=random(300); 
               image1.Canvas.Pixels[x2,y2]:=clred; 
          end
     end
end

procedure TForm1.Button2Click(Sender: TObject); 
begin 
     close; 
end

end.


Also zum einen Formatiere Deinen Code sauber so kann man es besser lesen und man behält den Überblick.

Zum anderen, ohne genau gelesen zu haben und Dir nur auf die Sprünge zu helfen. Was passiert mit deinem r????


maxrus - Mi 07.12.11 18:34

joa meine Code ist unsauber weil ich die ganze zeit was ausprobiere, da was löschen hier was einfügen usw.....


also zu r: ich habe mir das so gedacht wenn r<100 ist, dann setzt er mir rote pixel rein also im innenkreis, ansonsten blaue pixel also ausserhalb des kreises.

ich habe eine ähnliche aufgabe mit lösung gefunden, habe jetzt auch geschaft paar punkte zu setzen, aber ich verstehe die formel nicht.... das ist sowas wie phytagoras (aber ohne wurzel) : siehe kommentare



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
 for i:=0 to 360 do
  begin
   x1:=round(r*cos(winkel*i));
   y1:=round(r*sin(winkel*i));
   image1.Canvas.Pen.Color:=clgreen;
   image1.Canvas.LineTo(x1,y1);
   x2:=random(300);-------------->//wenn ich random größere oder kleinere zahl eintippe, dann zeichnet er mir auch nichts
   y2:=random(300);
   pyt:=(x2*x2)+(y2*y2);---------------->//Die zwei schritte verstehe ich nicht
  if pyt<=90000 then-------------------->// warum 90000?? wenn ich was anderes eintippe,zeichnet er mir nichts mehr
  begin
   application.ProcessMessages;
   image1.Canvas.Pixels[x2,y2]:=clred;
   label1.caption:=inttostr(image1.Canvas.Pixels[x2,y2]); ---->// Hier wollte ich anzahl pixel auslesen,klappt auch nicht
  end
  else
   image1.Canvas.Pixels[x2,y2]:=clblue;

   label2.caption:=inttostr(image1.Canvas.Pixels[x2,y2]);
  end;


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


Holg_i - Mi 07.12.11 18:53

Noch einmal meine Frage... was machst Du mit r in deinem Code?????

Schau Dir Dein Programm an nicht andere.


maxrus - Mi 07.12.11 19:21

user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:
Noch einmal meine Frage... was machst Du mit r in deinem Code?????

Schau Dir Dein Programm an nicht andere.



das ist der radius von meinem Kreis, oder was meinst du?


Holg_i - Mi 07.12.11 20:00

Einwenig solltest Du echt mitdenken. Du willst doch etwas lernen oder???

Also Du tippst:


Delphi-Quelltext
1:
r:=99                    


Und weiter unten schreibst du


Delphi-Quelltext
1:
2:
 if r<100 then  
 begin


Richtig???

Warum sollte r nicht kleiner als 100 sein. Bzw wie sollte r <>99 sein.


ub60 - Mi 07.12.11 21:09

Ich hoffe, den Pythagoras kennst Du:
a²+b²=c² :D
In Deinem Beispielquelltext ist der Radius mit maximal 300 angegeben (siehe Random), und 300²=90000.
Bei Deinem eigenen Programm muss hier natürlich wegen r=100 der Wert 10000 stehen. In den ersten Programmen fehlt die Berechnung von r komplett.

>joa meine Code ist unsauber weil ich die ganze zeit was ausprobiere
Gewöhne Dir doch einfach an, auch beim Probieren sauberen Code zu schreiben, dann verstehst Du es auch beim Probieren besser. :lol:
WIRKLICH! :roll:

ub60