c++ - 为什么我在 for 循环中创建的值在循环体内不起作用?
问题描述
关于为什么我一直收到一个错误,说在 if(!insideTriangle(x, y, tv)) 中未在 computeBarycentri2d(x, y, tv) 处为 x 和 y 赋值值被分配为 int 值。我为每个值不断收到的错误是“未定义标识符 x”
我遇到的另一个问题是 if(zp >= depth_buf[y * width + x]) 中的 continue 语句不起作用,给我一个错误“continue 语句只能在循环中使用”。
非常感谢有关如何修复这些错误的任何帮助
void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eigen::Vector3f, 3>& view_pos)
{
std::array v = t.toVector4();
float trix[3] = {t.v[0][0], t.v[1][0], t.v[2][0] };
float triy[3] = {t.v[0][1], t.v[1][1], t.v[2][1] };
std::pair<float*, float*> xrange = std::minmax_element(trix, trix + 3);
std::pair<float*, float*> yrange = std::minmax_element(triy, triy + 3);
for (int x = std::floor(*xrange.first); x < std::ceil(*xrange.second); ++x)
for(int y = std::floor(*yrange.first); y < std::ceil(*yrange.second); ++y)
if(!insideTriangle(x, y, t.v)) continue;
auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
zp *= Z;
if(zp >= depth_buf[y * width + x]) continue;
depth_buf[y * width + x] = zp;
}
解决方案
因此,在@1201ProgramAlarm 的帮助下,我发现我需要做的就是在每个 for 循环中添加括号,从而消除了我所有的错误!
这是更新的代码:
void rst::rasterizer::rasterize_triangle(const Triangle& t, const std::array<Eigen::Vector3f, 3>& view_pos)
{
std::array v = t.toVector4();
float trix[3] = {t.v[0][0], t.v[1][0], t.v[2][0] };
float triy[3] = {t.v[0][1], t.v[1][1], t.v[2][1] };
std::pair<float*, float*> xrange = std::minmax_element(trix, trix + 3);
std::pair<float*, float*> yrange = std::minmax_element(triy, triy + 3);
for (int x = std::floor(*xrange.first); x < std::ceil(*xrange.second); ++x)
{
for(int y = std::floor(*yrange.first); y < std::ceil(*yrange.second); ++y)
{
if(!insideTriangle(x, y, t.v)) continue;
auto[alpha, beta, gamma] = computeBarycentric2D(x, y, t.v);
float Z = 1.0 / (alpha / v[0].w() + beta / v[1].w() + gamma / v[2].w());
float zp = alpha * v[0].z() / v[0].w() + beta * v[1].z() / v[1].w() + gamma * v[2].z() / v[2].w();
zp *= Z;
if(zp >= depth_buf[y * width + x]) continue;
depth_buf[y * width + x] = zp;
}
}
}
推荐阅读
- video - 下载视频
- c - C 程序是否可以访问和更改分配给另一个程序的堆中的内存地址?
- time - Python3 - 如何制作一个显示 8 秒的微调器
- python - 获取 [SSL: CERTIFICATE_VERIFY_FAILED] 即使在将安装证书添加到 docker 之后
- android - Flutter App 未在 Android Studio 中运行
- python - 如何处理灵活的输入并仅返回大写的键?
- data-lake - 在 Apache Hudi 中,可以更新特定的提交时间吗?
- javascript - 无法打开从 Flask 发送的 zip 文件
- html - 不正确怎么解决
在移动设备上格式化html?
- odata - Project Online CSOM 和 OData 操作不适用于多因素身份验证