Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Objekte auf Ringen anordnen


Martok - So 04.02.07 04:13
Titel: Objekte auf Ringen anordnen
Für alle die sich jetzt fragen: "Hä, was will der?": ich versteh euch... ;)

Und zwar habe ich eine Liste von Objekten. Diese möchte ich auf konzentrischen Kreisen anordnen, ausgehend von der Mitte. Wie viele Kreise ich für eine bestimmte Anzahl Objekte brauche, habe ich schon.
Nur kriege ich das dann nicht hin, für jedes Objekt die X/Y-Koordinaten auszurechnen. Mein Problem ist der Algorithmus, nicht (jedenfalls noch nicht) die Implementierung. Die Objekte landen immer irgendwo, nur nicht wo sie hinsollen.

Falls mir jemand helfen kann, ich habe:


(Verdammt. Den bisherigen Code hab ich schon entnervt gelöscht... War aber eh nichts schönes...)

Danke schonmal,
Sebastian


ssb-blume - So 04.02.07 10:49

ganz einfach:

fuer jeden Kreis fuer jedes Objekt die Position ermitteln:
der Teil-Winkel ist 2*PI/Anzahl der Objekte.

dann ist fuer jedes Objekt die X- und y-Koordinate und der Winkel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var
  i: integer;
  n: integer; // Anzahl Objekte
  r: real;    // Radius des Kreises
  w: read;    // Winkel 
  x, y: integer;   // Position  des Objektes
  rx, ry: integer; // Position des Mittelpunktes aller Kreise
  for i:=0 to n-1 do
  begin
    w:=i*2*pi/n;
    x:=rx+round(r*cos(w));
    y:=ry+round(r*sin(w));
    // hier auf position x,y Objekt zeichnen!
  end;


Martok - So 04.02.07 15:20

Das ist der Code, wenn ich nur einen Ring habe. Soweit ist das ja einfach.

Das Problem ist ja der "Umbruch", wenn ein Ring voll ist, bzw. die Tatsache, dass solche existieren.


Allesquarks - So 04.02.07 15:31

Zu wenig information!!!!

Was willst du tun?????
1. Wie viele Objekte passen auf einen Kreis, ist das abhängig von der Größe der Objekte selbst
2. Abstand der Kreise Radius etc.


azubi_20 - So 04.02.07 15:37

user profile iconAllesquarks hat folgendes geschrieben:
Zu wenig information!!!!

Was willst du tun?????
1. Wie viele Objekte passen auf einen Kreis, ist das abhängig von der Größe der Objekte selbst
2. Abstand der Kreise Radius etc.


ganz ruhig, deine Fragen sind doch schon beantwortet :

user profile iconMartok hat folgendes geschrieben:
Für alle die sich jetzt fragen: "Hä, was will der?": ich versteh euch... ;)

Falls mir jemand helfen kann, ich habe:
  • Anzahl_Objekte
  • Anzahl_Kreise
  • Für jeden Kreis:
    • Radius
    • Anzahl_Objekte/Kreis





einfach mal lesen ... :-)


Martok - So 04.02.07 15:38

user profile iconAllesquarks hat folgendes geschrieben:
Zu wenig information!!!!

Was willst du tun?????
1. Wie viele Objekte passen auf einen Kreis, ist das abhängig von der Größe der Objekte selbst
2. Abstand der Kreise Radius etc.

Das habe ich beides schon ausgerechnet.
Das Problem ist jetzt, die Objekte auf die Ringe zu verteilen.

Da gibt es ja 2 grundsätzliche Ansätze:

Quelltext
1:
2:
Für jeden Ring:
  Elemente Positionieren auf Radius_von(KreisNr)

oder

Quelltext
1:
2:
3:
Für jedes Objekt:
  Kreis feststellen
  Positionieren

Das Problem ist bei beiden die Feststellung "Ring ist voll, nächster".

Eine Idee hab ich da grade, mal sehen, ob das geht...


Allesquarks - So 04.02.07 15:56

Naja das hab ich auch schon gesehen aber das ist mir irgendwie zu abstrakt. Ich hab immer gern die Regel.

Ein Objekt muss auf einen neuen Kreis, wenn seine Nummer größer ist als die Summe der Anzahl Objekte der bisherigen Kreise.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
while Objectindex>neuerkreis
do begin
   inc(kreisindex);
   alterkreis:=neuerkreis;
   neuerkreis:=neuerkreis+naechsterkreis.anzahl;
end;

so in etwa. Aber wie gesagt ich habe nicht wirklich den Plan was du tun möchtest.

willst du das iterativ machen oder evt. auch das 10 Objekt als zweites zeichnen.

Hast du schon eine Zeichnen routine für deine Objekte?


Martok - So 04.02.07 16:15

user profile iconAllesquarks hat folgendes geschrieben:
Hast du schon eine Zeichnen routine für deine Objekte?

Jup, ist OpenGL. Das steht auch alles soweit, bisher hatte ich alles auf einem Ring, der dann entsprechend einen größeren Radius erhält. Das fand ich aber nicht so toll, wegen Platzverschwendung innen.

Den Rest hab ich ehrlich gesagt nicht verstanden...

@Löschen: du gar nicht, Beitrag melden und ganz lieb fragen ;)

Ich hab jetzt das. Das Problem ist, die Abstände auf dem 2. Kreis passen nicht (->Anhang)...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  rng:= 0;
  c:= 0;
  s:= 0;
  for i:= 0 to Count-1 do begin
    if (rng=0or (c>=Per_Ring(rng)) then begin
      c:= 0;
      inc(rng);
      m:= Per_Ring(rng);
      m:= Min(m,Count-c);
      s:= 2*pi / m;
      DIST:= Ring_Rad(rng);
    end;

    a:= s * i;
    TglMenuIcon(Icons[i]).Position:= To_V2D(Center.X + cos(a)*DIST,
                                            Center.Y + sin(a)*DIST);
    inc(c);
  end;


(Am Design mach ich noch was, der Kontrast ist etwas schlecht...)


Allesquarks - So 04.02.07 16:26

Also seh ich das richtig, dass du nur den neuen Mittelpunkt übergeben musst ne.

Sind die Objekte denn alle gleich weit voneinander entfernt angeordnet? Dann nämlich:

phase:=2 pi / Anzahl pro kreis*(Objektindex-volleschalencount);

deltax:=cos(phase)*Radius;
deltyy:=sin(phase)*Radius;

volleschalencount entspricht alterkreis


Blawen - So 04.02.07 16:29

Ev. von Interesse:
http://www.dsdt.info/programmierwettbewerb.php, bzw.
http://www.dsdt.info/projekte/grafik/?id=47


Martok - So 04.02.07 17:35

AllesQuarks, das ist alles Quark ;)
Das hab ich doch so schon drin...

Geht jetzt übrigens. Das wäre ihr Preis gewesen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  rng:= 0;
  c:= 0;
  s:= 0;
  for i:= 0 to Count-1 do begin
    if (rng=0or (c>=Per_Ring(rng)) then begin
      inc(rng);
      m:= Per_Ring(rng);
      m:= Min(m,Count-c);
      s:= 2*pi / m;
      DIST:= Ring_Rad(rng);
    end;

    a:= s * i;
    TglMenuIcon(Icons[i]).Position:= To_V2D(Center.X + cos(a)*DIST,
                                            Center.Y + sin(a)*DIST);
    inc(c);
  end;


Ein Problem ist jetzt natürlich, das hatte ich gar nicht bedacht: ich habe jetzt Ring 1 mit 13 Elementen, und Ring 2 mit 1-4 Elementen. Sieht doof aus ;) Wie kann man das noch Balancieren?


Jetstream - So 04.02.07 17:49

Du könntest dir die Anzahl der Objekte pro Ring einfach selbst ausrechnen aus der Anzahl der Objekte und Ringe :)


Martok - So 04.02.07 17:56

Ist natürlich doof, weil ich die Anzahl der Ringe aus der Anzahl der Objekte/Ring und der Anzahl der Objekte berechne...

Hm, ich geh erstmal Handball gucken ;)


Martok - Mo 05.02.07 04:22

Das ist doch alles Müll.
Ich hab das jetzt mal in ein Beispiel-Programm gepackt. Ich würde mich freuen, wenn sich das jemand angucken könnte. Auch vom Anordnungs-Konzept her bin ich für alles offen ;)

Derjenige, der den Platz Kreisförmig am besten ausnutzt, kriegt...ähm ja, was eigentlich... :idea: eine Erwähnung in der About-Box ;)


Martok - Mo 05.02.07 20:07

Jetzt fang ich schon an, mit mir selbst zu reden...

Irgendwie kann man das jetzt als abgeschlossen bezeichnen, auch wenn meine Lösung nicht schön ist...
Falls jemand dran arbeitet, ich nehms also trotzdem gern.