计算两点之间的距离

时间:2009-05-30 14:05:27

标签: java

我需要创建一个计算两点之间距离的类。我被困了,我是一个初学者。这是我的课程:

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()方法返回点对象。

7 个答案:

答案 0 :(得分:49)

平面上两点(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);
}

这将返回一个全新的点对象,其中的点设置在给定的两个点的中间(不必关心任何其他数学)。而且,由于你的第二课是一行,你只需要用两个端点来描述它,所以我会做一些小改动。

首先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

答案 1 :(得分:20)

简单的毕达格...根(dx ^ 2 + dy ^ 2)

Math.sqrt(Math.pow((p2.getX() - p1.getX()), 2) + Math.pow((p2.getY() - p1.getY()), 2))

答案 2 :(得分:11)

 X
 +
 |\
 | \
a|  \c
 |   \
 |    \
 +-----+ 
    b   Y

想象一下X和Y是你在平面上的点。然后aX.y - Y.ybY.x - X.xc的长度是它们的距离,是该三角形的斜边的长度。它是使用

计算的
sqrt(a^2 + b^2);

由于您看到我们正在对ab进行平方,因此它们的符号无关 - 它将归结为相同。所以这种方法总是有效的,无论哪个点都存在。

查找Pythagorean theorem

答案 3 :(得分:6)

你真的需要距离,还是你想要获得中点?因为从你的代码片段来看,你只想创建一个在两个现有点之间的新点。

如果你真的只是在中点之后,你真的不需要整个第二类(即“线”)来完成它。既然你想要找到的东西也是一个点,那么在你现有的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));

答案 4 :(得分:2)

您可以使用数学函数:

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为您提供了一种安全的方法,因为它内置了很多检查。

答案 5 :(得分:1)

你可以使用毕达哥拉斯定理,正如其他人所说。以下是Wolfram Demostration Project的视觉描述。

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

答案 6 :(得分:1)

在您的第二堂课中,您似乎正在尝试设置用于构建x变量的ymp的值。您的所有公式都是正确的,但您需要考虑 order 一切都已执行。在代码中,它创建了xy变量,从0开始,然后是各种Pointxy仍为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);
}