Вычисление расстояния между двумя точками

StackOverflow https://stackoverflow.com/questions/929773

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

Это вернет совершенно новый точечный объект с точками, установленными в середине заданных двух точек (без необходимости заниматься какой-либо другой математикой).И, поскольку ваш второй класс - это линия, вам нужны только две конечные точки для его описания, поэтому я бы внес некоторые незначительные изменения.

Первый 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

Другие советы

Простой Пифагор...корень (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 - это ваши точки на плоской поверхности.Тогда a является X.y - Y.y и b является Y.x - X.x .Длина c это их расстояние и длина гипотенузы этого треугольника.Он рассчитывается с использованием

sqrt(a^2 + b^2);

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

Найдите Pythagorean theorem

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

Если вы действительно находитесь сразу после средней точки, вам на самом деле не нужен весь 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));

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

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

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

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

В вашем втором классе, похоже, вы пытаетесь установить значения x и y которые используются для построения вашего mp переменная.Все ваши формулы верны, но вам нужно учитывать порядок чтобы все было выполнено.В коде, как он есть, он создает x и y переменные, которые начинаются с 0, затем различные Points. 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top