2D Java: Перемещение точки P определенное расстояние ближе до другой точки?

Что лучший способ состоит в том, чтобы пойти о том, чтобы двигать поближе расстояние Point2D.Double x до другого Point2D.Double?

Править: Попробованный для редактирования, но так понизился для обслуживания. Нет это не домашняя работа

Я должен переместить плоскость (A) к концу взлетно-посадочной полосы (C) и указать, он в корректном направлении (поверните a).

сопроводительный текст http://img246.imageshack.us/img246/9707/planec.png

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

    //coordinate = plane coordinate (Point2D.Double)
    //Distance = max distance the plane can travel in this frame

    Triangle triangle = new Triangle(coordinate, new Coordinate(coordinate.x, landingCoordinate.y),  landingCoordinate);

    double angle = 0;

    //Above to the left
    if (coordinate.x <= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(angle, distance);
        angle = (Math.PI-angle);
    }
    //Above to the right
    else if (coordinate.x >= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
    {
        angle = triangle.getAngleC();
        coordinate.rotate(Math.PI-angle, distance);
        angle = (Math.PI*1.5-angle);
    }

    plane.setAngle(angle);

Треугольный класс может быть найден по http://pastebin.com/RtCB2kSZ

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

6
задан Ben Reeves 1 March 2010 в 12:33
поделиться

6 ответов

Векторы спешат на помощь!

Даны точки A и B. Создайте вектор V из A в B (выполняя действия B-A). Нормализовать вектор V в единичный вектор, а затем просто умножить его на расстояние d, которое вы хотите, и, наконец, добавить полученный вектор в точку A. то есть:

  A_moved = A + |(B-A)|*d

Java (ish)

  Vector2D a_moved = a.add(b.subtract(a).norm().multiply(d));

Никаких углов, никаких неприятных триггеров.

5
ответ дан 8 December 2019 в 13:45
поделиться

Вы можете минимизировать разницу по обеим осям на процент (это зависит от того, насколько вы хотите переместить точки).

Например:

Point2D.Double p1, p2;
//p1 and p2 inits

// you don't use abs value and use the still point as the first one of the subtraction
double deltaX = p2.getX() - p1.getX();
double deltaY = p2.getY() - p1.getY();

// now you know how much far they are
double coeff = 0.5; //this coefficient can be tweaked to decice how much near the two points will be after the update.. 0.5 = 50% of the previous distance

p1.setLocation(p1.getX() + coeff*deltaX, p1.getY() + coeff*deltaY);

Итак, вы переместили p1 на полпути к p2 . Хорошо, что избегайте abs , если вы выбираете, какая точка будет перемещена, а какая будет стоять на месте, вы можете избежать тестов if и просто использовать необработанный коэффициент.

5
ответ дан 8 December 2019 в 13:45
поделиться
double angle = Math.atan2(landingCoordinate.y-coordinate.y, landingCoordinate.x-coordinate.x);

coordinate.x += Math.cos(angle)*distance;
coordinate.y += Math.sin(angle)*distance;

//Add 90 degress to the plane angle
plane.setAngle(angle + 1.57079633);
2
ответ дан 8 December 2019 в 13:45
поделиться

В этой игре целые координаты используются для представления квадратов в сетке. Метод move (int row, int col) перемещается к указанной строке и столбцу, продвигаясь на один квадрат в одном из восьми полукруглых направлений, как показано здесь .

0
ответ дан 8 December 2019 в 13:45
поделиться

Кратчайшее расстояние между двумя точками - это линия, поэтому просто переместите эту точку на x единиц вдоль линии, соединяющей две точки.


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

Предположим, у вас есть две точки A = (x 1 , y 1 ) и B = (x ] 2 , y 2 ). Линия, которая включает эти две точки, имеет уравнение

(x 1 , y 1 ) + t · (x 2 - x 1 , y 2 - y 1 )

где t - некоторый параметр. Обратите внимание, что когда t = 1 , точка, указанная линией, равна B , а когда t = 0 , точка, указанная линией, равна А .

Теперь вы хотите переместить B в B ', точку, которая находится на новом расстоянии d от A :

 A                       B'            B
(+)---------------------(+)-----------(+)

 <========={ d }=========>

Точка B ', как и любая другая точка на прямой, также управляется уравнением, которое мы показали ранее. Но какое значение t мы используем? Что ж, когда t равно 1, уравнение указывает на B , что на | AB | единиц от A . Таким образом, значение t , которое определяет B ', равно t = d / | AB | .

Решение для | AB | и включение этого в приведенное выше уравнение предоставляется читателю в качестве упражнения.

5
ответ дан 8 December 2019 в 13:45
поделиться
(point A is to be moved closer to B)

if (A.x > B.x)
    //decrement A.x
if (A.x < B.x)
    //increment A.x

это может быть основной идеей в псевдокоде, но есть много чего еще. Как определить "лучший" способ?

Необходимо учитывать некоторые моменты:

  • Есть ли определенная мера/отношение, на которое вы хотите, чтобы точки были удалены друг от друга, или вы просто хотите, чтобы они были ближе?
  • Должны ли обе координаты всегда быть изменены? (например, если вы хотите переместить (1,50) ближе к (0,0), то нужно ли сделать (.5, 25) или просто (1,25)?
  • если точка должна быть удалена на 1 единицу, то должна ли она быть удалена на 1 единицу по горизонтали? прямо по диагонали? на расстоянии 1 единицы на прямой между двумя точками?

Дайте нам немного больше деталей и мы посмотрим, что у нас получилось. :D

0
ответ дан 8 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: