Frage

Ich brauche eine Klasse zu erstellen, die den Abstand zwischen zwei Punkten berechnet. Ich bin fest und ich bin ein totaler Anfänger. Hier sind meine Klassen:

package org.totalbeginner.tutorial;

public class Point {

    public double x;
    public double y;

    Point(double xcoord, double ycoord){
        this.x = xcoord;
        this.y = ycoord;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }    
}

Die zweite Klasse.

package org.totalbeginner.tutorial;

public class Line {

    double x;
    double y;

    Point p1 = new Point(2.0,2.0);
    Point p2 = new Point(4.0,4.0);
    Point mp = new Point(x,y);

    public void midpoint() {
        x = (p1.getX() + p2.getX()) / 2;
        y = (p1.getY() + p2.getY()) / 2;
    }
}

Ich bin nicht sicher, wie ein Punktobjekt zu erhalten (der mittlere Punkt) zwischen den beiden definierten Punkten.

Ich kann Punkt-Objekte erstellen, aber ich bin nicht sicher, wie ein Punktobjekt durch meine midpoint() Methode zurückzukehren, die zwischen diesen beiden Punktobjekten liegen.

War es hilfreich?

Lösung

Der Abstand zwischen zwei Punkten (x1, y1) und (x2, y2) auf einer flachen Oberfläche ist:

    ____________________
   /       2          2
 \/ (y2-y1)  + (x2-x1)

Aber, wenn alles, was Sie wollen, dass der Mittelpunkt Ihrer beiden Punkte ist, sollten Sie Ihre Mittelpunkt Funktion ändern:

public Point midpoint (Point p1, Point p2) {
    return new Point ((p1.getX() + p2.getX()) / 2, (p1.getY() + p2.getY()) / 2);
}

Das wird ein ganz neues Punktobjekt mit den Punkten zurück zur Mitte der gegebenen zwei Punkte eingestellt (ohne dich selbst mit einer anderen Mathe kümmern zu müssen). Und da Ihre zweite Klasse eine Linie ist, müssen Sie nur die beiden Endpunkte, es zu beschreiben, so würde ich ein paar kleinere Änderungen vornehmen.

Erste Point.java:

class Point {
    double x, y;
    Point (double xcoord, double ycoord) {
        this.x = xcoord;
        this.y = ycoord;
    }
    public double getX() { return x; }
    public double getY() { return y; }
}

Dann Line.java:

public class Line {
    Point p1, p2;
    Line (Point point1, Point point2) {
        this.p1 = point1;
        this.p2 = point2;
    }
    public Point midpoint() {
        return new Point ((p1.getX()+p2.getX())/2, (p1.getY()+p2.getY())/2);
    }
    public double abstand() {
        return Math.sqrt(
            (p1.getX() - p2.getX()) *  (p1.getX() - p2.getX()) + 
            (p1.getY() - p2.getY()) *  (p1.getY() - p2.getY())
        );
    }
    static public void main (String args[]) {
        Line s = new Line (new Point(2.0, 2.0), new Point(5.0, 6.0));
        Point mp = s.midpoint();
        System.out.println ("Midpoint = (" + mp.getX() + "," + mp.getY() + ")");
        double as = s.abstand();
        System.out.println ("Length   = " + as);
    }
}

Diese beiden Dateien, wenn sie mit dem Endpunkte 2,2 und 5,6 (die Hypotenuse eines klassischen 3/4/5 rechtwinkliges Dreieck), erzeugen die richtige kompiliert und ausgeführt:

Midpoint = (3.5,4.0)
Length   = 5.0

Andere Tipps

Einfache Pythag ... root (dx ^ 2 + dy ^ 2)

Math.sqrt(Math.pow((p2.getX() - p1.getX()), 2) + Math.pow((p2.getY() - p1.getY()), 2))
 X
 +
 |\
 | \
a|  \c
 |   \
 |    \
 +-----+ 
    b   Y

Stellen X und Y sind die Punkte auf einer ebenen Fläche. Dann ist a X.y - Y.y und b ist Y.x - X.x. Die Länge des c ist ihr Abstand und die Länge der Hypotenuse dieses Dreiecks. Es wird berechnet, indem

sqrt(a^2 + b^2);

Da Sie sehen, wir sind quadriert a und b, ist das Zeichen für sie nicht relevant - es wird auf die gleiche kommen. So dass diese Methode funktioniert immer, wo auch immer die Punkte liegen.

Nachschlagen der Pythagorean theorem

Haben Sie wirklich brauchen die Entfernung, oder wollen Sie einfach den Mittelpunkt zu bekommen? Da aus dem Code-Schnipsel, es sieht ein bisschen wie Sie gerade einen neuen Punkt erstellen möchten, die auf halbem Weg zwischen zwei bestehenden Punkten.

Wenn Sie wirklich nur nach dem Mittelpunkt sind, dann müssen Sie nicht wirklich eine ganze zweite Klasse müssen (das heißt, ‚Line‘), das erreichen. Da das, was Sie ist auch ein Punkt zu finden versuchen, es Sinn macht, einen Konstruktor, um Ihre bestehende Point-Klasse zu schreiben, so ..

Point(Point a, Point b)
{
  x = (a.x + b.x) / 2;
  y = (a.y + b.y) / 2;
}

.. dann an anderer Stelle sagen wir, Sie schon ein paar Punkte haben Sie diese auf verwenden möchten, können Sie den Konstruktor so:

Point p1 = new Point(2,2);
Point p2 = new Point(4,4);
Point midpoint = new Point(p1, p2);

und wenn Sie wirklich Abstand zwischen zwei Punkten wollen, das ist nicht wirklich ein Attribut jeden Punktes, so dass es sinnvoll ist, eine statische Methode für das zu verwenden, wie so

public static double distance(Point a, Point b)
{
  double dx = a.x - b.x;
  double dy = a.y - b.y;
  return Math.sqrt(dx * dx + dy * dy);
}

und zurück in den aufrufenden Code, können Sie es auf diese Weise verwendet werden:

Point p1 = new Point(2,2);
Point p2 = new Point(4,4);
System.out.println("Distance between them is " + Point.distance(p1, p2));

Sie können eine Mathe-Funktion für diese verwenden:

public Point midpoint() {
    //Calculate the difference between the old and new x/y
    double dx = p1.getX() - p2.getX();
    double dy = p1.getY() - p2.getY();

    double newX = Math.pow(dx, 2D);
    double newY = Math.pow(dz, 2D);
    return new Point(newX, newZ);
}

Math.pow behandelt die Probleme mit negativen Werten und etc. Für Sie, Math.pow gibt Ihnen eine sichere Methode verwenden, da es eine Menge von Schecks hat innerhalb gebaut.

Sie können den Satz des Pythagoras verwenden , wie andere gesagt hat. Hier ist eine visuell demostration aus dem Wolfram Demostration Projekt .

alt text http://demonstrations.wolfram.com/DistanceBetweenTwoPoints /HTMLImages/index.en/popup_5.jpg

In Ihrer zweiten Klasse, sieht es aus wie Sie versuchen, die Werte von x und y einzustellen, die verwendet werden, Ihre mp Variable zu konstruieren. Alle Ihre Formeln sind richtig, aber Sie müssen die um berücksichtigen, dass alles ausgeführt wird. In dem Code, wie es ist, es ist die Schaffung des x und y Variablen, die als 0 beginnen, dann die verschiedenen Points. x und y sind immer noch 0, so mp Point(0, 0) eingestellt ist.

Was möchten Sie wahrscheinlich zu tun ist, das ändern Rückgabetyp von midpoint Point, so dass, wenn Sie diese Funktion aufrufen, erhalten Sie wieder ein Point. Dann können Sie ein neues Point Objekt mit den Werten erstellen Sie berechnen. Es sollte mehr wie folgt aussehen:

public Point midpoint() {
    // calculate the middle x and y
    double x = (p1.getX() + p2.getX()) / 2;
    double y = (p1.getY() + p2.getY()) / 2;
    // now make a new Point with those values, and return it
    return new Point(x, y);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top