跳转至

作业1-画三角形

1 工程架构

Pasted image 20251022091251.png

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)
  1. 基于范围的 for 循环(Range-based For Loop),用于遍历容器或可迭代对象。
  2. 核心要素解析
    • auto:自动推导迭代变量 i 的类型,无需手动指定(如容器元素类型)。
    • &:表示 i 是引用类型(非拷贝),修改 i 会直接改变容器 ind 中对应元素的值;若去掉 &i 为元素拷贝,修改不影响原容器。
    • ind:被遍历的 “可迭代对象”,常见为 STL(Standard Template Library)容器(如 vectorlistarray)、数组或自定义的可迭代类型。
  3. 功能作用:遍历 ind 中的每一个元素,依次将元素赋值给引用 i,执行循环体逻辑(代码中未展示循环体)。
  4. 优势:简化遍历代码,避免传统 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,就可以直接在这里评论。