omnet++ 之canvas示例 在NED 文件中演示 @figure 用法

2023-10-10 15:08

本文主要是介绍omnet++ 之canvas示例 在NED 文件中演示 @figure 用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在NED文件中如果涉及到图的定义,在canvas示例中的代码如下:

network CarDemo
{parameters:@display("bgb=800,500");@figure[road] (type=polygon; points=100,200, 200,100, 300,50, 500,50, 650,100, 700,200, 600,300, 500,350, 400,350, 200,350, 100,300; smooth=true; lineWidth=60; zoomLineWidth=true; lineColor=grey);@figure[paint](type=polygon; points=100,200, 200,100, 300,50, 500,50, 650,100, 700,200, 600,300, 500,350, 400,350, 200,350, 100,300; smooth=true; lineWidth=3; zoomLineWidth=true; lineColor=white; lineStyle=dashed);@figure[trail](type=polyline; lineWidth=5; lineOpacity=0.6; lineColor=orange);@figure[car](type=image; image="car-top-view"; pos=0,0; anchor=c);@figure[car.antenna](type=image; image="antenna"; pos=-10,-40; anchor=nw);@figure[car.antenna.beam](type=path; path="M 10 0 L 10 -20 L 1200 -100 L 1200 100 L 10 20 Z"; fillColor=blue; fillOpacity=0.1; lineColor=blue; lineOpacity=0.1);@figure[status](type=group; transform=translate(700,20));// or, for non-zooming status area: @figure[status](type=panel; pos=700,20);@figure[status.bg](type=rectangle; pos=0,0; size=150,100; anchor=n; cornerRadius=10; fillColor=#fafdb9; fillOpacity=0.2; lineColor=#fafdb9; lineOpacity=0.4);@figure[status.distanceTitle](type=text; pos=0,20; text="Distance Travelled"; anchor=center);@figure[status.distance](type=text; pos=0,40; text="0m"; anchor=center; font=Arial,22);@figure[status.headingTitle](type=text; pos=0,70; text="Heading"; anchor=center);@figure[status.heading](type=text; pos=0,90; text="0"; anchor=center; font=Arial,22);submodules:animator: CarAnimator;
}

其中@figure的定义表示一个图,

在c++中可以引用:


void CarAnimator::initialize()
{timeStep = 1;           // 步长,步长 * 车速 = 一次移动距离speed = 2;              // 车速heading = 0;            // 车头角度angularSpeed = 0;       // 转向速度targetPointIndex = 0;   // 记录公路数据的索引distanceTravelled = 0;  // 总里程cCanvas *canvas = getParentModule()->getCanvas();canvas->setAnimationSpeed(50.0, this);// 取得公路的参数,road = check_and_cast<cPolygonFigure *>(canvas->getFigure("road"));// 拖尾数据,缺少点,需要在运动时候计算trail = check_and_cast<cPolylineFigure *>(canvas->getFigure("trail"));// 图形,@figure[car](type=image; image="car-top-view"; pos=0,0; anchor=c);car = check_and_cast<cImageFigure *>(canvas->getFigure("car"));// 天线的图形 @figure[car.antenna](type=image; image="antenna"; pos=-10,-40; anchor=nw);antenna = check_and_cast<cFigure *>(canvas->getFigureByPath("car.antenna"));// 右侧显示行驶距离文本distanceDisplay = check_and_cast<cTextFigure *>(canvas->getFigureByPath("status.distance"));// 右侧显示行驶的车头角度headingDisplay = check_and_cast<cTextFigure *>(canvas->getFigureByPath("status.heading"));// 获取下一点的数据loc = road->getPoint(targetPointIndex);// 引擎内部监控各个变量WATCH(timeStep);WATCH(loc.x);WATCH(loc.y);WATCH(speed);WATCH(heading);WATCH(angularSpeed);WATCH(targetPointIndex);WATCH(distanceTravelled);refresh();// 设置下次事件scheduleAt(simTime(), new cMessage());
}void CarAnimator::refresh() const
{double t = (simTime() - lastStep) / timeStep;ASSERT(t >= 0);ASSERT(t <= 1);// 车转向cFigure::Transform carTr;carTr.rotate(heading + angularSpeed * t);// 车移动double distance = speed * t;carTr.translate(loc.x + distance * cos(heading), loc.y + distance * sin(heading));car->setTransform(carTr);// 天线转向cFigure::Transform antTr;antTr.rotate(-2 * simTime().dbl()*M_PI/180);antenna->setTransform(antTr);// 设置状态信息char buf[20];sprintf(buf, "%.0fm", distanceTravelled);distanceDisplay->setText(buf);int degrees = -int(heading*180/M_PI);degrees = degrees - 360 * (int)floor(degrees / 360.0);sprintf(buf, "%d\xC2\xB0", degrees);headingDisplay->setText(buf);
}void CarAnimator::refreshDisplay() const
{// 其实,如果注释了这一句,也能运行,因为每个消息到达时候都进行了一个运动计算。// 但是,注释后,明显会发生顿挫感,主要是因为:?refresh();
}void CarAnimator::handleMessage(cMessage *msg)
{// 一次移动距离 =  步长,步长 * 车速double distance = speed * timeStep.dbl();// 根据角度更新当前位置loc.x += distance * cos(heading);loc.y += distance * sin(heading);// 计算下一个目标的方向Point target = road->getPoint(targetPointIndex);Point vectorToTarget = target - loc;// 距离小于某个数,则认为到了,if (vectorToTarget.getLength() < 50)  // reachedtargetPointIndex = (targetPointIndex+1) % road->getNumPoints();double targetDirection = atan2(vectorToTarget.y, vectorToTarget.x);double diff = targetDirection - heading;while (diff < -M_PI)diff += 2*M_PI;while (diff > M_PI)diff -= 2*M_PI;// ,计算车头角度heading += angularSpeed * timeStep.dbl();// 以1/30的相差角度作为一次转向速度,转向angularSpeed = diff / 30;distanceTravelled += distance;refresh();// tail作为一个队列使用,多了就弹出一个,少了就添加trail->addPoint(loc);if (trail->getNumPoints() > 500)trail->removePoint(0);lastStep = simTime();scheduleAt(simTime() + timeStep, msg);
}

其中,@figure的类型有如下几种:

@fifigure type

C++ class

中文含义

line

cLineFigure

直线

arc

cArcFigure

弧线

polyline

cPolylineFigure

折线

rectangle

cRectangleFigure

矩形

oval

cOvalFigure

椭圆

ring

cRingFigure

圆环

pieslice

cPieSliceFigure

饼图部分

polygon

cPolygonFigure

多边形

path

cPathFigure

路径

text

cTextFigure

路径

label

cLabelFigure

文本标签

image

cImageFigure

图像

icon

cIconFigure

图标

pixmap

cPixmapFigure

位图

group

cGroupFigure

 

每个图由一组属性参数来定义,属性的类型如下表:

类型

值定义格式

备注

bool

true 或者false.

 

int

整数

 

double

实数

 

double01

[0,1]之间的实数

比如透明度,不透明度

degrees

表示温度的实数

 

string

字符串

如果它包含逗号、分号、右括号或其他影响解析的字符,需要使用引号括起来

Anchor

c, center, n, e, s, w, nw, ne, se, sw, start, middle, or end.

text fifigures只能用后三个

Arrowhead :

CapStyle

none, simple, triangle, or barbed.

butt, square, or round.

箭头

Color :

 

A color in HTML format (#rrggbb), a color in HSB format (@hhssbb), or a valid SVG color name.

 

 

Dimensions :

width, height

Size given as width and height.

FigureType :

各种内置图类型

Register_Figure()

FillRule

evenodd or nonzero.

 

 

Font

typeface, size, style

 

All three items are optional. size is the font size in points. style is space-sparated list of

zero or more of the following words: normal, bold, italic, underline.

 

ImageName :

文件名

The name of an image.

Interpolation

none, fast, or best

 

JoinStyle

bevel, miter, or round

 

LineStyle

solid, dotted, or dashed

 

Point

x, y

一个点

Point2

x1, y1, x2, y2

2个点

PointList

x1, y1, x2, y2, x3, y3...

点列表

Rectangle

x, y, width, height

矩形,左上角,长宽

TagList

tag1, tag2, tag3...

 

Tint

Color, double01

Specififies tint color and the amount of tinting for images.

Transform

translate(x, y),

rotate(deg),

rotate(deg, centerx, centery),

scale(s), scale(sx, sy),

scale(s, centerx, centery),

scale(sx, sy, centerx, centery),

skewx(coeff),

skewx(coeff, centery),

skewy(coeff),

skewy(coeff, centerx),

matrix(a, b, c, d, t1, t2)

 

一个或者多个转换组成的步骤列表

由上面表格的各种类型的属性一起可以定义某个图。不同的图包含的属性不同:

类型:父类

值格式定义

备注

(fifigure) :

 

type=<FigureType>; visible=<bool>; tags=<TagList>; childZ=<int>;transform=<Transform>;

基类

(abstractLine) : fifigure

 

lineColor=<Color>; lineStyle=<LineStyle>; lineWidth=<double>;

lineOpacity=<double>; capStyle=<CapStyle>; startArrowhead=<Arrowhead>;

endArrowhead=<Arrowhead>; zoomLineWidth=<bool>;

抽象类

line : abstractLine

points=<Point2>

直线

arc : abstractLine

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>;

startAngle=<degrees>; endAngle=<degrees>

弧线

polyline : abstractLine

points=<PointList>; smooth=<bool>; joinstyle=<JoinStyle>

折线

(abstractShape) : fifigure

 

lineColor=<Color>; fillColor=<Color>; lineStyle=<LineStyle>;

lineWidth=<double>; lineOpacity=<double01>; fillOpacity=<double01>;

zoomLineWidth=<bool>

图形类

rectangle : abstractShape

 

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>;

cornerRadius=<double>|<Dimensions>

矩形

oval : abstractShape

 

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>

 

椭圆

ring : abstractShape

 

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>;

innerSize=<Dimensions>

 

圆环

pieslice : abstractShape

 

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>;

startAngle=<degrees>; endAngle=<degrees>

 

饼图部分

polygon : abstractShape

 

points=<PointList>; smooth=<bool>; joinStyle=<JoinStyle>; fillRule=<FillRule>

 

多边形

path : abstractShape

 

path=<string>; offset=<Point>; joinStyle=<JoinStyle>; capStyle=<CapStyle>;

fillRule=<FillRule>

路径

(abstractText) : figure

 

pos=<Point>; anchor=<Anchor> text=<string>; font=<Font>; opacity=<double01>;

color=<Color>;

 

抽象文字

label : abstractText

 

angle=<degrees>;

 

标签

text : abstractText

 

 

文本框

(abstractImage) : figure

 

bounds=<Rectangle> pos=<Point>; size=<Dimensions>; anchor=<Anchor>;

interpolation=<Interpolation>; opacity=<double01>; tint=<Tint>

 

抽象图片

image : abstractImage

image=<ImageName>

 

图像

icon : abstractImage

image=<ImageName>

图标

pixmap : abstractImage

resolution=<Dimensions>

位图

 

 

这篇关于omnet++ 之canvas示例 在NED 文件中演示 @figure 用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/181235

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队