Hallo,
momentan versuche ich ein kleines 2D-Spiel zu programmieren, wo man mit nem Raumschiff durchs Weltall fliegt. Jetzt versuche ich umzusetzen, dass sich das Raumschiff entlang einer Route bewegt, die durch eine ganzrationale Funktion definiert ist.
Mein Ansatz bis jetzt:
Das Raumschiff hat eine gewisse Geschwindigkeit. Jetzt möchte ich wissen, wo genau das Raumschiff nach einer bestimmten Zeit ist. Dazu habe ich die Länge des Funktionsgraphen (s = v*t) gegeben. Daraus muss ich jetzt den x-Wert der Funktion bestimmen. Ich habe herausbekommen, dass die Länge des Graphens folgendermaßen definiert ist:
Integral[Länge des Graphen] = Integral[(sqrt(1+f'(x)^2) dx]
Die Funktion beschreibe ich mit einem Array der Faktoren, ein Beispiel:
f(x) = 2x^2 + 0.5 --> factors[0] = 0.5 ; factors[1] = 0 ; factors[2] = 2
Die Faktoren sind also für die jeweiligen Exponenten gespeichert: factors * x ^ i
Ich habe bereits die Methoden zum Ableiten, Stammfunktion (mit c = 0) bilden, den y-Wert berechnen und Funktionsterm quadrieren geschrieben und diese scheinen zu funktionieren. Jetzt habe ich das Problem, dass ich keine Ahnung habe, wie ich die Wurzel aus einem Funktionsterm ziehe. Dazu bräuchte ich soweit ich weiß sowas wie ne quadratische Ergänzung für Polynome. Ich dachte, dass mir hier vielleicht jemand von euch helfen könnte.
Falls ihr euch die Klasse mal anschauen wollt:
Ist mein Ansatz vielleicht Falsch? Gibt's da was einfacheres?
Ich bin für Vorschläge offen
Falls es Probleme damit gibt meinen Ansatz zu verstehen sag bescheid, dann werde ich das versuchen zu illustrieren.
momentan versuche ich ein kleines 2D-Spiel zu programmieren, wo man mit nem Raumschiff durchs Weltall fliegt. Jetzt versuche ich umzusetzen, dass sich das Raumschiff entlang einer Route bewegt, die durch eine ganzrationale Funktion definiert ist.
Mein Ansatz bis jetzt:
Das Raumschiff hat eine gewisse Geschwindigkeit. Jetzt möchte ich wissen, wo genau das Raumschiff nach einer bestimmten Zeit ist. Dazu habe ich die Länge des Funktionsgraphen (s = v*t) gegeben. Daraus muss ich jetzt den x-Wert der Funktion bestimmen. Ich habe herausbekommen, dass die Länge des Graphens folgendermaßen definiert ist:
Integral[Länge des Graphen] = Integral[(sqrt(1+f'(x)^2) dx]
Die Funktion beschreibe ich mit einem Array der Faktoren, ein Beispiel:
f(x) = 2x^2 + 0.5 --> factors[0] = 0.5 ; factors[1] = 0 ; factors[2] = 2
Die Faktoren sind also für die jeweiligen Exponenten gespeichert: factors * x ^ i
Ich habe bereits die Methoden zum Ableiten, Stammfunktion (mit c = 0) bilden, den y-Wert berechnen und Funktionsterm quadrieren geschrieben und diese scheinen zu funktionieren. Jetzt habe ich das Problem, dass ich keine Ahnung habe, wie ich die Wurzel aus einem Funktionsterm ziehe. Dazu bräuchte ich soweit ich weiß sowas wie ne quadratische Ergänzung für Polynome. Ich dachte, dass mir hier vielleicht jemand von euch helfen könnte.
Falls ihr euch die Klasse mal anschauen wollt:
Java:
public class PolynominalFunction extends Function{
double[] factors;
public PolynominalFunction(double[] factors) {
this.factors = factors;
}
@Override
public double getY(double x) {
double result = 0;
for (int i = 0 ; i < factors.length ; i++){
if (factors[i] == 0)
continue;
if (i == 0)
result += factors[i];
else
result += factors[i]*Math.pow(x, i);
}
return result;
}
@Override
public PolynominalFunction derive() {
if (factors.length == 0)
return new PolynominalFunction(new double[]{});
double[] newFactors = new double[factors.length-1];
for (int i = 1 ; i < factors.length ; i++)
newFactors[i-1] = factors[i]*i;
return new PolynominalFunction(newFactors);
}
@Override
public PolynominalFunction antiderive() {
if (factors.length == 0)
return new PolynominalFunction(new double[]{});
double[] newFactors = new double[factors.length+1];
for (int i = 0 ; i < factors.length ; i++)
newFactors[i+1] = factors[i]/(i+1);
return new PolynominalFunction(newFactors);
}
public String serialize(){
String s = null;
for (int i = factors.length-1 ; i >= 0 ; i--){
if (factors[i] == 0)
continue;
if (s == null)
s = factors[i]+"*x^"+i;
else{
if (factors[i] > 0)
s += "+";
s += factors[i]+"*x^"+i;
}
}
return s;
}
@Override
public PolynominalFunction square() {
if (factors.length == 0)
return new PolynominalFunction(new double[]{});
double[] newFactors = new double[factors.length*2];
for (int i = 0 ; i < factors.length ; i++){
newFactors[i*2] += factors[i]*factors[i];
for (int k = i+1 ; k < factors.length ; k++){
newFactors[i+k] += 2*factors[i]*factors[k];
}
}
return new PolynominalFunction(newFactors);
}
Ist mein Ansatz vielleicht Falsch? Gibt's da was einfacheres?
Ich bin für Vorschläge offen
Falls es Probleme damit gibt meinen Ansatz zu verstehen sag bescheid, dann werde ich das versuchen zu illustrieren.
Zuletzt bearbeitet: