omnet++ 之aloha示例 的动画效果分析

article/2025/7/20 20:00:18

 

void Host::refreshDisplay() const
{cCanvas *canvas = getParentModule()->getCanvas();const int numCircles = 20;const double circleLineWidth = 10;// 第一次使用时候创建:如果没有传输波形图,则创建一个圆环内部填色,创建20个圆环,用边框填色if (!transmissionRing) {auto color = cFigure::GOOD_DARK_COLORS[getId() % cFigure::NUM_GOOD_DARK_COLORS];transmissionRing = new cRingFigure(("Host" + std::to_string(getIndex()) + "Ring").c_str());transmissionRing->setOutlined(false);transmissionRing->setFillColor(color);transmissionRing->setFillOpacity(0.25);transmissionRing->setFilled(true);transmissionRing->setVisible(false);transmissionRing->setZIndex(-1);canvas->addFigure(transmissionRing);for (int i = 0; i < numCircles; ++i) {auto circle = new cOvalFigure(("Host" + std::to_string(getIndex()) + "Circle" + std::to_string(i)).c_str());circle->setFilled(false);circle->setLineColor(color);circle->setLineOpacity(0.75);circle->setLineWidth(circleLineWidth);circle->setZoomLineWidth(true);circle->setVisible(false);circle->setZIndex(-0.5);transmissionCircles.push_back(circle);canvas->addFigure(circle);}}// 如果是最后一个包出现了,则把所有的圆形和圆环挂接到最后一个数据包上if (lastPacket) {// update transmission ring and circlesif (transmissionRing->getAssociatedObject() != lastPacket) {transmissionRing->setAssociatedObject(lastPacket);for (auto c : transmissionCircles)c->setAssociatedObject(lastPacket);}simtime_t now = simTime();simtime_t frontTravelTime = now - lastPacket->getSendingTime();simtime_t backTravelTime = now - (lastPacket->getSendingTime() + lastPacket->getDuration());// 使用光速,将波形的传播时间,对应到以米为单位的距离上// distance = speed * time,// 外圈不能超过最大传输距离,最大传播距离取最小值。double frontRadius = std::min(ringMaxRadius, frontTravelTime.dbl() * propagationSpeed);// 后圈,后面的传输时间直接对应距离double backRadius = backTravelTime.dbl() * propagationSpeed;// 各个圈的距离是按照:最大传输距离 / 圈数,用边框显示颜色double circleRadiusIncrement = circlesMaxRadius / numCircles;// 更新传输环几何结构和可见性/不透明度double opacity = 1.0;// 如果超过了最大传输距离,就不要显示了if (backRadius > ringMaxRadius) {transmissionRing->setVisible(false);transmissionRing->setAssociatedObject(nullptr);}else {// 设置圆形大小的矩形框transmissionRing->setVisible(true);transmissionRing->setBounds(cFigure::Rectangle(x - frontRadius, y - frontRadius, 2*frontRadius, 2*frontRadius));// 设置内环大小transmissionRing->setInnerRadius(std::max(0.0, std::min(ringMaxRadius, backRadius)));if (backRadius > 0)opacity = std::max(0.0, 1.0 - backRadius / circlesMaxRadius);}// 圆环部分的不透明度是慢慢减小的,也就是慢慢变淡消失transmissionRing->setLineOpacity(opacity);transmissionRing->setFillOpacity(opacity/5);// 设置一个个圆圈的 几何形状与不透明度// 首先按照前波走的距离,对间距取模,作为基础半径double radius0 = std::fmod(frontTravelTime.dbl() * propagationSpeed, circleRadiusIncrement);// 对每个圆圈单独计算for (int i = 0; i < (int)transmissionCircles.size(); ++i) {// 半径按照基础半径 + 圈数 * 增量double circleRadius = std::min(ringMaxRadius, radius0 + i * circleRadiusIncrement);// 如果圆圈位于前波与后波的范围内,时候显示;否则不显示;而且透明度也是慢慢递减的,展示衰减效果if (circleRadius < frontRadius - circleRadiusIncrement/2 && circleRadius > backRadius + circleLineWidth/2) {transmissionCircles[i]->setVisible(true);transmissionCircles[i]->setBounds(cFigure::Rectangle(x - circleRadius, y - circleRadius, 2*circleRadius, 2*circleRadius));transmissionCircles[i]->setLineOpacity(std::max(0.0, 0.2 - 0.2 * (circleRadius / circlesMaxRadius)));}elsetransmissionCircles[i]->setVisible(false);}// 计算动画速度,在传输不同的阶段,动画速度是不一样的,空闲时候是1,边界时候慢,中间时候稍微快些,在INI中定义double animSpeed = idleAnimationSpeed;if ((frontRadius >= 0 && frontRadius < circlesMaxRadius) || (backRadius >= 0 && backRadius < circlesMaxRadius))animSpeed = transmissionEdgeAnimationSpeed;if (frontRadius > circlesMaxRadius && backRadius < 0)animSpeed = midtransmissionAnimationSpeed;canvas->setAnimationSpeed(animSpeed, this);}else {// hide transmission rings, update animation speedif (transmissionRing->getAssociatedObject() != nullptr) {transmissionRing->setVisible(false);transmissionRing->setAssociatedObject(nullptr);for (auto c : transmissionCircles) {c->setVisible(false);c->setAssociatedObject(nullptr);}canvas->setAnimationSpeed(idleAnimationSpeed, this);}}// update host appearance (color and text)getDisplayString().setTagArg("t", 2, "#808000");if (state == IDLE) {getDisplayString().setTagArg("i", 1, "");getDisplayString().setTagArg("t", 0, "");}else if (state == TRANSMIT) {getDisplayString().setTagArg("i", 1, "yellow");getDisplayString().setTagArg("t", 0, "TRANSMIT");}
} // end display

 


http://chatgpt.dhexx.cn/article/7cBRmtYO.shtml

相关文章

【OMNeT+INET】详解OMNeT开源库INET(一)

1、前言 在我看来&#xff0c;网络模拟器是用于评估目标系统性能和能力的方便工具&#xff0c;不同的设计方案&#xff0c;在不同的配置下不同的操作条件和运行场景下&#xff0c;可以用于帮助理解系统并获得与性能相关的参数&#xff08;例如吞吐量、延迟、稳定性、健壮性和可…

omnet结果分析anf文件

运行omnet项目,在result文件夹里生成vec 和sca 文件。这两个文件是模拟的统计信息。 我们下面来进行结果分析,首先要新建一个.anf 的分析文件。(直接双击vec文件系统会提示新建一个anf文件,finish)Finish 之后,把左侧result 文件夹里面所有的.sca、.vec 文件拖到Input fi…

一些OMNET使用心得

一些菜鸡学习心得&#xff0c;如果有错的话希望大佬能帮忙指出&#xff0c;感激不尽&#xff01;&#xff01; &#xff08;底层组织结构是大佬帮忙写的&#xff0c;感谢大佬带入门&#xff09; 项目组织 \prj \prjname \simulation \results package.ned omnet.ini n…

OMNET的安装说明

1.安装MingGW GCC编译环境的安装程序 1.下载安装包&#xff1a; http://www.mingw.org/download/installer 2.自动弹出一个窗口 3.选择下载  左栏选中basic Setup&#xff0c;右栏选中GCC和G&#xff0c;选择的方式右键 Mark for Installation 4.下载成功  点击菜单栏的In…

2022-04-21 Omnet学习笔记(一)

Omnet学习笔记&#xff08;一&#xff09; 前言 1、本机为Inspiron 5005&#xff0c;为64位&#xff0c;所用操作系统为Windos 10。所使用软件为Omnet-5.2.1。 2、推荐Omnet入门教程系列 实验现象 在网络Tictoc1中创建两个节点&#xff0c;分别命名为"tic"和"t…

OMNeT++学习(概述+框架)一

中文手册地址 之前一直学习的是mininet&#xff0c;但是所做的方向有一个开源的代码&#xff0c;和我需要的框架一样&#xff0c;它用的仿真器是Omnetpp-5.4.1。 概述 omnet是开源的基于组件的模块化的开放网络仿真平台。是离散事件仿真器&#xff0c;具备强大完善的图形界面…

OMNeT学习之OMNeT安装与运行

OMNeT学习之OMNeT安装与运行 前言 本文原创&#xff0c;创作不易&#xff0c;转载请注明&#xff01;&#xff01;&#xff01; 本人为OMNet初学者&#xff0c;如有错误&#xff0c;请不吝请教&#xff01; 最近学WSN(无线传感器网络)&#xff0c;做传感器实验&#xff0c;老…

omnet++ 快速入门 | 计算机网络仿真 | omnet++ 入门教程

文章目录 omnet1 网络仿真软件综述01 wsn仿真软件02 为什么使用omnet03 学习资料04 目标 2 omnet介绍1 omnet安装与启动2 使用omnet仿真的一般步骤3 新建项目 3 定义仿真网络的拓扑结构01 新建一个空的 network02 Module的概念01-Module的概念02-Module Type的定义步骤1. ned文…

无图无真相!设计模式概览

设计模式太多&#xff0c;最近没有更新&#xff0c;最后想想还是看一点更新一点吧。

Mac系统Safari浏览器启动无图模式

有的时候我们用热点上网&#xff0c;图片的出现会消耗大量的流量&#xff0c;这时候就需要启动无图模式不加载图片。 步骤&#xff1a;启动Safari浏览器->偏好设置->高级->勾选“在菜单栏中显示“开发”菜单”->点击开发菜单->勾选“停用图像” 转载于:https://…

无图无真相!工厂模式结构

抽象类工厂模式结构图&#xff1a; 接口类工厂模式结构图&#xff1a; 工厂模式示例代码 工厂静态方法说明

设计模式之代理模式(Proxy Pattern)

1.概念 为其他对象提供一种代理&#xff0c;以控制对这个对象的访问。代理对象起到中介作用&#xff0c;可去掉功能或者增加额外功能。 2.角色 抽象主题角色&#xff08;Subject&#xff09;&#xff1a;声明了目标对象和代理对象的共同接口&#xff0c;这样一来在任何可以使用…

树莓派4B配置Selenium库+设置无图无头属性

写一个树莓派4B配置selenium库&#xff0c;并成功调用浏览器进行自动化爬虫 本文会手把手教你配置环境&#xff0c;并带你写第一个selenium爬虫程序 使用版本说明 系统&#xff1a;官网2020-02-13-raspbian-buster-full Python&#xff1a;树莓派自带的3.7.3 以下所有的pip操…

屏蔽图片的chrome插件

有时候觉得CSDN博客的广告好烦啊&#xff0c;还有有些看小说的网站&#xff0c;于是找了个屏蔽图片的插件。 效果如图&#xff1a; 之前博客的广告 之后&#xff1a; CSDN的广告有字&#xff0c;所以不会完全不显示&#xff0c;但是有很多小说网站都可以直接全部屏蔽掉…

python selenium playwright库使用教程 破解网页防止开发者模式 截取数据请求

安装chromedriver 下载 chromedriver的版本一定要与Chrome的版本一致&#xff0c;不然就不起作用。 有两个下载地址&#xff1a; 1、http://chromedriver.storage.googleapis.com/index.html 2、CNPM Binaries Mirror 当然&#xff0c;你首先需要查看你的Chrome版本&…

360浏览器,怎么开启无图片模式,在开热点的时候,省流量

如果某些网站&#xff0c;我需要加载图片&#xff0c;如csdn上传图片的时候。 这时候我们需要进行放权&#xff1a;

【Playwright】关于无痕模式与无头模式

Playwright的无头模式和无痕模式 无头模式 无头模式指的是自动测试框架在执行过程中不打开浏览器窗口的功能。在Playwright中&#xff0c;关闭无头模式会在测试代码执行过程中显示浏览器窗口&#xff0c;执行的过程会显示在浏览器的上。 # 以下代码以Playwright的同步API为例…

爬虫之selenium开启无界面模式

绝大多数服务器是没有界面的&#xff0c;selenium控制谷歌浏览器也是存在无界面模式的&#xff08;又称之为无头模式&#xff09; 开启无界面模式的方法 实例化配置对象 options webdriver.ChromeOptions()配置对象添加开启无界面模式的命令 options.add_argument("--he…

locust入门 -6 无图模式和分布式执行

无图模式 无图模式即不通过UI界面进行执行locust测试用例。locust提供了命令参数&#xff0c;我们只需要在执行时添加一个--headless标签即可 “Disable the web interface, and start the test immediately. Use -u and -t to control user count and run time ” 以下内容为…

Python爬虫配置Selenium库+设置无图无头属性

出一个最新windows下配置selenium全环境的教程~ 本文会手把手教你配置环境&#xff0c;并带你写第一个selenium爬虫程序 环境配置 1.安装Selenium库 Python和Anaconda-Python中并不包含Selenium包&#xff0c;这里我们要安装一下Selenium这个包 以下三种方式认选一种即可&am…