作为更大程序的一部分,我需要生成由原点和点(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数组。
谢谢!
答案 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;
}
定义Point3d
和Vec3d
是非常标准的,我确信有现成的库可以做到。