C++试图在给定max/min x/y/z值、要在集合中的n个点和要递增的m个值的情况下生成每一组可能的点
C++ Trying to generate every possible set of points given max/min x/y/z values, n number of points to be in set, and m value to increment by
我之前发布过这个问题,但我觉得我解释得很糟糕。本质上,我想生成所有可能的大小为n的点集,这些点集包含由原点(0,0,0)和用户给定的点(Y1,Y2,Y3)限定的区域内的点,设置值m递增。
例如,如果n是3,m是1,并且(Y1,Y2,Y3)是(1,1,1),则生成的点集将是(每行是一个集):
(0, 0, 0) & (0, 0, 0) & (0, 0, 0)
(0, 0, 0) & (0, 0, 0) & (0, 0, 1)
(0, 0, 0) & (0, 0, 0) & (0, 1, 0)
(0, 0, 0) & (0, 0, 0) & (0, 1, 1)
(0, 0, 0) & (0, 0, 0) & (1, 0, 0)
(0, 0, 0) & (0, 0, 0) & (1, 0, 1)
(0, 0, 0) & (0, 0, 0) & (1, 1, 0)
(0, 0, 0) & (0, 0, 0) & (1, 1, 1)
(0, 0, 0) & (0, 0, 1) & (0, 0, 0)
(0, 0, 0) & (0, 0, 1) & (0, 0, 1)
(0, 0, 0) & (0, 0, 1) & (0, 1, 0)
(0, 0, 0) & (0, 0, 1) & (0, 1, 1)
(0, 0, 0) & (0, 0, 1) & (1, 0, 0)
(0, 0, 0) & (0, 0, 1) & (1, 0, 1)
(0, 0, 0) & (0, 0, 1) & (1, 1, 0)
(0, 0, 0) & (0, 0, 1) & (1, 1, 1)
.......
(1, 1, 1) & (1, 1, 1) & (1, 1, 1)
这是我最初尝试的,但它只是真正为每个单独的点做我想要的事情,而没有找到正确的整体集(点集是已经在主程序中创建的大小为n的点对象的向量,每个点初始化为(0,0,0)):
void allPoints(double Y1, double Y2, double Y3, double precision, vector<Point> pointset)
{
int count = pointset.size()-1;
while (count>=0)
{
while (pointset.at(count).getX()<Y1) //runs through every possible rectangle within rectangle created by given point Y and origin
{
while (pointset.at(count).getY()<Y2)
{
while (pointset.at(count).getZ()<Y3)
{
// insert formula to test each set with here
pointset.at(count).incZ(precision);
}
pointset.at(count).setZ(0);
pointset.at(count).incY(precision);
}
pointset.at(count).setY(0);
pointset.at(count).incX(precision);
}
count--;
}
}
我可以稍后进行,并省略任何包含重复点的集合。最后,我将使用一个特定的公式来遍历和测试每个点集,然后比较所有结果值,但我知道如何做到这一点。
我只有基本的Java/C++经验,在编写正确的循环时遇到了困难,尽管我觉得这里的解决方案很相似,我只是错过了它。我假设在这种情况下我想使用点对象的向量。
如果能帮我找到正确的方向,我将不胜感激。
如果我理解正确,您只是使用Y1、Y2和Y3基数进行计数并存储结果,因此您可以使用大小为n的std::list<unsigned short[3]>
,并像使用10基数进行计数一样进行计数(当您达到Y1时,将行重置为0,并将下一行设置为1)。当一个int[3]已满时,您知道需要清空它并转到下一个int[3]。
您需要一个countBase(const unsigned short& base)
函数,该函数在循环的每个循环中递增一个值,并在达到base
时将其重置,然后递增下一个值。当列表中的每个值都等于Y1、Y2或Y3时,程序结束。
我不知道您打算对此做什么,但您可以在每次执行循环时显示std::list的状态。
别忘了,你正在做的事情很像在你自己的奇怪基地里计数并存储结果,这不应该很难
[编辑]看过你的编辑后,我肯定认为你应该只使用一个循环,一个ushort[3]的容器,一种增加到base
的方法,并找到一种保持结果的方法,它会更容易阅读,它应该会给你想要的东西。
[编辑]我认为使用std::list也会更快,对于这种项目,您可能需要一些性能。
- 是默认情况下分配给char数组常量的值
- 一组值的零开销下标运算符
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在不工作的情况下为数组分配指针,但反过来也可以
- 如何在不迭代的情况下对数组中的每个元素调用方法
- 如何在不实例化派生类的情况下管理一组派生类枚举
- C++试图在给定max/min x/y/z值、要在集合中的n个点和要递增的m个值的情况下生成每一组可能的点
- 如何在不与标准库运算符冲突的情况下为一组相关类重载运算符?
- 为什么弦乐在代表时不会移至下一组字符
- C++:为什么创建的向量没有传递到下一组 for 循环
- 视觉C++库,用于在不使用Opencv的情况下将一组图像转换为视频
- 在给定一组规则的情况下检查罗马数字的错误
- 在不使用额外存储器的情况下,将矩阵存储在一维数组中
- 如何在不初始化每个元素的情况下为数组保留空间
- 在不指定大小的情况下分配数组
- 为什么两种情况下数组的大小都不相同
- 如何在没有名称的情况下将数据从一个数组复制到另一个数组?(C++)
- 如何在不分配内存的情况下将一维数组转换为二维数组
- 有没有一种方法可以在不使用递归的情况下迭代n维数组(其中n是变量)
- 在不使用 hash_map的情况下对数组中的重复条目进行分组