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;
Erwarte das Beste und bereite dich auf das Schlimmste vor.