Einzelnen Beitrag anzeigen

Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Rectangles Kreisförmig anordnen

  Alt 7. Sep 2006, 19:12
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;
Miniaturansicht angehängter Grafiken
unbenannt_427.jpg   unbenannt2_114.jpg  
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat