C++尝试生成每个可能的点集,给定最大/最小x/y/z值,n个要设置的点数和m值,以增量
我之前发布了这个问题,但我想我已经解释过了不好。本质上,我想要生成所有可能的大小为n的点集,其中包含由用户给出的由原点(0,0,0)和点(Y1,Y2,Y3)限定的区域内的点,其中设置的值为m增加。C++尝试生成每个可能的点集,给定最大/最小x/y/z值,n个要设置的点数和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)
这是我最初尝试过的,但它只是真正做我想要的每个单独的点,并没有找到正确的整体集(pointset是已在主程序中创建的大小为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也会更快,对于这种类型的项目,您可能需要一些性能。
堆栈溢出处理软件问题。您尚未遇到软件问题,因此您处于劣势。您可以发布“这是我的计划,任何人都可以看到问题吗?”问题或者你可以发表“我已经通过下面的研究寻找一个可行的解决方案来解决我的问题并且卡住了,我应该在哪里看下一个?”的问题。 – user4581301