Как кодировать случайное движение в ограниченной области - PullRequest
0 голосов
/ 30 июля 2011

У меня ограниченная область (экран), заполненная несколькими движущимися объектами (3-20 из них, так что это не похоже на 10.000 :).Эти объекты должны двигаться с постоянной скоростью и в произвольном направлении.Но есть несколько ограничений:

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

На изображении ниже я отметил разрешенные движения в этой ситуации - например, объект D не должен двигаться прямо вверх, так как он приведет его к "стене".

allowed movement

То, что я хотел бы иметь, - это способ их перемещения (один за другим).Есть ли какой-нибудь простой способ добиться этого без особых вычислений?

Плотность объектов в этом районе будет довольно низкой.

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

Есть несколько способов, которыми вы можете программно реализовать желаемое поведение, учитывая, что у вас такое небольшое количество объектов.Тем не менее, я собираюсь предложить что-то немного другое.

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

Тогда все, что вам нужно сделать, - это перейти к моделированию физики и отобразить его текущее состояние в пользовательский интерфейс.Все сложные вещи обрабатываются для вас, и результат, вероятно, будет более правдоподобным / реалистичным, чем тот, который вы получили бы, пытаясь придумать свой собственный алгоритм движения (или, если вы хотите, чтобы он выглядел более случайным и менее правдоподобным, вы могли бытакже просто периодически применяйте случайный импульс к случайному объекту, чтобы непредсказуемо изменить ситуацию).

0 голосов
/ 30 июля 2011

Вы можете использовать hitTest: метод UIView

UIView * touchedView = [self.superview hitTest: currentOrigin withEvent: nil];

В этом методе вы должны передать текущее начало шара, а во втором аргументе вы можете передать ноль.

этот метод вернет вид, с которым был нанесен удар по мячу.

Если есть какой-либо вид удара, вы просто меняете направление мяча.

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

...