C++ C++;在gridmap中表示摄影机覆盖区域的最有效方法

C++ C++;在gridmap中表示摄影机覆盖区域的最有效方法,c++,arrays,camera,2d,C++,Arrays,Camera,2d,我目前正在从事一个项目,其中一个机器人在一个表示为nxngridmap(比如100x100,但将来会大得多)的环境中行驶,我将该环境建模为int的2D数组。该区域由摄像机观察。机器人知道哪个摄像头覆盖哪个区域,并且能够在稍微超出摄像头视野范围的范围内远程停用摄像头。它必须想出一个计划,在不被注意的情况下穿越环境 现在,我需要知道哪个区域是由哪个摄像头拍摄的。为了简单起见,让我们假设所有相机都有圆形视场。现在,如果例如,camera1捕捉到某个区域,我想在数组的该区域放置一个1。到目前为止,一切顺

我目前正在从事一个项目,其中一个机器人在一个表示为
nxn
gridmap(比如
100x100
,但将来会大得多)的环境中行驶,我将该环境建模为
int
2D数组。该区域由摄像机观察。机器人知道哪个摄像头覆盖哪个区域,并且能够在稍微超出摄像头视野范围的范围内远程停用摄像头。它必须想出一个计划,在不被注意的情况下穿越环境

现在,我需要知道哪个区域是由哪个摄像头拍摄的。为了简单起见,让我们假设所有相机都有圆形视场。现在,如果例如,
camera1
捕捉到某个区域,我想在数组的该区域放置一个
1
。到目前为止,一切顺利。但是如果有第二个(也许是第三个)摄像机的视场重叠呢?我如何在gridmap中表示这种重叠

到目前为止,我的想法是:

  • 将摄像头id添加到网格中-例如,如果
    摄像头1
    覆盖了某个视野,则将其填充为
    1的
    。如果
    摄像机2的视野重叠,用
    1+2=3
    填充重叠区域。缺点:n个摄像机的可能数量是指数型的,很难追溯一个数字是如何计算的-例如,
    6
    可能是
    5号摄像机
    重叠
    1号摄像机
    ,也可能是
    2号摄像机
    重叠
    4号摄像机
  • 将摄像头id连接到网格中-对于
    cam 1
    cam 2
    的重叠,将
    12
    放入网格中。对于
    凸轮1、2和3的重叠,将
    123
    放入网格中。优点:仅限整数运算,速度较快。缺点:在整数范围内只有尽可能多的摄像头有数字(
    32位的
    int\u max
    4294967295
    ,所以最多10个摄像头)

有什么帮助或想法吗?甚至是解决这类问题的文献或算法?编程语言将是C++。p> 对于每个特定的摄像头,您可以在
int
中使用一个位。但是,如果处理单个位,
无符号int
更可取:假设32位int,
1为不同的摄像机使用不同的位?摄像机n,设置位:
field |=1很好的答案,因为它比串联摄像机id更快。不过,这并不能真正解决这种方法的缺点——int_max保持不变,因此最多有10个摄像头。编辑:刚刚看到你的编辑。说得好。你能想到什么缺点吗?我个人更愿意使用
头的类型,例如。g<代码>uint32\u t
。然后你可以依赖于精确的位数。位处理需要一些额外的CPU周期-但是你不应该真正注意到,除非你有一些极端的性能要求(我在超过15年的工作经验中只出现过一次…)。在仔细考虑之后,我建议你给出一个答案,这样我就可以接受它作为最佳答案。
unsigned int field;

// setting the bit for camera ID n (zero based):
field |= 1U << n;

// clearing the bit for camera ID n (zero based):
field &= ~(1U << n);

// reading the bit:
bool isSet = (field & ~(1U << n)) != 0;
struct Field
{
    uint32_t  _0 : 1;
    uint32_t  _1 : 1;
    // ...
    uint32_t _31 : 1;
};