
Практика 3
.docxДвижение точек при скорости 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;
}