![]() |
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... |
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. |
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. |
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 ? |
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:
und dann rufst immer die Funktion solange auf bis alles fertiggeladen worden ist.
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; Edit: Ah, zuspät gesehen das die Aufteilung dein problem ist. |
Re: Kleine Kreise in einem Kreis darstellen
Zitat:
|
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). |
Re: Kleine Kreise in einem Kreis darstellen
Ich danke dir, ich hoffe mal das ich das nun korrekt umgesetzt habe.
Delphi-Quellcode:
Und es dreht sich doch... :mrgreen:
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. |
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:
Vll. brauchts ja mal jemand ^^
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz