Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практика 3

.docx
Скачиваний:
0
Добавлен:
02.07.2025
Размер:
261.85 Кб
Скачать

Движение точек при скорости 2 м/с и времени симуляции 10 секунд представлены ниже:

Ниже представлен рассчёт расстояния от центра окружностей:

Приложение

Части кода, где происходят расчёт сферической системы координат подчеркнуты. Также расставлены комментарии относительно частей кода

#include "ns3/core-module.h"

#include "ns3/network-module.h"

#include "ns3/mobility-module.h"

#include "ns3/netanim-module.h"

using namespace ns3;

int main(int argc, char *argv[])

{

// местположение точек

RngSeedManager::SetSeed(11);

double speed = 2.0;

CommandLine cmd;

cmd.Parse(argc, argv);

//точки

NodeContainer movingNodes;

movingNodes.Create(10);

MobilityHelper mobility;

Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable>();

std::map<uint32_t, Vector> initialPositions;

Ptr<ListPositionAllocator> posAlloc = CreateObject<ListPositionAllocator>();

//координаты точек между 50 и 150 метрами

for (uint32_t i = 0; i < movingNodes.GetN(); ++i)

{

double angle = uv->GetValue(0.0, 2 * M_PI);

double r = uv->GetValue(50.0, 150.0);

double x = r * std::cos(angle);

double y = r * std::sin(angle);

posAlloc->Add(Vector(x, y, 0.0));

initialPositions[i] = Vector(x, y, 0.0);

}

mobility.SetPositionAllocator(posAlloc);

mobility.SetMobilityModel("ns3::ConstantVelocityMobilityModel");

mobility.Install(movingNodes);

// скорость по "осям"

for (uint32_t i = 0; i < movingNodes.GetN(); ++i)

{

Ptr<MobilityModel> mob = movingNodes.Get(i)->GetObject<MobilityModel>();

Vector pos = mob->GetPosition();

double norm = std::sqrt(pos.x * pos.x + pos.y * pos.y);

double vx = speed * pos.x / norm;

double vy = speed * pos.y / norm;

Ptr<ConstantVelocityMobilityModel> velMob = movingNodes.Get(i)->GetObject<ConstantVelocityMobilityModel>();

velMob->SetVelocity(Vector(vx, vy, 0.0));

}

// точки для окружностей

int numCircleNodes = 36;

NodeContainer circle50, circle150;

circle50.Create(numCircleNodes);

circle150.Create(numCircleNodes);

MobilityHelper circMob;

circMob.SetMobilityModel("ns3::ConstantPositionMobilityModel");

Ptr<ListPositionAllocator> alloc50 = CreateObject<ListPositionAllocator>();

Ptr<ListPositionAllocator> alloc150 = CreateObject<ListPositionAllocator>();

for (int i = 0; i < numCircleNodes; ++i)

{

double angle = i * 10.0 * M_PI / 180.0;

alloc50->Add(Vector(50.0 * cos(angle), 50.0 * sin(angle), 0.0));

alloc150->Add(Vector(150.0 * cos(angle), 150.0 * sin(angle), 0.0));

}

circMob.SetPositionAllocator(alloc50);

circMob.Install(circle50);

circMob.SetPositionAllocator(alloc150);

circMob.Install(circle150);

// центральная точка

NodeContainer centerNode;

centerNode.Create(1);

// координаты центраной точки

MobilityHelper centerMobility;

Ptr<ListPositionAllocator> centerPosAlloc = CreateObject<ListPositionAllocator>();

centerPosAlloc->Add(Vector(0.0, 0.0, 0.0));

centerMobility.SetPositionAllocator(centerPosAlloc);

centerMobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");

centerMobility.Install(centerNode);

// для симуляции в NetAnim

AnimationInterface anim("anim.xml");

// размер и цвет отдаляющихся

for (uint32_t i = 0; i < movingNodes.GetN(); ++i)

{

anim.UpdateNodeSize(i, 10, 10);

anim.UpdateNodeColor(i, 255, 0, 0); // красный

}

// размер и цвет центральных

uint32_t centerNodeId = movingNodes.GetN() + circle50.GetN() + circle150.GetN();

anim.UpdateNodeDescription(centerNodeId, "");

anim.UpdateNodeSize(centerNodeId, 15, 15); // побольше

anim.UpdateNodeColor(centerNodeId, 0, 255, 0); // зелёный — как центр

//убрать подписи у точек окружностей

for (uint32_t i = movingNodes.GetN(); i < movingNodes.GetN() + circle50.GetN(); ++i)

{

anim.UpdateNodeDescription(i, "");

}

for (uint32_t i = movingNodes.GetN() + circle50.GetN(); i < movingNodes.GetN() + circle50.GetN() + circle150.GetN(); ++i)

{

anim.UpdateNodeDescription(i, "");

}

//задать время симуляции

Simulator::Stop(Seconds(10.0));

Simulator::Run();

// рассчет передвижения

std::cout << "\n--- Расстояния от центра ---" << std::endl;

for (uint32_t i = 0; i < movingNodes.GetN(); ++i)

{

// начало

Vector initPos = initialPositions[i];

double initDist = std::sqrt(initPos.x * initPos.x + initPos.y * initPos.y);

// конец

Ptr<MobilityModel> mob = movingNodes.Get(i)->GetObject<MobilityModel>();

Vector finalPos = mob->GetPosition();

double finalDist = std::sqrt(finalPos.x * finalPos.x + finalPos.y * finalPos.y);

//вывод в консоль

std::cout << "Узел " << i << ": "

<< "Начальное расстояние = " << initDist << " м, "

<< "Конечное расстояние = " << finalDist << " м, "

<< "Изменение = " << finalDist - initDist << " м"

<< std::endl;

}

Simulator::Destroy();

return 0;

}

Соседние файлы в предмете Моделирование сетевых протоколов