C ++ - 如何通过将x / y / z递增给定值x

时间:2017-10-13 08:47:18

标签: c++ arrays recursion vector 3d

作为更大程序的一部分,我需要生成由原点和点(Y1,Y2,Y3)形成的矩形棱镜中包含的每一组可能的3D坐标点,给定点数n,在集合中,以及x / y / z值增加的值。

这是我最初编写的内容,它可以正确地为单个点循环遍历所有可能的坐标,但不能正确生成所需的所有点的整体组合。

在程序中我创建了一个点对象,并创建了一个点对象矢量,默认的x / y / z值为零。

void allPoints(double Y1, double Y2, double Y3, double increment, vector<Point> pointset)
{
int count = pointset.size()-1;

while (count>=0)
{
    while (pointset.at(count).getX()<Y1) 
    {
        while (pointset.at(count).getY()<Y2)
        {
            while (pointset.at(count).getZ()<Y3)
            {
                //insert intended statistical test to be run on each possible set here 
            }
            pointset.at(count).setZ(0);
            pointset.at(count).incY(increment);
        }
        pointset.at(count).setY(0);
        pointset.at(count).incX(increment);

    }
    count--;
}

}

我是编码的新手,可能正在接近这个完全错误,我只是在寻找帮助朝着正确的方向前进。如果使用点对象不是方法,那么在程序的其余部分中不需要它 - 我可以使用3d数组。

谢谢!

2 个答案:

答案 0 :(得分:0)

主要问题似乎是您的文字描述是关于创建一个点集。计数不是预先知道的。示例代码采用已创建的pointset。那是行不通的。

这也是为什么你最终得到// insert test here - 这不是测试的位置,你可以在哪里添加新点到你拥有的点集创造。

答案 1 :(得分:0)

让我们假设你有一个类Point3d代表一个点,Vec3d代表一个可以转换点的向量(定义了适当的运算符)。 在这种情况下,这应该是这样的:

std::vector<Point3d> CrystalNet(
    size_t size,
    const Point3d& origin,
    const Vec3d& a = { 1, 0, 0 },
    const Vec3d& b = { 0, 1, 0 },
    const Vec3d& c = { 0, 0, 1 })
{
    std::vector<Point3d> result;
    result.reserve(size * size * size);

    for (int i = 0; i < size; ++i)
    for (int j = 0; j < size; ++j)
    for (int k = 0; k < size; ++k) {
         result.empalce_back(origin + a * i + b * j + c * k);
    }
    return result;
}

定义Point3dVec3d是非常标准的,我确信有现成的库可以做到。