Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rectangles Kreisförmig anordnen (https://www.delphipraxis.net/76633-rectangles-kreisfoermig-anordnen.html)

chrisw 7. Sep 2006 10:02


Rectangles Kreisförmig anordnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo..., folgendes Problem :

Ich möchte Rectangles(rechtecke) einer veränderlichen Größe und Anzahl (abhängig von TextFont und TextLäange)um einen Mittelpunkt herum Kreis- bzw Ellipsenförmig anordnen. (siehe Beispiel im Anhang)

Bekannt sind:
Height des Rectangle (Canvas.Textheight);
Width des Rectangles (Canvas.TextWidth);
Breite und Hoehe der Ellipse in Pixel
X,Y Koordinaten des Mittelpunktes.
Der Abstand zwischen den Rectangles (Beispielsweise 4 Pixel)

Kennt jemand einen Algorithmus, mit dem man das relativ einfach bewerkstelligen kann ?


Danke im vorraus


Chris

Nikolas 7. Sep 2006 11:02

Re: Rectangles Kreisförmig anordnen
 
Nimm dir die Ellipsengleichung (x^2/a^2+y^2/b^2=1, wobei a und b die Halbachsen bezeichnen). Die Gleichung löst du dann nach x auf. Dieser Gleichung übergibst du dann als erstes den obersten y-Wert deiner ellipse zuzüglich einer Rectangle-Höhe. Die Gleichung gibt dir dann zwei Lösungen aus, einmal die linke Ecke des Rectangles rechts von der Ellipse und die rechte Ecke des ersten Rects links davon. Nach links und rechts weiterzeichnen sollte dann kein Problem sein. Dann übergibst du der Gleichung den obersten Wert deiner ellipse zuzüglich zweier rect-Höhen usw.

So sollte es grob funktionieren. Wie du das Koordinatensystem am Besten legst, kannst du noch in der Wikipedia nachlesen.
Für die rects rechts von der Ellipse liegt jetzt immer die linke obere Ecke auf der Ellipse und die untere linke innerhalb oder ausserhalb, so dass es wahrscheinlich besser ist, der aufgelösten Ellipsengleichung immer die y-Koordinate der Mitte des linken Randes zu übergeben, dann sollte es runder aussehen.

chrisw 7. Sep 2006 11:51

Re: Rectangles Kreisförmig anordnen
 
Mmmh, vielleicht könntest Du etwas mehr ins Detail gehen ?

Nikolas 7. Sep 2006 16:38

Re: Rectangles Kreisförmig anordnen
 
Wo liegt denn genau dein Problem? Was hast du verstanden/nicht verstanden, wo sind grundlegende Schwierigkeiten?

Nikolas 7. Sep 2006 19:12

Re: Rectangles Kreisförmig anordnen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Also. Auch wenn ich hier das gesamte Problem löse, ich musste mich etwas vom Uni-Zeug ablenken...

schau die mal die Grafik an. Die rote Länge bezeichne ich als a, die blaue als b. Wie in der Wikipedia gezeigt wird, kann man diese Ellipse so schreiben: Alle Punkte (x,y) die folgende Gleichung erfüllen bilden die Ellipse:
x²/a²+y²/b²=1.
(man sieht hier auch sehr schön für a^2=b^2=r^2, dass der Kreis ein Spezialfall einer Ellipse ist, nämlich als Schnitt des Kegels senkrecht zur Rotationsachse)

Das kann man dann nach x auflösen: x = +/- sqrt( ( 1-(y^2/b^2) ) *a^2 ). Für jeden Wert für y findet man also zwei x-passende x-Werte, was nicht so verwundert, wenn man sich die Symetrie der Ellipse anschaut. Jedoch muss hier Sorge getragen werden, dass y^2/b^2 kleiner gleich 1 bleibt, da es sonst komplex wird.

Jetzt geht man einfach die passenden Werte für y durch (-b bis b) und bekommt die passenden x-Werte geliefert. Für die Kästchen rechts des Ellipse nimmt man das positive Ergebniss für die x-Koordinate der linken Ecken, bei denen links die negativen für die rechten. (alles klar?)

Delphi-Quellcode:
var
a,b,x,y,mx,my,h,dh,i,dx,w: integer;
begin
b:= 250; // blau
a:= 150; // rot

h:= 10; // Höhe der Rechtecke
w:= 25; // Länge der Rechtecke

dh:=5;  //  vertikaler Abstand zwischen den Rechtecken
dx:=5;  //  horizontaler Abstand zwischen den Rechtecken

mx:=250; // Mittelpunkt der Ellipse
my:=250;

{ form1.Canvas.Brush.Style:= bssolid;
form1.Canvas.Brush.Color:= clgreen; }

y:=-b;
while y<=b do
begin
 x:= round( sqrt( (1-(y*y)/(b*b)) * (a*a) ) );

 for i:=0 to 4 do
   begin
   // nach rechts weg:
   form1.Canvas.Rectangle(mx+x+i*(dx+w),my+y,mx+x+w+i*(dx+w),my+y+h);
   // von links her;
   form1.Canvas.Rectangle(mx-(x+i*(dx+w)),my+y,mx-(x+w+i*(dx+w)),my+y+h);
   end;
 inc(y,h+dh);
end;

chrisw 8. Sep 2006 07:18

Re: Rectangles Kreisförmig anordnen
 
Danke, das war genau das, was ich gesucht habe ! (You are my local hero)


CU
Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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