Methoden Distanz von 2 Punkten im 2D-Raum

Kel

Aktives Mitglied
Ich hab 2 Point-Objekte, von denen ich nun die Distanz berechnen soll.
Ich finde keine Möglichkeit, die Point-Objekte direkt zu vergleichen .... ?

Code:
Point(int x, int y)
und
Code:
Point(int a, int b)
.

Die Point/Point2D-Klasse hat keine Methode, die mir da hilft (Point2D.distance() will double-Werte).

Wieso hab ich ein Point-Objekt mit 2 Intwerten, während alle Methoden von Point/Point2D double-Werte wollen? Das ist unlogisch :noe:.
Theoretisch kann ichs mit dem Satz des Phytagoras machen (Satz des Pythagoras ? Wikipedia), sieht mir aber umständlich aus, wenn ich die einzelnen Koordinaten erst deklarieren und initialisieren muss.

Point2D (Java 2 Platform SE v1.4.2)
 
Point speichert intern int. Schau doch einfach im Source. Point definiert nur eine Methode die double will, das ist setLocation für die es auch eine int-Alternative gibt.

Definieren musst du es doch sowieso, irgendwie musst du ihm ja sagen was du willst. Machs doch einfach so:

Java:
private double pythagoras(int x1, int y1, int x2, int y2)
{
	double oppositeCathetusLenght = (x2 - x1);
	double cathetusLenght = (y2 - y1);
	
	double oppositeCathetusSquare = Math.pow(oppositeCathetusLenght, 2);
	double cathetusSquare = Math.pow(cathetusLenght, 2);
	
	return(Math.abs(Math.sqrt(oppositeCathetusSquare + cathetusSquare)));
}
private double pythagoras(Point p1, Point p2)
{
	return(pythagoras(p1.x, p1.y, p2.x, p2.y));
}

Aus nen alten Projekt von mir rausgesucht, nie getestet, hab mich darauf verlassen dass ich mal was richtig gemacht habe.

Äh, distance macht doch offenbar eh das Selbe:

Java:
public static double distance(double x1, double y1, double x2, double y2)
{
	x1 -= x2;
	y1 -= y2;
	return Math.sqrt(x1 * x1 + y1 * y1);
}
 
Zuletzt bearbeitet:
Ich muss es aber mit Point-Objekten machen bzw. mit den Koordinaten der Point-Objekte. Und die sind nunmal int und nicht double (oder hab ich was bei dir falsch verstanden?).

Mir kam grad die Erleuchtung - getX() und getY() liefert mir double.

Java:
double laenge = Point2D.distance(punktA.getX(), punktA.getY(), punktB.getX(), punktB.getY());
 
Du weißt schon, dass alle Ganzzahlen automatisch in double gecastet werden können? Allererste Basic, sollte man wissen bevor man überhaupt seine erste Instanz erzeugt.
 
Ja das weiss ich, aber ich wollte nicht dauernd umcasten, wenn es eine fertige Methode dazu gibt, nutz ich die auch, anstatt mir die Finger schmutzig zu machen 😉.
 
Ob die Methode jetzt mit dem zurückgeben eines int-Wertes in einer double-Methode castet oder du mit dem übergeben eines int-Wertes als double-Parameter spielt doch keine Rolle. ???:L
Da hätte noch gefehlt, dass du Point überschreibst damit double gespeichert werden. :lol:
 
Ob die Methode jetzt mit dem zurückgeben eines int-Wertes in einer double-Methode castet oder du mit dem übergeben eines int-Wertes als double-Parameter spielt doch keine Rolle. ???:L
Ich finds übersichtlicher, wenn ich in der Methode nur double als Parameter habe, als in der Methode int zu double zu casten, wenn es das ist was du meinst.

Da hätte noch gefehlt, dass du Point überschreibst damit double gespeichert werden. :lol:
Ist Point nicht final? 😀
Ansonsten, warum nicht .... 😉.
 
Tja... what can I say... eine Distanz zwischen zwei Punkten mit Integern zu berechnen macht wenig Sinn. Sehen Sie selbst:
Java:
public class MyPointImpl
extends Point
{
  public MyPointImpl(int x, int y)
  {
    super(x, y);
  }

  public int distanceTo(Point p)
  {
    int x = p.x - this.x;
    int y = p.y - this.y;
    return (int) Math.round(Math.pow(x * x + y * y, 0.5));
    // das lässt sich recht einfach auf ein Minimum reduzieren...
    // return (int) distance(p.x, p.y);
  }
}
Daraus lernen wir 3 Dinge:
1. eine Distanz in Integerwerten (byte, short, int, long) zurück geben zu wollen ist viel zu ungenau und daher nicht sehr sinnvoll.
2. "Point2D.distance(double x, double y)" macht ungefähr das selbe wie "MyPointImpl.distanceTo(Point p)". Der einzige Unterschied: Man muß den Methodenaufruf nich immer explizit auf "int" casten.
Fazit: "Point.distance(double x, double y)" lässt sich sehrwohl für die Berechnung heranziehen.
@Edit: Nein... Point ist nicht final... der Code oben funktioniert 😉... allerdings hab' ich für das Testen nun so lange gebraucht, dass das Thema nun schon fast erledigt ist...
 
Zuletzt bearbeitet von einem Moderator:
Klar, es ging eigendlich darum, warum er umbedingt die Eingangsparameter als double haben wollte, wenn es ja eigendlich keinen Unterschied macht. Aber sorry, die Nacht hat irgendwie komische Einflüsse auf mich. 😳:autsch:
btw. "^0.5" habe ich als Wurzelrechnung noch nie gesehen. ^^
 
btw. "^0.5" habe ich als Wurzelrechnung noch nie gesehen. ^^
Dann hat dieser Thread ja noch einen Lerninhalt...
Ein Rechner kann nicht wirklich radizieren, potenzieren funktioniert aber. Radizieren heisst glücklicherweise nichts anderes, als mit dem Kehrwert des Wurzelexponenten zu potenzieren. Bei der Quadratwurzel ist der Wurzelexponent 2 und der Kehrwert dem entsprechend 0.5.
dieses "pow(x, 0.5)" ist nun mehr Macht der Gewohnheit, weil es in jedweder API kaum noch auffällt, dass eine "sqrt(x)"-Methode letzendlich immer in einer solchen "pow()"-Methode landet, weil Rechner zwar schneller geworden sind, aber immer noch nicht radizieren können. Naja, ob sie es irgendwann noch lernen ist völlig belanglos. Es geht ja auch anders. Als ich mit coden angefangen habe, konnte man damit jedenfalls noch ein wenig Performance rauskitzeln und auch mit anderen Wurzelexponenten arbeiten. Letzteres gilt natürlich auch heute noch.
 

Neue Themen


Zurück
Oben