Как анимировать прямоугольник на объекте Path2D в контексте Graphics2D

Я только начал изучать основы класса Graphics2D. Пока я могу рисовать разные объекты и реализовывать ActionListener, чтобы фактически перемещать их на экране с помощью onKeyPress. Пока все хорошо, Пока думал сделать что-то посложнее. Я хочу указать путь к моему объекту и анимировать его только по этому конкретному пути.

Что-то вроде: я нарисую линию на небе, и самолет должен придерживаться этой линии и продолжать летать по этой конкретной линии. Теперь это возможно?

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

Начальная точка:

введите здесь описание изображения

Конечная точка:

введите здесь описание изображения

Теперь, как показано выше, мой желтый прямоугольник (в будущей плоскости) должен придерживаться заданного пути во время анимации (серая линия пути).

Мои исследования

Я искал свои модные слова, такие как путь в java, и нашел классы Path2D и GeneralPath. Кто-нибудь знает, могу ли я использовать это для решения этой проблемы.

Спасибо


person TeaCupApp    schedule 26.08.2011    source источник
comment
Что говорит их javadoc? download.oracle.com/javase/6/ документы/api/java/awt/geom/Path2D.html   -  person JB Nizet    schedule 26.08.2011
comment
Спасибо, JB. Я читал это раньше, но не мог понять, но ниже ответ прояснил и разработал основную концепцию.   -  person TeaCupApp    schedule 26.08.2011


Ответы (4)


Здорово !

Это напоминает мне о моих первых шагах в IT. Как же мне нравились все эти простые математические штуки, которые заставляли вещи двигаться на экране. :)

На самом деле вам нужна линейная интерполяция. Существуют и другие виды интерполяции, и некоторые API предлагают хорошую инкапсуляцию концепции, но вот основная идея, и вам довольно часто понадобятся эти вещи:

вы должны переписать свой путь

y = f (x ) 

как функция времени:

в момент времени 0 элемент будет в начальной позиции, в момент времени 1 он достигнет конца. А затем вы увеличиваете время (t) по своему желанию (например, 0,001 каждую мс).

Итак, вот формула простого линейного пути:

x = xstart + (xend-xstart) * t
y = ystart + (yend-ystart) * t

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

С уважением, Стефан

person Snicolas    schedule 26.08.2011
comment
Хорошее объяснение, я рассмотрю вашу формулу для анимации. Спасибо... Наслаждайтесь НХЛ! - person TeaCupApp; 26.08.2011

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

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

Это самый элементарный способ сделать это и работает в большинстве случаев.

person corsiKa    schedule 26.08.2011
comment
Итак, я могу создать путь с помощью Path2D и вызвать такой метод, а getIteratorPath предоставит мне информацию о пути? такие и x,y позиции на пути? Звучит достаточно просто, позвольте мне начать, спасибо, глоукодер. - person TeaCupApp; 26.08.2011

То, о чем вы говорите, это простая 2D-графика и спрайты. Если это все, что вам нужно, то для Java взгляните на 2D-спрайты Java. к или в конечном итоге пойдет с перспективой камеры и желанием просматривать анимацию под разными углами, используя Java 3D из OpenSource Java 3D.org. В любом случае вам нужно простое перемещение объекта по линии, довольно простое как в 2D, так и в 3D.

person JPM    schedule 26.08.2011

Вы можете попробовать использовать код моего проекта колледжа с открытым исходным кодом - LANSim. Его код доступен в меню Код. Это похоже на то, что вы пытаетесь сделать.

person AppleGrew    schedule 26.08.2011