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实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Go Gorm 示例详解

《GoGorm示例详解》Gorm是一款高性能的GolangORM库,便于开发人员提高效率,本文介绍了Gorm的基本概念、数据库连接、基本操作(创建表、新增记录、查询记录、修改记录、删除记录)等,本... 目录1. 概念2. 数据库连接2.1 安装依赖2.2 连接数据库3. 数据库基本操作3.1 创建表(表关

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s