Similar presentations:
Моделирование замкнутой биологической системы
1.
Моделирование замкнутойбиологической системы
Выполнила
Тротнер К.И.
ЕТ-212
2.
Постановка задачиНеобходимо разработать библиотеку классов для моделирования и визуализации замкнутой биологической системы,
включающей один или более видов корма, травоядных и хищников. Разные виды должны отличаться скоростью и
поведением.
Моделирование происходит на плоскости, ограниченной прямоугольником. При визуализации для разных видов
объектов используются разные формы (круг, квадрат, треугольник) и цвета.
Анализ предметной области выявляет, что корм, травоядные и хищники должны быть представлены в виде классов,
которые будут содержать их общие характеристики (например скорость, сытость), а также специфические для каждого
типа параметры.
Объекты системы:
•Корм: объект, который служит источником пищи для травоядных.
Виды: трава, клевер.
•Травоядные: объекты, которые питаются кормом.
Виды: зайцы, козы.
•Хищники: объекты, которые питаются травоядными.
Виды: волки, лисы.
3.
Иерархия классов4.
Виртуальные методы в базовых классах (BiologicalObject, Food, Herbivore, Predator)позволяют расширять функциональность подклассов, добавляя специфическое
поведение для каждого типа объектов.
Константы-параметры, такие как EATING_DISTANCE или HUNT_DISTANCE,
могут быть изменены для настройки поведения объектов в симуляции.
Доступ к единственному объекту симуляции осуществляется через метод
Simulation::instance().
5.
Особенности реализацииvoid Herbivore::behave() {
auto[nearestFood, minDistanceToFood] =
Simulation::instance().findNearestObject<Food>(x, y);
auto[nearestPredator, minDistanceToPredator] =
Simulation::instance().findNearestObject<Predator>(x, y);
double distance;
double dx = 0;
double dy = 0;
if (nearestPredator && minDistanceToPredator <=
HUNT_DISTANCE) {
dx = x - nearestPredator->getX();
dy = y - nearestPredator->getY();
if(x < margin x > width-margin){
dx=0;
if(y < margin y > height-margin) dy = 0;
else dy = (dy < 0) ? -speed : speed;
} else if(y < margin || y > height-margin){
dy = 0;
dx = (dx < 0) ? -speed : speed;
} else{
dx = (dx<0) ? -speed : speed;
dy = (dy < 0) ? -speed : speed;
}
x+=dx;
y+=dy;
}
else if (nearestFood && minDistanceToFood <= EATING_DISTANCE) {
satiety += nearestFood->getSize();
Simulation::instance().removeObject(nearestFood);
return;
} else if(nearestFood){
dx = nearestFood->getX() - x;
dy = nearestFood->getY() - y;
distance= hypot(dx, dy);
if(distance){
dx/=distance;
dy/=distance;
}
x+= dx*speed;
y+=dy*speed;
}
changeSatiety(0.4);
}
6.
Функция Herbivore::behave() определяет поведение травоядного:• Ищет ближайшую еду и хищника с помощью findNearestObject.
• Если хищник в пределах HUNT_DISTANCE, убегает от него.
• Если еда в пределах EATING_DISTANCE, съедает её, удаляя из симуляции, и
увеличивает сытость.
• Если есть еда, но не в зоне поедания, перемещается к ней.
• Уменьшает сытость.
7.
Пример работы программы1
2
8.
34
9.
ЗаключениеВ ходе выполнения курсовой работы были выявлены объекты
предметной области и определена система классов для них, разработан
интерфейс программы. После объектно-ориентированного
проектирования классы были реализованы на языке С++.
Разработанный код был проверен на контрольных тестах и в код были
внесены необходимые исправления. Для программы была разработана
документация, описывающая её установку и использование. Таким
образом, цель работы была достигнута, задачи – решены.
biology