在NED文件中如果涉及到图的定义,在canvas示例中的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21network 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++中可以引用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109void 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, "%dxC2xB0", 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) // reached targetPointIndex = (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 用法的全部内容,更多相关omnet++内容请搜索靠谱客的其他文章。
发表评论 取消回复