簡體   English   中英

計算兩點之間的距離

[英]Calculating the distance between two points

我需要創建一個計算兩點之間距離的類。 我被困了,我是一個初學者。 這是我的課程:

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;
    }    
}

第二節課。

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;
    }
}

我不確定如何獲得兩個定義點之間的點對象(中間點)。

我可以創建點對象,但我不確定如何通過位於這兩個點對象之間的midpoint()方法返回一個點對象。

平面上兩點(x1,y1)和(x2,y2)之間的距離為:

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

但是,如果您想要的只是兩點的中點,則應將中點函數更改為:

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

這將返回一個全新的點對象,其中的點設置在給定的兩個點的中間(不必關心任何其他數學)。 並且,由於你的第二課是一行,你只需要兩個端點來描述它,所以我做了一些小改動。

First 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; }
}

然后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);
    }
}

這兩個文件在編譯並運行端點2,25,6 (經典的3/4/5直角三角形的斜邊)時,生成正確的:

Midpoint = (3.5,4.0)
Length   = 5.0

簡單的畢達格...根(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

想象一下X和Y是你在平坦表面上的點。 然后aXy - YybYx - Xx c的長度是它們的距離,是該三角形的斜邊的長度。 它是使用計算的

sqrt(a^2 + b^2);

既然你看到我們正在對ab進行平方,那么它們的符號就不相關了 - 它將會歸結為相同。 所以這種方法總是有效的,無論哪個點都存在。

查看Pythagorean theorem

你真的需要距離,還是想要獲得中點? 因為從您的代碼片段來看,您只想創建一個位於兩個現有點之間的新點。

如果你真的只是在中點之后,你真的不需要整個第二類(即'Line')來完成它。 既然你想要找到的東西也是一個點,那么在現有的Point類中添加一個構造函數是有意義的,就像這樣。

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

..然后,在其他地方讓我們說你已經有幾個想要使用它的點,你使用構造函數:

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

如果你真的想要兩點之間的距離,這不是任何一個點的屬性,所以使用靜態方法是有道理的,就像這樣

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);
}

並回到調用代碼中,您可以這樣使用它:

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

您可以使用數學函數:

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使用負值等處理問題。對於您來說,使用Math.pow為您提供了一種安全的方法,因為它內置了大量的檢查。

正如其他人所說, 你可以使用畢達哥拉斯定理 以下是Wolfram Demostration Project的視覺演示。

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

在你的第二個類中,看起來你正試圖設置用於構造你的mp變量的xy的值。 你的所有公式都是正確的,但你需要考慮一切都被執行的順序 在代碼中,它創建了xy變量,從0開始,然后是各種Point xy仍為0,因此mp設置為Point(0, 0)

你可能想要做的是將midpoint返回類型更改為Point ,這樣當你調用該函數時,你會得到一個Point 然后,您可以使用計算的值創建新的Point對象。 它應該看起來更像這樣:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM