Hi,
nachdem mir hier das letzte mal so gut geholfen wurde hab ich mal wieder eine kleine Frage und hoffe auf Antwort =)
Ich möchte eine eine minütliche Positionsermittlung durchführen. Ich habe ein Objekt, die aktuelle Position und ein Ziel. Das Objekt verfügt zudem über eine Geschwindigkeit. Jede Minute wird die Position des Objektes neu ermittelt.
Wenn die aktuelle Position dem Ziel nahe liegt ist es angekommen. Folgenden Code habe ich geschrieben der auch eigentlich ganz gut funktioniert.
Jedoch habe ich das Problem, dass wenn ich ein zu schnelles Objekt habe z.B. 135 km/h, legt dieses in der Minute 2,25 Kilometer zurück und ist somit im nächsten Zeitschritt nicht mehr in der Nähe des Ziels sondern schon drüber hinweg. Dann springt es zwischen zwei Positionen hin und her, erreicht aber niemals das Ziel.
Irgendeine Abfrage müsste ich einbauen die dies verhindert.
Vielleicht habt Ihr ja eine gute Idee dazu oder eine andere viel elegantere Lösungsidee um das Problem zu lösen.
Nico
nachdem mir hier das letzte mal so gut geholfen wurde hab ich mal wieder eine kleine Frage und hoffe auf Antwort =)
Ich möchte eine eine minütliche Positionsermittlung durchführen. Ich habe ein Objekt, die aktuelle Position und ein Ziel. Das Objekt verfügt zudem über eine Geschwindigkeit. Jede Minute wird die Position des Objektes neu ermittelt.
Wenn die aktuelle Position dem Ziel nahe liegt ist es angekommen. Folgenden Code habe ich geschrieben der auch eigentlich ganz gut funktioniert.
Java:
/**
* Diese Klasse stellt die Position der Clients dar und berechnet unter Angabe
* der Geschwindigkeit die nächste Position.
*
* @author Nico
*
*/
public class Position {
private double x;
private double y;
private Position normalizedDirectionVector;
public Position(double a, double b) {
x = a;
y = b;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
/**
* Liefert unter Angabe des Ziels und der Geschwindigkeit die nächste
* Position
*
* @param speed
* @param target
* @return nextPosition
*/
public Position nextPosition(double speed, Position target) {
Position nextPosition = new Position(0, 0);
createNormalizedDirectionVector(this, target);
if(target.getX()>this.x&&target.getY()>this.y){
nextPosition.x = this.x + (speed * normalizedDirectionVector.x);
nextPosition.y = this.y + (speed * normalizedDirectionVector.y);
}
if(target.getX()<this.x&&target.getY()<this.y){
nextPosition.x = this.x - (speed * normalizedDirectionVector.x);
nextPosition.y = this.y - (speed * normalizedDirectionVector.y);
}
if(target.getX()>this.x&&target.getY()==this.y){
nextPosition.x = this.x + (speed * normalizedDirectionVector.x);
nextPosition.y = this.y - (speed * normalizedDirectionVector.y);
}
if(target.getX()>this.x&&target.getY()==this.y){
nextPosition.x = this.x + (speed * normalizedDirectionVector.x);
nextPosition.y = this.y - (speed * normalizedDirectionVector.y);
}
if(target.getX()<this.x&&target.getY()==this.y){
nextPosition.x = this.x - (speed * normalizedDirectionVector.x);
nextPosition.y = this.y - (speed * normalizedDirectionVector.y);
}
if(target.getX()==this.x&&target.getY()>this.y){
nextPosition.x = this.x - (speed * normalizedDirectionVector.x);
nextPosition.y = this.y + (speed * normalizedDirectionVector.y);
}
if(target.getX()==this.x&&target.getY()<this.y){
nextPosition.x = this.x - (speed * normalizedDirectionVector.x);
nextPosition.y = this.y + (speed * normalizedDirectionVector.y);
}
if(target.getX()<this.x&&target.getY()>this.y){
nextPosition.x = this.x - (speed * normalizedDirectionVector.x);
nextPosition.y = this.y + (speed * normalizedDirectionVector.y);
}
if(target.getX()>this.x&&target.getY()<this.y){
nextPosition.x = this.x + (speed * normalizedDirectionVector.x);
nextPosition.y = this.y - (speed * normalizedDirectionVector.y);
if(this.x>nextPosition.x){
nextPosition.x=target.x;
}
}
this.x = nextPosition.x;
this.y = nextPosition.y;
return nextPosition;
}
/**
* Gibt den normierten Richtungsvektor zweier Vektoren zurück
*
* @param aufpunkt
* @param ziel
* @return
*/
private void createNormalizedDirectionVector(Position aufpunkt,
Position ziel) {
normalizedDirectionVector = minus(aufpunkt, ziel);
double leng = length(normalizedDirectionVector);
double k = normalizedDirectionVector.x;
double o = normalizedDirectionVector.y;
double l = leng;
normalizedDirectionVector.x = Math.abs(k / l);
normalizedDirectionVector.y = Math.abs(o / l);
}
/**
* Subtrahiert zwei Vektoren
*
* @param startPoint
* @param target
* @return
*/
private Position minus(Position startPoint, Position target) {
Position local = new Position(0, 0);
local.x = target.x - startPoint.x;
local.y = target.y - startPoint.y;
return local;
}
/**
* Berechnet die Länge eines Vektors
*
* @param a
* @return
*/
private double length(Position a) {
double local = 0;
local = Math.sqrt(Math.pow(a.x, 2) + Math.pow(a.y, 2));
return local;
}
}
Jedoch habe ich das Problem, dass wenn ich ein zu schnelles Objekt habe z.B. 135 km/h, legt dieses in der Minute 2,25 Kilometer zurück und ist somit im nächsten Zeitschritt nicht mehr in der Nähe des Ziels sondern schon drüber hinweg. Dann springt es zwischen zwei Positionen hin und her, erreicht aber niemals das Ziel.
Irgendeine Abfrage müsste ich einbauen die dies verhindert.
Vielleicht habt Ihr ja eine gute Idee dazu oder eine andere viel elegantere Lösungsidee um das Problem zu lösen.
Nico