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

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em