Расчет расстояния между двумя точками - PullRequest
20 голосов
/ 30 мая 2009

Мне нужно создать класс, который рассчитывает расстояние между двумя точками. Я застрял и я абсолютный новичок. Вот мои занятия:

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 ]

49 голосов
/ 30 мая 2009

Расстояние между двумя точками (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,2 и 5,6 (гипотенуза классического прямоугольного треугольника 3/4/5), генерируют правильное:

Midpoint = (3.5,4.0)
Length   = 5.0
20 голосов
/ 30 мая 2009

Простой Pythag ... root (dx ^ 2 + dy ^ 2)

Math.sqrt(Math.pow((p2.getX() - p1.getX()), 2) + Math.pow((p2.getY() - p1.getY()), 2))
11 голосов
/ 30 мая 2009
 X
 +
 |\
 | \
a|  \c
 |   \
 |    \
 +-----+ 
    b   Y

Представьте, что X и Y - ваши точки на плоской поверхности. Тогда a равно X.y - Y.y, а b равно Y.x - X.x. Длина c - это их расстояние и длина гипотенузы этого треугольника. Рассчитывается с использованием

sqrt(a^2 + b^2);

Поскольку вы видите, что мы возводим в квадрат a и b, знак их не имеет значения - он сойдет к одному и тому же Так что этот метод всегда работает, где бы ни находились точки.

Поиск Pythagorean theorem

6 голосов
/ 30 мая 2009

Вам действительно нужно расстояние или вы пытаетесь просто получить среднюю точку? Поскольку из вашего фрагмента кода это выглядит так, будто вы просто хотите создать новую точку, которая находится на полпути между двумя существующими точками.

Если вы действительно только после средней точки, вам действительно не нужен целый 2-й класс (т. Е. «Линия»), чтобы выполнить это. Поскольку вещь, которую вы пытаетесь найти, - это тоже точка, имеет смысл добавить конструктор к существующему классу 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));
2 голосов
/ 26 февраля 2013

Для этого вы можете использовать математическую функцию:

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 дает вам безопасный метод, потому что в нем много встроенных проверок.

1 голос
/ 30 мая 2009

В вашем втором классе, похоже, вы пытаетесь установить значения x и y, которые используются для создания вашей переменной mp. Все ваши формулы верны, но вы должны учитывать порядок , что все выполняется. В данном коде создаются переменные x и y, которые начинаются с 0, а затем с различных Point s. x и y по-прежнему равны 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);
}
1 голос
/ 30 мая 2009

Вы можете использовать теорему Пифагора , как уже говорилось. Вот визуальный пример демонстрации Проект демонстрации Вольфрама .

альтернативный текст http://demonstrations.wolfram.com/DistanceBetweenTwoPoints/HTMLImages/index.en/popup_5.jpg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...