Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kleine Kreise in einem Kreis darstellen (https://www.delphipraxis.net/81586-kleine-kreise-einem-kreis-darstellen.html)

turboPASCAL 29. Nov 2006 20:23


Kleine Kreise in einem Kreis darstellen
 
hi,

ja ich bi da nicht so im mathematischen, vill. kann mir da ja mal der eine oder andere aus der Miesere helfen.

Ich möchte kleine Keise bzw. was auch immer in einem Kreis also in dessen Umfang darstellen.

Code:
.   * *
    *   *
     * *
Diese sollen sich dann auch noch im Uhrzeigersinn drehen. Das soll dann so aussehen wie beim FF die Anzeige rechts oben.


Was fehlt ist nun, wie macht man's...

Phoenix 29. Nov 2006 20:28

Re: Kleine Kreise in einem Kreis darstellen
 
Also um einen Kreis zu zeichen such mal nach dem Bresenham-Algorithmus. Damit bekommst Du einen Kreis.

Wo Du die Kreise zeichnen musst (Punkte uaf der Kreislinie des grossen) bekommst Du damit auch raus.

Und das Drehen ist dann letzlich nur noch eine Frage des Füllens dieser Bereiche mit verschiedenen Farben.

Christian Seehase 29. Nov 2006 20:34

Re: Kleine Kreise in einem Kreis darstellen
 
Moin Matti,

so etwas könnte man auch als animated-Gif machen, oder ähnlich.
Bei IE sind das auch eine Reihe von Graphiken die einfach nacheinander dargestellt werden.

turboPASCAL 29. Nov 2006 20:54

Re: Kleine Kreise in einem Kreis darstellen
 
@Christian Seehase,

Ne, Gif's werden (kein support / unit dafür) nicht unterstützt. Das Programm wird dann noch nach C++ übersetzt was mir die Grössten sorgen macht. :mrgreen:

Also es muss "von Hand" gemacht werden.

@Phoenix,

Einen Kreis zu Zeichnen ist nicht das Prob. das geht mit Ellipse(DC, x1, y1, x2, y2);.

Es ist die Aufteilung auf dem Umpfang des Hauptkreises.

Beim Bresenham Algorithmus geht es doch um Geraden/Linien oder ?

ErazerZ 29. Nov 2006 21:01

Re: Kleine Kreise in einem Kreis darstellen
 
Zeichne doch selber die Kreise, und mache eine schöne "Form" mit den 5 Kreisen oder wieviele das sind. Dann einfach eine Prozedur z.b.
Delphi-Quellcode:
procedure ZeichneKreise(Anzahl: Byte; ...); { Anzahl = wieviele Grau sein sollten }
  procedure ZeichneKreis(Left, Top: Integer; ..)
  ..
  ..
  end;
begin
  for i := 0 to KreiseAnzahl -1 do
  begin
    if i <= Anzahl then
       { in grau }
   else
       { hell grau }
  end;
end;
und dann rufst immer die Funktion solange auf bis alles fertiggeladen worden ist.


Edit: Ah, zuspät gesehen das die Aufteilung dein problem ist.

Phoenix 29. Nov 2006 21:09

Re: Kleine Kreise in einem Kreis darstellen
 
Zitat:

Zitat von turboPASCAL
Beim Bresenham Algorithmus geht es doch um Geraden/Linien oder ?

Also ich hab mit nem Bresenham nen Kreis gezeichnet in der letzten Computergrafik-Übung ;-)

Khabarakh 29. Nov 2006 21:10

Re: Kleine Kreise in einem Kreis darstellen
 
An der Zeichnung kann ich nicht wirklich viel erkennen :stupid: . Geht es darum, n Kreise mit dem Radius r1 gleichmäßig innerhalb eines großen Kreises mit Radius r2 gleichmäßig zu verteilen, sodass jeder kleine Kreis den großen berührt, dann ist der Mittelpunkt des k-ten Kreises
(cos(k * 2 * Pi / n + Phi) * (r1 - r2) | sin(k * 2 * Pi / n + Phi) * (r1 - r2))
Phi kannst du dann für eine Drehung schrittweise erhöhen (eine Erhöhung um 2 * Pi / n bildet einen Kreis auf den nächsten ab).

turboPASCAL 29. Nov 2006 22:03

Re: Kleine Kreise in einem Kreis darstellen
 
Ich danke dir, ich hoffe mal das ich das nun korrekt umgesetzt habe.

Delphi-Quellcode:
implementation

{$R *.dfm}

var
  r1: single;
  r2: single;
  n: integer = 6;
  x, y: integer;

  Phi: single;

procedure TForm1.FormPaint(Sender: TObject);
var k: Integer;
begin
  Canvas.Brush.Color := Color;
  Canvas.FillRect(ClientRect);
  Canvas.Pen.Color := clGray;
  Canvas.Ellipse(200-60, 200-60, 200+60, 200+60);

  Canvas.Pen.Color := clRed;
  Canvas.Brush.Color := clRed;
  for k := 0 to n do
  begin
    x := round( cos(k * 2 * Pi / n + Phi) * (r1 - r2) );
    y := round( sin(k * 2 * Pi / n + Phi) * (r1 - r2) );

    Canvas.Ellipse(200+x-5,200+y-5,200+x+5,200+y+5);
  end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Phi < (2 * Pi) - 0.1 then Phi := Phi + 0.1 else Phi := 0.0;
  invalidate;
end;

end.
Und es dreht sich doch... :mrgreen:

LH_Freak 11. Feb 2007 13:08

Re: Kleine Kreise in einem Kreis darstellen
 
Weiß nich obs jemanden interessiert, aber ich hab das ganze mal so modifiziert dass es wirklich aussieht wie beim firefox, also dass sich nicht die kreise drehen sondern nur die farben sich verändern...ziemlich cooler effekt...

Delphi-Quellcode:
var
  r1: single = 1;
  r2: single = 10;
  n: integer = 8;
  x, y: integer;
  col1,col2,col,steps: integer;

procedure TForm1.FormPaint(Sender: TObject);
var k: Integer;
begin
  Canvas.Brush.Color := Color;
  Canvas.FillRect(ClientRect);

  for k := 0 to n do
  begin
    Canvas.Pen.Color := rgb(col,col,col);
    Canvas.Brush.Color := rgb(col,col,col);

    x := round( cos(k * 2 * Pi / n) * (r1 - r2) );
    y := round( sin(k * 2 * Pi / n) * (r1 - r2) );

    Canvas.Ellipse(200+x-3,200+y-3,200+x+3,200+y+3);
    col := col - steps;
    if col >= col2 then col := col1;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  invalidate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  doublebuffered := true;

  col1 := getrvalue(clgray);
  col2 := getrvalue(clsilver);
  steps:= round((col1 - col2) / n);
  col := col1;
end;
Vll. brauchts ja mal jemand ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz