作业1-画三角形
1 工程架构
2 Cpp原生特性
2.1 std::map
std::map<int, std::vector<Eigen::Vector3f>> pos_buf;
像下面这样根据id获得对应数据
pos_buf[pos_buffer.pos_id];
2.2 std:fill
std::fill(frame_buf.begin(), frame_buf.end(), Eigen::Vector3f{0, 0, 0});
std::fill(depth_buf.begin(), depth_buf.end(),
std::numeric_limits<float>::infinity());
2.3 enum class
enum class Primitive
{
Line,
Triangle
};
像下面这样使用
r.draw(pos_id, ind_id, rst::Primitive::Triangle);
2.4 &引用
auto& buf = pos_buf[pos_buffer.pos_id];
&:表示buf是引用而非独立变量,对buf的读写会直接作用于pos_buf[pos_buffer.pos_id]本身
2.5 for循环
for (auto& i : ind)
- 基于范围的 for 循环(Range-based For Loop),用于遍历容器或可迭代对象。
- 核心要素解析:
auto:自动推导迭代变量i的类型,无需手动指定(如容器元素类型)。&:表示i是引用类型(非拷贝),修改i会直接改变容器ind中对应元素的值;若去掉&,i为元素拷贝,修改不影响原容器。ind:被遍历的 “可迭代对象”,常见为 STL(Standard Template Library)容器(如vector、list、array)、数组或自定义的可迭代类型。
- 功能作用:遍历
ind中的每一个元素,依次将元素赋值给引用i,执行循环体逻辑(代码中未展示循环体)。 - 优势:简化遍历代码,避免传统
for循环中索引 / 迭代器的手动管理,降低出错概率。
2.6 异常处理
2.6.1 throw
throw std::runtime_error("Invalid color values");
3 第三方库
3.1 Eigen
3.1.1 Eigen::Matrix4f
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
// TODO: Implement this function
// Create the model matrix for rotating the triangle around the Z axis.
// Then return it.
float angle = rotation_angle / 180 * MY_PI;
model << std::cos(angle), -std::sin(angle), 0, 0,
std::sin(angle), std::cos(angle), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;
3.2 OpenCV
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data()); image.convertTo(image, CV_8UC3, 1.0f);
cv::imshow("image", image);
key = cv::waitKey(10);
这段代码是基于 OpenCV 库的图像显示逻辑,将渲染器的帧缓冲区数据显示到屏幕上
3.2.1 创建OpenCV图像矩阵
cv::Mat image(700, 700, CV_32FC3, r.frame_buffer().data());
创建一个 OpenCV 的
cv::Mat对象(图像矩阵),并将其数据指针直接关联到渲染器的帧缓冲区(frame_buffer),避免数据拷贝,提高效率。
700, 700:图像的高度(rows)和宽度(cols),即 700x700 像素。CV_32FC3:图像的数据类型。CV_32F表示每个通道是 32 位浮点数(float),C3表示 3 个颜色通道(通常对应 RGB 或 BGR)。r.frame_buffer().data():渲染器(r)的帧缓冲区数据的起始地址。帧缓冲区是存储像素颜色信息的内存区域,这里直接将cv::Mat的数据指针指向该区域,实现 “零拷贝” 关联。
3.2.2 转换图像数据类型(适配显示需求)
image.convertTo(image, CV_8UC3, 1.0f);
将图像从 32 位浮点型(
CV_32FC3)转换为 8 位无符号整型(CV_8UC3),因为大多数显示设备和图像格式使用 8 位数据(0-255 范围)。
- 第一个
image:源图像(输入)。 - 第二个
image:目标图像(输出,这里覆盖原图像)。 CV_8UC3:目标数据类型。CV_8U表示每个通道是 8 位无符号整数(uchar),C3仍为 3 个通道。1.0f:缩放因子。转换时会将源数据(32 位浮点数)乘以该因子后截断为 8 位整数。若帧缓冲区的浮点数范围是[0.0, 255.0],乘以 1.0f 后直接转为[0, 255]的 8 位值;若原范围是[0.0, 1.0],则需要用255.0f作为缩放因子(否则图像会过暗)。
3.2.3 显示图像到窗口
cv::imshow("image", image);
在名为
"image"的窗口中显示转换后的图像。若窗口不存在,imshow会自动创建一个名为"image"的窗口;若已存在,则更新窗口内容。
3.2.4 等待用户输入
key = cv::waitKey(10);
暂停程序执行,等待用户按键输入,最多等待 10 毫秒(参数单位为毫秒)。若在 10 毫秒内有按键按下,返回该按键的 ASCII 码(如 ESC 键是 27);若超时无按键,返回
-1。
评论
如果你已登录 GitHub,就可以直接在这里评论。
