PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java]Ausschnitt eines Arrays?


Arokh
2007-07-14, 00:58:07
Hi Leute,

ich hab mir mal vorgenommen, eine Teilchensimulation von C++ nach Java zu portieren. In C++ ist sie folgendermaßen aufgebaut: es gibt eine Klasse Particle für das einzelne Teilchen und eine Klasse ParticlesModel für die Gesamtheit aller Teilchen. Nun ist wichtig, daß für jedes Teilchen drei Orts- und drei Geschwindigkeitskoordinaten gespeichert werden. Dies habe ich dadurch realisiert, daß ParticlesModel als Member einen Pointer position auf ein Array mit 6*N Elementen hat, wobei N die Teilchenzahl ist. Da Ort und Geschwindigkeit eines jeden Teilchens auch in der zugehörigen Particle-Instanz verfügbar sein sollten, hat die Klasse Particle ebenfalls einen Pointer-Member position.

Um jetzt nicht immer zwischen ParticlesModel::position und Particle::position kopieren zu müssen, habe ich das einfach so gemacht, daß ich den Member position der i-ten Particle-Instanz auf ParticlesModel::position + 6*i gesetzt habe (position ist ja ein Pointer). D.h. die Orte und Geschwindigkeiten aller Teilchen sind nur einmal gespeichert, in einem dynamisch angelegten Array, auf das ParticlesModel::position zeigt, und der Member Particle::position zeigt auf die jeweils benötigte Stelle in diesem Array.

Und genau da ist das Problem beim Portieren: in Java gibt es keine Pointer. Es würde sich anbieten, ParticlesModel.position als double[] zu realisieren, aber ich frage mich ob es eine Möglichkeit gibt, in der Klasse Particle einen Member zu realisieren, der auf den benötigten Ausschnitt zwischen dem (6*i)-ten und (6*i+5)-ten Element von ParticlesModel.position verweist?

Bis jetzt ist mir nur die Idee gekommen, jeder Particle-Instanz einen Verweis auf ParticlesModel.position mitzugeben, zusammen mit einer int-Zahl particleID, die angibt, ab welchem Element - dem (particleID*6)-ten - des Arrays die Instanz die nachfolgenden Elemente als ihre Orts- und Geschwindigkeitskoordinaten betrachten soll.
Sonderlich eleganz finde ich diese Lösung aber nicht. Jemand ne andere Idee?

Xmas
2007-07-14, 03:27:14
Wie wäre es damit: ParticleModel besitzt ein Array/Liste/sonstiger Container von Particles, die jeweils Position und Geschwindigkeit beinhalten.

Wenn es unbedingt ein double-Array sein soll, kommst du um die Methode mit Array-Referenz und Index (wobei du natürlich gleich *6 speichern kannst) kaum herum.

Allerdings stellt sich mir auch die Frage ob Particle überhaupt eine eigene Klasse sein muss oder du die Methoden in ParticlesModel unterbringen kannst.

Monger
2007-07-14, 09:26:41
Warum klebst du denn überhaupt an diesem Array so fest? Hat das irgendwelche funktionalen Gründe?

Ich hab dich so verstanden, dass jedes Particle einen 3-dimensionalen Ortsvektor, und einen 3-dimensionalen Geschwindigkeitsvektor besitzt. Dann würde ich das auch genau so schreiben:


class Particle{

Vector3 location;
Vector3 speed;

}

Vector3 ist jetzt frei erfunden, aber dafür lässt sich ja schnell mal ne Klasse schreiben.

Wenn du in ParticleModel Daten über deine jeweiligen Particles haben willst, muss du sie halt fragen, d.h. einen entsprechenden Getter schreiben:


public Vector3 getParticleLocation(int index);

ParticleModel hält sich dabei sinnvollerweise irgendeine Collection von Particles.

Arokh
2007-07-14, 22:15:09
Warum klebst du denn überhaupt an diesem Array so fest? Hat das irgendwelche funktionalen Gründe?ja, hat es. Ich benutze ein numerisches Lösungsverfahren für die Bewegungsgleichung der Teilchen, um aus den aktuellen Positionen und Geschwindigkeiten die Positionen und Geschwindigkeiten im nächsten Zeitschritt zu berechnen, und dazu muß ich dem Verfahren diese Größen in einem gemeinsamen Array (physikalisch ausgedrückt entspricht das dem Ortsvektor im 6*N-dimensionalen Phasenraum) übergeben.
Würden die Teilchen nicht miteinander wechselwirken, könnte ich die Bewegungsgleichung für jedes Teilchen einzeln lösen, so aber geht es nur für alle zusammen.

huha
2007-07-14, 22:22:44
Wie wäre es denn, Particle als private Klasse in ParticleModel zu implementieren und ParticleModel das Array bereitzustellen, indem die Sache abläuft? Particle kriegt dann nur noch die Indizes seiner Daten im Array übergeben, was wohl so ziemlich deiner C-Sache entsprechen würde.

-huha