Коллеги, назрел следующий интересный вопрос. Уже который день не могу придумать нормальный алгоритм для учета коллизий при следующих условиях:
1. Есть некая область в виде окружности
2. Внутри этой области есть другие окружности (3-5 штук), значительно более мелкие (радиус меньше в 5-10 раз)
3. Одна из мелких окружностей всегда движется за курсором - управляемый объект
4. Другая - всегда движется за первой (с чуть меньшей скоростью) - преследующий объект
5. Все прочие статичны - помехи
6. У каждой из окружностей заданы массы
Задача 1: при столкновении окружностей сверять их массы и двигать ту, которая более легкая
Задача 2: не давать мелким окружностям выходить за границы большой окружности, в которую они помещены
В целом и задачи вроде как совсем не сложные (учитывая, что это окружности). И решаются неплохо по-отдельности, но когда пытаюсь совместить воедино - видны какие-то погрешности, да и мой алгоритм похож на какие-то костыли для костылей.
Надеюсь на ваши советы. Чтобы было все более наглядно/визуально - прилагаю
ссылку на актуальную версию и мини-пояснения:
- Бледно-зеленая окружность - самая большая, желаемая граница для прочих объектов
- Ярко-зеленая окружность следует за курсором (масса 80)
- Синяя ее преследует (масса 100)
- Серые - статичные помехи (массы 60 и 120)
Чтобы вы не подумали, что я хочу, чтобы кто-то все сделал за меня - готов обсуждать конкретные куски кода, конкретные участки алгоритма.
Добавлено через 14 минут
Сейчас все реализовано по следующей схеме:
Объекты размещаются изначально так, чтобы не пересекались (это не принципиально, просто для удобства).
На событии

Код AS3:
ENTER_FRAME
я двигаю управляемый объект с некоторым шагом в направлении мыши, а преследующий объект - в направлении управляемого.
Как только каждый из этих объектов сдвинулся - я перебором

Код AS3:
for(){}
пробегаюсь по координатам центров всех мелких объектов на сцене (кроме этого самого) и считаю дистанцию между центрами передвинутого объекта и всех остальных. Тут же, если дистанция меньше, чем сумма их радиусов - нахожу дельту. Далее в зависимости от того, чья масса меньше - двигаю легкий объект на дельту в направлении от более тяжелого, опять же проверив предварительно - не даст ли такой сдвиг новую коллизию с более тяжелым объектом. Дальше запускаю дополнительную функцию на проверку - не вышел ли сдвинувшийся объект за пределы большого круга. Если вышел - сдвигаю его назад на дельту в направлении центра большой окружности. Тут бы по-хорошему опять проверять на коллизии... Вообщем, я запутан.