Hallo, ich hoffe, dass ich mit meiner Frage hier an der richtigen Stelle bin. Ich habe schon tagelang gegoogelt und rumprobiert, aber irgendwie steh ich auf dem Schlauch.
Ich möchte gern ein bzw. mehrere Shape-Objekte von einer Position auf meiner Zeichenfläche zu einer anderen (diese wird per Mausklick bestimmt) verschieben. Die Verschiebung soll mit einer konstanten Geschwindigkeit entlang einer Geraden von Start- zu Zielpunk geschehen. Eigentlich sollte das doch nicht so schwer sein, oder? ???:L
Mein derzeitiger Ansatz ist, dass ich zunächst die Differenz der X- und X-Werte der aktuellen Position und der neuen Zielposition bestimme. Dann berechne ich mit Hilfe dieser Werte die Distanz, die mein Shape Objekt zurücklegen wird (Hypotenuse des Dreiecks, Länge des Vektors, wie auch immer man es nennen will). Jetzt teile ich diese Länge durch einen festen Wert, dieser Wert representiert die Geschwindigkeit mit der sich das Objekt bewegen soll. Dadurch erhalte ich einen Wert der mir angibt, wieviel der Strecke mein Objekt pro Zeiteinheit zurück legt. Jetzt dividiere ich die relativen X- und Y-Werte durch diesen neuen Wert, um mit deren Hilfe die neue Position des Shape-Objekts nach der aktuellen Zeiteinheit berechnen zu können. Die einzelnen Zeiteinheiten durchlaufe ich in einem Thread und nähere mich so immer weiter der Zielposition. (Oh man, ich hoffe ich konnte das halbwegs vernünftig ausdrücken.)
Soweit die Idee. Das funktioniert auch mehr oder weniger gut. Das Problem ist aber, dass das Objekt von seiner Linie (teilweise recht stark) abweicht. Dadurch wird irgendwann der Kurs korrigiert und das Objekt "schlägt einen Hacken". So kommt das Objekt zwar am Ende an seiner Position an, aber halt nicht ganz so, wie ich mit das vorgestellt hatte.
So sieht das dann aus:
Bild
Hier noch mal die Implementierung("rot" ist die Hauptklasse in der gezeichnet wird usw.):
Woran könnte das liegen? Was mache ich falsch? Sind das nur Rundungsfehler? Wie kann ich das vermeiden? Fragen über Fragen
Danke schonmal für die Hilfe
Ich möchte gern ein bzw. mehrere Shape-Objekte von einer Position auf meiner Zeichenfläche zu einer anderen (diese wird per Mausklick bestimmt) verschieben. Die Verschiebung soll mit einer konstanten Geschwindigkeit entlang einer Geraden von Start- zu Zielpunk geschehen. Eigentlich sollte das doch nicht so schwer sein, oder? ???:L
Mein derzeitiger Ansatz ist, dass ich zunächst die Differenz der X- und X-Werte der aktuellen Position und der neuen Zielposition bestimme. Dann berechne ich mit Hilfe dieser Werte die Distanz, die mein Shape Objekt zurücklegen wird (Hypotenuse des Dreiecks, Länge des Vektors, wie auch immer man es nennen will). Jetzt teile ich diese Länge durch einen festen Wert, dieser Wert representiert die Geschwindigkeit mit der sich das Objekt bewegen soll. Dadurch erhalte ich einen Wert der mir angibt, wieviel der Strecke mein Objekt pro Zeiteinheit zurück legt. Jetzt dividiere ich die relativen X- und Y-Werte durch diesen neuen Wert, um mit deren Hilfe die neue Position des Shape-Objekts nach der aktuellen Zeiteinheit berechnen zu können. Die einzelnen Zeiteinheiten durchlaufe ich in einem Thread und nähere mich so immer weiter der Zielposition. (Oh man, ich hoffe ich konnte das halbwegs vernünftig ausdrücken.)
Soweit die Idee. Das funktioniert auch mehr oder weniger gut. Das Problem ist aber, dass das Objekt von seiner Linie (teilweise recht stark) abweicht. Dadurch wird irgendwann der Kurs korrigiert und das Objekt "schlägt einen Hacken". So kommt das Objekt zwar am Ende an seiner Position an, aber halt nicht ganz so, wie ich mit das vorgestellt hatte.
So sieht das dann aus:
Bild
Hier noch mal die Implementierung("rot" ist die Hauptklasse in der gezeichnet wird usw.):
Java:
class RefreshThread extends Thread {
Rotating rot;
public RefreshThread(Rotating rot) {
this.rot = rot;
}
public void run() {
double distanceX;
double distanceY;
double distance;
int speed = 2;
while (true) {
try {
sleep(15);
if (rot.currentX != rot.targetX || rot.currentY != rot.targetY) {
distanceX = rot.targetX - rot.currentX;
distanceY = rot.targetY - rot.currentY;
System.out.println("a = " + distanceX);
System.out.println("b = " + distanceY);
distance = Math.sqrt(distanceX*distanceX + distanceY*distanceY);
System.out.println("c = " + distance);
double factor = distance/speed;
System.out.println("factor = " + factor);
rot.currentX = rot.currentX + new Double(distanceX / factor).intValue();
rot.currentY = rot.currentY + new Double(distanceY / factor).intValue();
System.out.println(rot.currentX + ";" + rot.currentY);
}
} catch (InterruptedException e) {
}
rot.doRepaint();
}
}
}
Woran könnte das liegen? Was mache ich falsch? Sind das nur Rundungsfehler? Wie kann ich das vermeiden? Fragen über Fragen
Danke schonmal für die Hilfe