C++ C++;向量在递归函数中丢失数据
我遇到的问题是,实际上只有第一级分裂正确地推到了子三角向量。我确信这个问题与向量超出范围有关,或者可能与三角形动力学超出范围有关。我想有一些解决方案是用指针的。如果有人能帮忙,我将不胜感激 以下是我的三角形动态声明:C++ C++;向量在递归函数中丢失数据,c++,stl,recursion,vector,C++,Stl,Recursion,Vector,我遇到的问题是,实际上只有第一级分裂正确地推到了子三角向量。我确信这个问题与向量超出范围有关,或者可能与三角形动力学超出范围有关。我想有一些解决方案是用指针的。如果有人能帮忙,我将不胜感激 以下是我的三角形动态声明: class TriangleDynamic { public: TriangleDynamic(const Point &P1, const Point &P2, const Point &P3); TriangleDynamic();
class TriangleDynamic
{
public:
TriangleDynamic(const Point &P1, const Point &P2, const Point &P3);
TriangleDynamic();
~TriangleDynamic(){}
void printTriangle();
void splitTriangleProject( int currentLevel, int maxLevel, const Point &org, double radius);
void init();
bool operator<(const TriangleDynamic&);
bool operator>(const TriangleDynamic&);
Line edge1;
Line edge2;
Line edge3;
Point p1;
Point p2;
Point p3;
Vect normal;
bool lowestLevel;
vector<TriangleDynamic> subTriangles;
static int numTriangles;
int triangleId;
};
int TriangleDynamic::numTriangles = 0;
以下是我的splitTriangleProject函数:
void TriangleDynamic::splitTriangleProject(int currentLevel, int maxLevel, const Point &org, double radius)
{
if ( currentLevel < maxLevel)
{
lowestLevel = false;
Point worldOrigin = Point(0,0,0);
double edge1MidMag = (edge1.midpoint - org).distance(worldOrigin) ;
double edge2MidMag = (edge2.midpoint - org).distance(worldOrigin) ;
double edge3MidMag = (edge3.midpoint - org).distance(worldOrigin) ;
Point newEdge1Mid = (((edge1.midpoint) * radius )/ edge1MidMag) + org;
Point newEdge2Mid = (((edge2.midpoint) * radius )/ edge2MidMag) + org;
Point newEdge3Mid = (((edge3.midpoint) * radius )/ edge3MidMag) + org;
TriangleDynamic t1(p1 , newEdge1Mid , newEdge3Mid);
subTriangles.push_back(t1);
TriangleDynamic t2(newEdge1Mid, p2, newEdge2Mid);
subTriangles.push_back(t2);
TriangleDynamic t3(newEdge3Mid, newEdge2Mid, p3);
subTriangles.push_back(t3);
TriangleDynamic t4(newEdge1Mid, newEdge2Mid, newEdge3Mid);
subTriangles.push_back(t4);
t1.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t2.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t3.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t4.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
}
}
我想我在这一点上贴得太多了。感谢您的帮助。当您将三角形推回向量时,它将推送三角形的副本。然后在t1到t4之间递归,但这种递归不会影响已经被推到向量中的内容,因为它是一个副本。问题就在这里
TriangleDynamic t1(p1 , newEdge1Mid , newEdge3Mid);
subTriangles.push_back(t1);
TriangleDynamic t2(newEdge1Mid, p2, newEdge2Mid);
subTriangles.push_back(t2);
TriangleDynamic t3(newEdge3Mid, newEdge2Mid, p3);
subTriangles.push_back(t3);
TriangleDynamic t4(newEdge1Mid, newEdge2Mid, newEdge3Mid);
subTriangles.push_back(t4);
t1.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t2.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t3.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t4.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
请注意,在调用splitTrangleProject之前,如何将三角形的副本推送到子三角形向量中
因此,向量中的三角形没有调用splitTriangleProject
将推回移动到代码的末尾,它应该可以工作
TriangleDynamic t1(p1 , newEdge1Mid , newEdge3Mid);
TriangleDynamic t2(newEdge1Mid, p2, newEdge2Mid);
TriangleDynamic t3(newEdge3Mid, newEdge2Mid, p3);
TriangleDynamic t4(newEdge1Mid, newEdge2Mid, newEdge3Mid);
t1.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t2.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t3.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t4.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
subTriangles.push_back(t3);
subTriangles.push_back(t2);
subTriangles.push_back(t1);
subTriangles.push_back(t4);
(另外,另一方面,如果此代码开始变慢,则使用C++11 std::move可以大大加快速度。除非必须,否则不要进入指针。)在计算splitTriangleProject()中的子三角形后,需要检索它们并将其添加到类自己的列表(子三角形)。 像这样:
void splitTriangleProject( int currentLevel, int maxLevel, const Point &org, double radius)
{
// your code above
subTriangles.insert(subTriangles.begin(), t1.subTriangles.begin(), t1.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t2.subTriangles.begin(), t2.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t3.subTriangles.begin(), t3.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t4.subTriangles.begin(), t4.subTriangles.end());
}
然后需要添加一个额外的访问方法“constvector&getSubTriangles()”。(现在您似乎将所有成员变量共享为public,这不是一个好的做法)这太简单了!非常感谢。这很有效,但我也会尝试你的其他建议。既然你在这里很好地回答了我的问题,我希望你能看看我的新困境。没有压力,但这里是:谢谢!是的,在努力使事情顺利进行的过程中,我把一切都公之于众。一点也不好。
TriangleDynamic t1(p1 , newEdge1Mid , newEdge3Mid);
subTriangles.push_back(t1);
TriangleDynamic t2(newEdge1Mid, p2, newEdge2Mid);
subTriangles.push_back(t2);
TriangleDynamic t3(newEdge3Mid, newEdge2Mid, p3);
subTriangles.push_back(t3);
TriangleDynamic t4(newEdge1Mid, newEdge2Mid, newEdge3Mid);
subTriangles.push_back(t4);
t1.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t2.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t3.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t4.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
TriangleDynamic t1(p1 , newEdge1Mid , newEdge3Mid);
TriangleDynamic t2(newEdge1Mid, p2, newEdge2Mid);
TriangleDynamic t3(newEdge3Mid, newEdge2Mid, p3);
TriangleDynamic t4(newEdge1Mid, newEdge2Mid, newEdge3Mid);
t1.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t2.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t3.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
t4.splitTriangleProject( currentLevel + 1, maxLevel, org, radius);
subTriangles.push_back(t3);
subTriangles.push_back(t2);
subTriangles.push_back(t1);
subTriangles.push_back(t4);
void splitTriangleProject( int currentLevel, int maxLevel, const Point &org, double radius)
{
// your code above
subTriangles.insert(subTriangles.begin(), t1.subTriangles.begin(), t1.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t2.subTriangles.begin(), t2.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t3.subTriangles.begin(), t3.subTriangles.end());
subTriangles.insert(subTriangles.begin(), t4.subTriangles.begin(), t4.subTriangles.end());
}