Подтвердить что ты не робот

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

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

package org.totalbeginner.tutorial;

public class Punkt {

    public double x;
    public double y;

    Punkt(double xkoord, double ykoord){
        this.x = xkoord;
        this.y = ykoord;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }    
}

Второй класс.

package org.totalbeginner.tutorial;
public class Strecke{

    double x;
    double y;

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

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

Я не уверен, как получить точечный объект (среднюю точку) между обеими определенными точками.

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

4b9b3361

Ответ 1

Расстояние между двумя точками (x1, y1) и (x2, y2) на плоской поверхности равно:

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

Но если все, что вам нужно, это средняя точка (mittelpunkt) ваших двух точек, вы должны изменить свою среднюю функцию:

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

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

Первая Punkt.java (точка):

class Punkt {
    double x, y;
    Punkt (double xkoord, double ykoord) {
        this.x = xkoord;
        this.y = ykoord;
    }
    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
}

Затем Strecke.java (строка):

public class Strecke {
    Punkt p1, p2;
    Strecke (Punkt punkt1, Punkt punkt2) {
        this.p1 = punkt1;
        this.p2 = punkt2;
    }
    public Punkt mittelPunkt() {
        return new Punkt ((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[]) {
        Strecke s = new Strecke (new Punkt(2.0, 2.0), new Punkt(5.0, 6.0));
        Punkt mp = s.mittelPunkt();
        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

Ответ 2

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

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

Ответ 3

Леновое программирующее решение с использованием java2D point API

Ответ 4

 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

Ответ 5

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

Если вы действительно только после середины, вам действительно не нужен весь второй класс (т.е. "Стрелец" ), чтобы выполнить это. Поскольку вещь, которую вы пытаетесь найти, также является точкой, имеет смысл добавить конструктор к существующему классу Point, например.

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

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

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

и если вам действительно нужно расстояние между двумя точками, это не является атрибутом любой точки, поэтому имеет смысл использовать для этого статический метод, например

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

и обратно в вызывающем коде, вы можете использовать его следующим образом:

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

Ответ 6

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

public Punkt mittelpunkt() {
    //Calculate the difference betwen 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 Punkt(newX, newZ);
}

Math.pow:
обрабатывает проблемы с отрицательными значениями и т.д. для вас.
использование Math.pow дает вам безопасный метод, потому что он имеет много проверок, встроенных внутри

Ответ 7

Они учат теорему Пифагора в ранней школе. Существует хорошая вероятность того, что все, чему вы научились в математике, будет полезно в информатике в какой-то момент.

Ответ 9

В вашем втором классе, похоже, вы пытаетесь установить значения x и y, которые используются для создания переменной mp. Все ваши формулы верны, но вам нужно рассмотреть порядок выполнения всего. В коде, как он есть, он создает переменные x и y, которые начинаются как 0, затем различные Punkt s. x и y все равно 0, поэтому mp устанавливается на Punkt(0, 0).

Что вы, вероятно, захотите сделать, это изменить тип возврата mittelpunkt на Punkt, чтобы при вызове этой функции вы возвращали Punkt. Затем вы можете создать новый объект Punkt со значениями, которые вы вычисляете. Он должен выглядеть следующим образом:

public Punkt mittelpunkt() {
    // calculate the middle x and y
    double x = (p1.getX() + p2.getX()) / 2;
    double y = (p1.getY() + p2.getY()) / 2;
    // now make a new Punkt with those values, and return it
    return new Punkt(x, y);
}