Вступ
Boids алгоритм є відносно простий демонстрацією поведінки Емерджентні в групі. Він має три основні правила, як описав його творець Крейг Рейнольдс:
Основна модель флокінгу складається з трьох простих способів керування, які описують, як окремий маневр боїду базується на положеннях і швидкостях сусідніх флотмаків:
- Розділення : керуйте, щоб уникнути скупчення місцевих фетів.
- Вирівнювання : орієнтуйтеся на середній загін місцевих флокметів.
- Згуртованість : спрямовуйте рухатися до середньої позиції місцевих флотметів.
Кожен боїд має прямий доступ до геометричного опису всієї сцени, але стекання вимагає, щоб він реагував лише на флокметів у певному невеликому сусідстві навколо себе. Для сусідства характерні відстань (вимірюється від центру бої) та кут , виміряний від напрямку польоту боїда. Сльотовики поза цим місцевим районом ігноруються. Район можна вважати моделлю обмеженого сприйняття (як риба в каламутній воді), але, мабуть, правильніше думати про це як про визначення регіону, в якому зграї впливають на рульове керування.
Я не досконалий при поясненні речей, тому настійно рекомендую перевірити джерело . На його сайті також є кілька суперінформативних фотографій.
Виклик
Враховуючи кількість боїдів (змодельованих об'єктів) та кількість кадрів, виведіть анімацію моделювання.
- Укладки повинні бути зображені у вигляді червоного кола, а лінія всередині кола показує його заголовок, який є напрямком, на який вказує боїд:
- Кут кожної бої (як описано Рейнольдсом) повинен бути повним 300 градусів. (не 360)
- Початковий заголовок і положення кожного боїда повинні бути рівномірно випадковими (але насінними, щоб вихід все-таки визначався), а також положенням.
- Якщо радіус бої дорівнює 1, то радіус сусідства повинен бути 3.
- Кількість боїдів буде від 2 до 20.
- Кількість кадрів буде коливатися від 1-5000
- Анімація повинна відтворюватися з мінімум 10 мілісекундами на кадр і максимум на 1 секунду більше кількості боїдів. (2 боїди = 2 секунди на максимум кадру, 3 боїди = 3 секунди на максимум кадру та ін.)
- Анімація на виході повинна становити щонайменше 5 радіусів боїда на 5 боді-радіусів, що вдвічі перевищує кількість боїдів. Отже, мінімальний розмір для 2-х боїдів був би 10-боді-радіусів на 10-ти радіусів, а мінімальний для 3-х боїдів був би 15-радіових боїдів на 15-ти радіових каналів тощо.
- Радіус кожного боїда повинен бути не менше 5 пікселів і максимум 50 пікселів.
- Швидкість кожного боїда повинна бути обмежена, щоб він не переміщувався більше ніж на 1/5 свого радіуса в одному кадрі.
- Вихід повинен бути визначеним, щоб той самий вхід давав той самий вихід, якщо його запускати кілька разів.
- Якщо боїд досягає кордону, він повинен повернутись на інший бік. Так само околиці навколо кожної боїди повинні також обертатися навколо кордонів.
Правила алгоритму
У цьому випадку кожен боїд має сектор навколо нього, що охоплює 300 градусів, по центру заголовка боїда. Будь-які інші боїди в цьому "мікрорайоні" вважаються "сусідами", або (щоб використовувати термін Рейнольдса) "зграями".
Кожна боїда повинна регулювати свій заголовок, щоб уникнути зіткнень та підтримувати комфортну відстань одного боді-радіуса до своїх сусідів. (Це аспект алгоритму "Розмежування". Один радіус боїда можна обійти, але він повинен бути як гумка, відкинувшись на місце.)
Кожен боїд повинен додатково коригувати його заголовок таким чином, щоб він був ближчим до середнього заголовка інших боїдів у його сусідстві, доки він не заважає першому правилу. (Це аспект алгоритму "Вирівнювання")
Кожна боїда повинна повернути себе до середнього положення своїх флотмаків, доки це не спричинить зіткнення або суттєво не заважає другому правилу.
У своїй роботі з цього питання він пояснює це так:
Щоб побудувати імітовану зграю, ми почнемо з моделі boid, яка підтримує геометричний політ. Ми додаємо поведінку, яка відповідає протилежним силам уникнення зіткнень та заклику приєднатися до отари. Коротко викладені як правила, і в порядку зменшення пріоритетності поведінки, що призводять до імітованого зграї, є:
- Уникнення зіткнень: уникайте зіткнень із сусідськими флотманами
- Збіг швидкості: спроба співставити швидкість із сусідськими флотками
- Flock Centering: спроба триматися поруч із флеш-парками поблизу
Більш детальний опис руху:
- Стандартна реалізація алгоритму Boids зазвичай робить обчислення для кожного з правил і об'єднує його разом.
- Для першого правила боїд проходить список сусідніх боїдів у його сусідстві, і якщо відстань між собою та сусідом менше певного значення, до заголовка боїду застосовується вектор, що відштовхує боїд від сусіда.
- Для другого правила, boid обчислює середній заголовок своїх сусідів і додає невелику частину (ми використаємо 1/10 у цьому виклику) різниці між його поточним заголовком та середнім заголовком до його поточного заголовка.
- Для третього і остаточного правила, боїд усереднює позиції своїх сусідів, обчислює вектор, який вказує на цю локацію. Цей вектор помножується на ще меншу кількість, ніж те, що було використано для правила 2 (для цього завдання буде використано 1/50) та застосовано до заголовка.
- Потім боїд переміщують у напрямку свого заголовка
Ось корисна реалізація псевдокоду Алгоритму Бойдса.
Приклад введення та виведення
Вхід:Вихід:5, 190 (5 косинок, 190 кадрів)
Критерій виграшу
Це код-гольф , тому найменше рішення в байтах виграє.