Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 16:48

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 10, 2008 18:15 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Hi,
Ich arbeite gerade an einer eigenen Version von Boids(http://de.wikipedia.org/wiki/Boids). Welche Überraschung: das ganze ist mit OpenGL gemacht, aber in java. Wie schon in einem vorherigen Thread geklärt, arbeitet der Pseudocode(http://www.vergenet.net/~conrad/boids/pseudocode.html) von Boids mit Vektoren. Ich habe das etwas anders, weniger streng auf Vektoren bezogen umgesetzt. Die Animation läuft (daher bin ich mir nicht sicher, ob dies das richtige Forum ist), nur die Boids verhalten sich nicht so,wie sie sollen.
Der Code für die drei Regeln sieht wie folgt aus:
Code:
  1.    //otherBoids ist ein array, welches alle Boids enthält
  2. private double[] calcSeperation()
  3.    {
  4.       double pos[] = {0,0};
  5.      
  6.       for (int i = 0; i < otherBoids.length; i++)
  7.       {
  8.          if (otherBoids[i] != null)
  9.          {
  10.             if (this == otherBoids[i]) continue;
  11.                                 // schauen welche Boids im Bereich sind
  12.             if (calcDistance(otherBoids[i]) < getRadius())
  13.             {
  14.                pos[0] = pos[0] + otherBoids[i].calcNextXPos(); //calcNextPos berechnet die nächste Position des Boid
  15.                pos[1] = pos[1] + otherBoids[i].calcNextYPos();
  16.             }
  17.          }
  18.       }
  19.  
  20.       pos[0] = pos[0]*SEPERATION; //Konstante für die Gewichtung
  21.       pos[1] = pos[1]*SEPERATION;
  22.      
  23.       return pos;
  24.    }
  25.    
  26.    private double[] calcCohesion()
  27.    {
  28.       double pos[] = {0,0};
  29.       int boidCnt = 0;
  30.      
  31.       for (int i = 0; i < otherBoids.length; i++)
  32.       {
  33.          if (otherBoids[i] != null)
  34.          {
  35.             if (this == otherBoids[i]) continue;
  36.             if (calcDistance(otherBoids[i]) < getRadius())
  37.             {
  38.                pos[0] = pos[0] + otherBoids[i].calcNextXPos();
  39.                pos[1] = pos[1] + otherBoids[i].calcNextYPos();
  40.                boidCnt++;
  41.             }
  42.          }
  43.       }
  44.      
  45.       if (boidCnt != 0)pos[0] = (pos[0]*COHESION)/boidCnt;
  46.       if (boidCnt != 0)pos[1] = (pos[1]*COHESION)/boidCnt;
  47.      
  48.       return pos;
  49.    }
  50.    
  51.    private double calcAligment()
  52.    {
  53.       double speed = 0;
  54.       int boidCnt = 0;
  55.      
  56.       for (int i = 0; i < otherBoids.length; i++)
  57.       {
  58.          if (otherBoids[i] != null)
  59.          {
  60.             if (this == otherBoids[i]) continue;
  61.             if (calcDistance(otherBoids[i]) < getRadius())
  62.             {
  63.                speed = speed + otherBoids[i].getSpeed();
  64.                boidCnt++;
  65.             }
  66.          }
  67.       }
  68.      
  69.       if (boidCnt == 0) speed = getSpeed();
  70.       else speed = speed/boidCnt;
  71.      
  72.       return speed;
  73.    }
  74.    
  75.    private void boidRules()
  76.    {
  77.       double XPos = 0;
  78.       double YPos = 0;
  79.       double pos[] = {0,0};
  80.      
  81.       pos = calcCohesion();
  82.       XPos = XPos + pos[0];
  83.       YPos = YPos + pos[1];
  84.      
  85.       pos = calcSeperation();
  86.       XPos = XPos + pos[0];
  87.       YPos = YPos + pos[1];
  88.      
  89.       setSpeed(calcAligment());
  90.      
  91.       if (XPos != 0 || YPos != 0) setAngle(Math.toDegrees((Math.atan(Math.abs(YPos - getYPos())/Math.abs(XPos - getXPos()))))); //setzt den Winkel mit tan^-1
  92.    }


Das Verhalten ist relativ schwer zu beschreiben, aber aufkeinen Fall so wie es sein soll^^. Da ich nun schon ziemlich lange vor dem Code sitze, da ich viele Grundlage wie Animation etc. erst noch programmieren musste, sehe ich Fehler kaum noch bzw. sehen den Code anders als ihr es vielleicht tut. Also habt ihr eine Idee, woran es liegt, dass es nicht so funktioniert wie es soll?

Danke!


Zuletzt geändert von Pille456 am Fr Apr 11, 2008 06:57, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 10, 2008 23:15 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gehen alle(!) anderen Boids in die Berechnung ein? Ich dachte da werden nur die in die Berechnung einbezogen, die im direkten Umfeld liegen?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 11, 2008 06:57 
Offline
DGL Member

Registriert: Sa Dez 30, 2006 17:01
Beiträge: 22
Wohnort: NRW/Fröndenberg
Ja nur die im Umfeld. Das realisier ich, indem ich mir einen virtuellen Kreis um die Boids anlege und dann die Distanz zwischen zwei Boids berechne. Wenn die Distanz kleiner ist, dann ist der Boid in Reichweite.
Hab einen fehler schonmal gefunden, ein kleiner als war größer als. Aber das half auch nichts ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]