C++基础入门:Ex_DrawText实例与程序结构详解

需积分: 9 4 下载量 162 浏览量 更新于2024-07-13 收藏 4.01MB PPT 举报
本资源是《Visual_C++_实用教程(第3版)》中的课件部分,主要讲解了C++语言的基础概念和编程实践。章节内容包括C++语言的发展背景,以及如何进行C++程序的结构设计。首先,C++是由贝尔实验室在20世纪80年代设计,作为C语言的增强版本,引入了面向对象编程特性,使其成为当前最广泛使用的编程语言。 在课程的第1章,重点介绍了C++程序的基本结构。这部分通过实例来帮助理解,例如: 1.1.1 [例Ex_Simple1]展示了如何创建一个简单的C++程序,涉及到声明变量、输入数据(如圆的半径)、计算圆的面积,并将结果输出到屏幕上。这个例子突出了C++程序的基本元素,如`#include`指令用于引入库,`void main()`是程序的入口点,以及使用`cout`和`cin`进行输入输出操作。 1.1.2 [例Ex_Simple2]则展示了如何使用循环结构(如`for`循环)在屏幕上输出一个星号三角形,这涉及到了函数的声明和调用,以及利用`DoDraw`函数控制输出的星号数量和行数。 1.1.3 [例Ex_Simple3]是一个类的简单应用,使用`class`关键字定义了一个名为`CDrawArray`的类,包含一个公共成员函数`DoDraw`。这个例子演示了如何使用类来组织代码,提高代码的复用性和封装性。 通过这些实例,学生可以学习C++的关键语法,如数据类型、运算符、表达式、函数、预处理器指令,以及类和对象的概念。同时,读者还应该注意,学习前可能需要先完成实验1,以确保对基础内容有充分的理解。在整个学习过程中,读者将逐步掌握如何编写和调试C++程序,为后续更复杂的编程项目打下坚实的基础。

我有一个函数用于为一帧YUV420的图像叠加文字: static void mysese(char* yuvBuffer, int width, int height){ AVFrame *frame = av_frame_alloc(); frame->format = AV_PIX_FMT_YUV420P; frame->width = width; frame->height = height; frame->data[0] = yuvBuffer; // Y 数据 frame->data[1] = yuvBuffer + width * height; // U 数据 frame->data[2] = yuvBuffer + width * height * 5 / 4; // V 数据 AVFilterGraph *graph = avfilter_graph_alloc(); AVFilter *input_filter = avfilter_get_by_name("buffer"); AVFilterContext *input_ctx = avfilter_graph_alloc_filter(graph, input_filter, "input"); // 创建叠字滤镜 AVFilter *drawtext_filter = avfilter_get_by_name("drawtext"); AVFilterContext *drawtext_ctx = avfilter_graph_alloc_filter(graph, drawtext_filter, "drawtext"); // 设置叠字参数 av_opt_set(drawtext_ctx, "text", "Hello World", AV_OPT_SEARCH_CHILDREN); av_opt_set(drawtext_ctx, "fontsize", "24", AV_OPT_SEARCH_CHILDREN); av_opt_set(drawtext_ctx, "fontcolor", "red", AV_OPT_SEARCH_CHILDREN); av_opt_set(drawtext_ctx, "alpha", "0.5", AV_OPT_SEARCH_CHILDREN); av_opt_set(drawtext_ctx, "fontfile", "/home/bin/font-file/msyh.ttc", AV_OPT_SEARCH_CHILDREN); AVFilter *output_filter = avfilter_get_by_name("buffersink"); AVFilterContext *output_ctx = avfilter_graph_alloc_filter(graph, output_filter, "output"); // 连接输入滤镜和叠字滤镜 avfilter_link(input_ctx, 0, drawtext_ctx, 0); // 连接叠字滤镜和输出滤镜 avfilter_link(drawtext_ctx, 0, output_ctx, 0); avfilter_graph_config(graph, NULL); av_buffersrc_add_frame(input_ctx, frame); AVFrame *filtered_frame; while (av_buffersink_get_frame(output_ctx, filtered_frame) >= 0){ int y_size = width * height; int uv_size = y_size / 4; memcpy(yuvBuffer, filtered_frame->data[0], y_size); memcpy(yuvBuffer + y_size, filtered_frame->data[1], uv_size); memcpy(yuvBuffer + y_size + uv_size, filtered_frame->data[2], uv_size); av_frame_unref(filtered_frame); } } 但在执行到avfilter_graph_config(graph, NULL);时会报错段错误(吐核)是什么情况

2023-07-22 上传

void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(100); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getState() == false) { if (agvs[i].getLoad()){//如果是負載的狀態,則任務的起點到任務的終點 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { agvs[i].setState(true); agvs[i].setLoad(false); task_to_agv(); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path;} else { //如果是空載的狀態,則行駛到任務的起點 //如果agv已經到達任務起點,變爲負載狀態 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { agvs[i].setLoad(true); } Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path;} } //模擬小車行駛 for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); }); } } } },給出代碼畫出agv獲取path的路綫

2023-05-24 上传