如何从数组计算索引 [已关闭]

How to calculate index from array [closed]

提问人:Lenarolla 提问时间:7/29/2023 最后编辑:HudsonLenarolla 更新时间:7/30/2023 访问量:83

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

4个月前关闭。

我想计算哪个索引保存包含位图数据的向量内的 X/Y 坐标数据。

int receiveBitmapCoordinateIndex(int x, int y, int bmp_width, int bmp_height) {
    int final = 0;

    // Y
    final += bmp_width * (bmp_height - y);

    // X
    final += x - 1;

    return final;
    //((((bmp_height)-(y)) * bmp_width) + x);
}
int main()
{   
    std::cout <<"Should be: 249 999 func:" << receiveBitmapCoordinateIndex(1, 1, 500, 500) << "\n";
    std::cout << "Should be: 249 998 func:" << receiveBitmapCoordinateIndex(2, 1, 500, 500) << "\n";
    std::cout << "Should be: 0 func: " << receiveBitmapCoordinateIndex(500, 500, 500, 500) << "\n";
system("pause");
}

向量的大小为 500 * 500 = 250 000,但第一个索引为 0,最后一个索引为 249 999。

位图数据是颠倒的,这意味着 X:1 Y:1 将是 249 999,我的数学做错了什么?

我试着改变数学,但我似乎无法让它工作,老实说,我不确定我做错了什么。

C++ 数学 向量

评论

0赞 john 7/29/2023
代码中的数学似乎很好,当你自己计算它时,问题就开始了。X:1 Y:1 应该是 249 500,只有 Y 轴反转。
0赞 fabian 7/29/2023
我建议使用从 0 开始的索引。否则,您很快就会与 C++ 数组/向量混淆。在从 0 开始的事件发生的情况下,您可以简单地写 从 / 的每次出现中减去 1 得出您的公式。顺便说一句:我不建议使用关键字作为标识符,即使你被允许这样做。我的建议:使用.size_t receiveBitmapCoordinateIndex(size_t x, size_t y, size_t bmp_width, size_t bmp_height) { return x + (bmp_height - 1 - y) * bmp_width; }xyfinalresult
0赞 Lenarolla 7/29/2023
谢谢@fabian,现在我明白问题出在哪里了,感谢你的例子和解释!你知道一个很棒的课程,我可以学习如何编写更好的代码并熟悉 C++ 吗?
0赞 fabian 7/29/2023
@Lenarolla 取决于您的编程经验,以及您希望获得的C++体验级别以及您希望获得的语言标准。learncpp.com 似乎是一个不错的起点,但如果你想编写高质量的代码,那么在完成这样的教程后,你可能遇到的最好的事情是,一个有经验的程序员审查你编写的代码的中等大小部分(并迭代,直到你对质量感到满意),并获得关于需要改进的领域的反馈。这个问题基本上只是一个数学问题,而不是 C++ 问题。
0赞 Mike 'Pomax' Kamermans 7/29/2023
(还要记住,要求推荐书籍、课程等在这里是题外话,并且会关闭问题,并可能标记您的评论)

答:

0赞 knoxgon 7/30/2023 #1

对于位图数据,调整函数以减去并保持不变。ybmp_height + 1x

Pixel (1,1)对应于数组的末尾,(width、height)对应于数组的开头。

int receiveBitmapCoordinateIndex(int x, int y, int bmp_width, int bmp_height) {
    int final = 0;

    // Y
    //final += bmp_width * (bmp_height - y);
    final += bmp_width * (bmp_height + 1 - y); //<---- here

    // X
    //final += x - 1;
    final += x; //<---- here

    // Subtracting one because array indexing starts from 0
    final -= 1;

    return final;
}

int main()
{   
    std::cout << "Should be: 249 999 func: " << receiveBitmapCoordinateIndex(1, 1, 500, 500) << "\n";
    std::cout << "Should be: 249 998 func: " << receiveBitmapCoordinateIndex(2, 1, 500, 500) << "\n";
    std::cout << "Should be: 0 func: " << receiveBitmapCoordinateIndex(500, 500, 500, 500) << "\n";
    system("pause");
}

评论

0赞 Lenarolla 7/30/2023
感谢@knoxgon还显示我做错了哪些细节。