Hallo Community,
ich hab ein Problem. Und zwar muss ich ein Fadenpendel simulieren.(mit Java3D) Das ganze sieht so aus, dass ein Punkt auf einem Koordinatensystem liegt, der sich nicht bewegen kann. An diesem wird der Faden befestigt und auf der anderen Seite des Fadens ist ein zweiter Punkt, der wiederum bewegt werden kann.
Die Bewegungen werden durch programmierte Kräfte simuliert (wie in Physik). In der Schule haben wir z.B. eine Feder programmiert, was dazu führte, dass der 2. Punkt Durch Schwerkraft und durch die Feder hin und her "schwingt" - wie in echt halt auch.
Mein Problem: Ich hab keine Idee wie ich diesen Faden von der Logik her programmieren soll. Ich hab schon versucht die Feder mit sehr sehr hoher Federhärte als Faden zu betrachten, aber das ist zu ungenau und schwingt trotzdem noch ein bisschen hoch und runter.
Hat jemand eine Idee wie ich einen Faden rein von der Logik her überhaupt programmieren könnte?
Hier mal den Text von der Feder:
[JAVA=42]
package basisklassen;
/**
* Zwischen zwei Massepunkten ist eine Feder angebracht.<br>
* Die Feder ist masselos und kann in Abhängigkeit von ihrer Nulllänge, der Federhärte und ihrer aktuellen
* Dehnung den Massepunkten die wirkende Kraft mitteilen.<br>
* Gerade wegen der Masselosigkeit der Feder ist sie auch bestens dafür geeignet,
* andere Kräfte wie Gravitation oder Coulombkraft zu simulieren.
*
* @author **********
* @version 1.0 (9.12.2012)
*/
public class Feder {
private double D = 0;
private double l0 = 0;
private Massenpunkt m1;//Massenpunkt: Die Punkte, die im Koordinatensystem sind.(eigene Klasse)
private Massenpunkt m2;
private Vektor F = new Vektor(); // eigene Klasse, dient für die Erstellung von Punkten im Koord.-Sys.
double l;
double ds;
/**
* Eine neue Feder wird erzeugt.<br>
* Diese hat eine Federhärte (in N/m), eine Nulllänge (in m) einen Anfangspunkt und einen Endpunkt, wobei egal ist, welcher welcher ist.
*
* @param _D Federhärte
* @param _l0 Nulllänge
* @param _m1 Anfangspunkt
* @param _m2 Endpunkt
*/
public Feder(double _D, double _l0, Massenpunkt _m1, Massenpunkt _m2) {
D = _D;
l0 = _l0;
m1 = _m1;
m2 = _m2;
}
public double getl0(){
return l0;
}
/**
* Die passenden Kräfte wirken auf die beiden Massenpunkte.
*
* @see Massenpunkt
*/
public void KraefteWirken() {
// Bestimme den Richtungsvektor: (m2 - m1) und die Länge davon.
F.set(m2.getX());
F.Subtrahiere(m1.getX());
l = F.Laenge();
// Jetzt nur Richtung des Vektors von m1 nach m2 merken:
F.Normieren();
// Dehnung berechnen.
// Die ist positiv, wenn die Feder länger als l0 ist.
// Dann wird m2 herangezogen (also -r) und m1 auch (also +r).
// Dehnung ist negativ, wenn die Feder kürzer als l0 ist.
// Dann wird m2 abgestoßen (also +r) und m1 auch (also -r).
// Also wie "positiv" denken, den Rest macht das Vorzeichen von ds!
ds = l - l0;
F.MultipliziereZahl(ds);
F.MultipliziereZahl(D);
// Das ist nun offensichtlich die Kraft auf die Masse 1:
m1.F_wirkt(F);
// umgekehrte Kraft auf die Masse 2:
F.Gegenvektor();
m2.F_wirkt(F);
}
}
[/code]
Ich hab mir schon überlegt, dass ich irgendwie die Dehnung so machen muss, dass sie immer 1 (also keine Dehnung) ist. Aber das klappt irgendwie nicht.
Vielen Dank im vorraus
ich hab ein Problem. Und zwar muss ich ein Fadenpendel simulieren.(mit Java3D) Das ganze sieht so aus, dass ein Punkt auf einem Koordinatensystem liegt, der sich nicht bewegen kann. An diesem wird der Faden befestigt und auf der anderen Seite des Fadens ist ein zweiter Punkt, der wiederum bewegt werden kann.
Die Bewegungen werden durch programmierte Kräfte simuliert (wie in Physik). In der Schule haben wir z.B. eine Feder programmiert, was dazu führte, dass der 2. Punkt Durch Schwerkraft und durch die Feder hin und her "schwingt" - wie in echt halt auch.
Mein Problem: Ich hab keine Idee wie ich diesen Faden von der Logik her programmieren soll. Ich hab schon versucht die Feder mit sehr sehr hoher Federhärte als Faden zu betrachten, aber das ist zu ungenau und schwingt trotzdem noch ein bisschen hoch und runter.
Hat jemand eine Idee wie ich einen Faden rein von der Logik her überhaupt programmieren könnte?
Hier mal den Text von der Feder:
[JAVA=42]
package basisklassen;
/**
* Zwischen zwei Massepunkten ist eine Feder angebracht.<br>
* Die Feder ist masselos und kann in Abhängigkeit von ihrer Nulllänge, der Federhärte und ihrer aktuellen
* Dehnung den Massepunkten die wirkende Kraft mitteilen.<br>
* Gerade wegen der Masselosigkeit der Feder ist sie auch bestens dafür geeignet,
* andere Kräfte wie Gravitation oder Coulombkraft zu simulieren.
*
* @author **********
* @version 1.0 (9.12.2012)
*/
public class Feder {
private double D = 0;
private double l0 = 0;
private Massenpunkt m1;//Massenpunkt: Die Punkte, die im Koordinatensystem sind.(eigene Klasse)
private Massenpunkt m2;
private Vektor F = new Vektor(); // eigene Klasse, dient für die Erstellung von Punkten im Koord.-Sys.
double l;
double ds;
/**
* Eine neue Feder wird erzeugt.<br>
* Diese hat eine Federhärte (in N/m), eine Nulllänge (in m) einen Anfangspunkt und einen Endpunkt, wobei egal ist, welcher welcher ist.
*
* @param _D Federhärte
* @param _l0 Nulllänge
* @param _m1 Anfangspunkt
* @param _m2 Endpunkt
*/
public Feder(double _D, double _l0, Massenpunkt _m1, Massenpunkt _m2) {
D = _D;
l0 = _l0;
m1 = _m1;
m2 = _m2;
}
public double getl0(){
return l0;
}
/**
* Die passenden Kräfte wirken auf die beiden Massenpunkte.
*
* @see Massenpunkt
*/
public void KraefteWirken() {
// Bestimme den Richtungsvektor: (m2 - m1) und die Länge davon.
F.set(m2.getX());
F.Subtrahiere(m1.getX());
l = F.Laenge();
// Jetzt nur Richtung des Vektors von m1 nach m2 merken:
F.Normieren();
// Dehnung berechnen.
// Die ist positiv, wenn die Feder länger als l0 ist.
// Dann wird m2 herangezogen (also -r) und m1 auch (also +r).
// Dehnung ist negativ, wenn die Feder kürzer als l0 ist.
// Dann wird m2 abgestoßen (also +r) und m1 auch (also -r).
// Also wie "positiv" denken, den Rest macht das Vorzeichen von ds!
ds = l - l0;
F.MultipliziereZahl(ds);
F.MultipliziereZahl(D);
// Das ist nun offensichtlich die Kraft auf die Masse 1:
m1.F_wirkt(F);
// umgekehrte Kraft auf die Masse 2:
F.Gegenvektor();
m2.F_wirkt(F);
}
}
[/code]
Ich hab mir schon überlegt, dass ich irgendwie die Dehnung so machen muss, dass sie immer 1 (also keine Dehnung) ist. Aber das klappt irgendwie nicht.
Vielen Dank im vorraus