Что лучший способ состоит в том, чтобы пойти о том, чтобы двигать поближе расстояние 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
Мысль о плоскости может быть в в любом положении вокруг точки взлетно-посадочной полосы
Векторы спешат на помощь!
Даны точки 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));
Никаких углов, никаких неприятных триггеров.
Вы можете минимизировать разницу по обеим осям на процент (это зависит от того, насколько вы хотите переместить точки).
Например:
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 и просто использовать необработанный коэффициент.
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);
В этой игре целые координаты используются для представления квадратов в сетке. Метод move (int row, int col)
перемещается к указанной строке и столбцу, продвигаясь на один квадрат в одном из восьми полукруглых направлений, как показано здесь .
Кратчайшее расстояние между двумя точками - это линия, поэтому просто переместите эту точку на 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 | и включение этого в приведенное выше уравнение предоставляется читателю в качестве упражнения.
(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
это может быть основной идеей в псевдокоде, но есть много чего еще. Как определить "лучший" способ?
Необходимо учитывать некоторые моменты:
Дайте нам немного больше деталей и мы посмотрим, что у нас получилось. :D