AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rectangles Kreisförmig anordnen

Ein Thema von chrisw · begonnen am 7. Sep 2006 · letzter Beitrag vom 8. Sep 2006
Antwort Antwort
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#1

Rectangles Kreisförmig anordnen

  Alt 7. Sep 2006, 11:02
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
Angehängte Grafiken
Dateityp: bmp beispiel_168.bmp (88,3 KB, 80x aufgerufen)
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

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

Re: Rectangles Kreisförmig anordnen

  Alt 7. Sep 2006, 12:02
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#3

Re: Rectangles Kreisförmig anordnen

  Alt 7. Sep 2006, 12:51
Mmmh, vielleicht könntest Du etwas mehr ins Detail gehen ?
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

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

Re: Rectangles Kreisförmig anordnen

  Alt 7. Sep 2006, 17:38
Wo liegt denn genau dein Problem? Was hast du verstanden/nicht verstanden, wo sind grundlegende Schwierigkeiten?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
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, 20: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
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#6

Re: Rectangles Kreisförmig anordnen

  Alt 8. Sep 2006, 08:18
Danke, das war genau das, was ich gesucht habe ! (You are my local hero)


CU
Chris
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 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