首页 > 解决方案 > 为什么我在 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;
}

标签: c++if-statementeigen

解决方案


因此,在@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;
        }
    }
}

推荐阅读