私はC++には新しく、splitTriangleProjectという関数を使用して再帰的に分割できるTriangleDynamicオブジェクトを実装しようとしています。それは4つの小さなTriangleDynamicオブジェクトに分割されます(そして、新しい三角形の頂点を特定の半径と原点を持つ球に投影しますが、これはポイントの横にあると思います)、新しく作成された三角形を元のオブジェクトのメンバーデータ。ベクトルメンバーデータはsubTrianglesと呼ばれます。次に、各subTriangleは、分割の特定の「レベル」が発生するまで、splitTriangleProject関数を呼び出します。C++ベクタが再帰関数でデータを失う
私が抱えている問題は、最初のレベルの分割だけが実際には適切にsubTrianglesベクトルにプッシュしているということです。私は問題が範囲外になるベクトル、または範囲外のTriangleDynamicに関係していることを確信しています。ポインタ付きの解決策がいくつかあると思います。誰かが助けることができれば、それは非常に高く評価されるだろう。ここで
は私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;
とコンストラクタ:ここ
// constructor for the TriangleDynamic object
TriangleDynamic::TriangleDynamic(const Point &P1, const Point &P2, const Point &P3)
{
p1 = P1;
p2 = P2;
p3 = P3;
init();
}
TriangleDynamic::TriangleDynamic()
{
p1 = Point(0,0,0);
p2 = Point(0,0,1);
p3 = Point(0,1,0);
init();
}
void TriangleDynamic::init()
{
edge1 = Line(p1,p2);
edge2 = Line(p2,p3);
edge3 = Line(p3,p1);
Vect U = p2.minus(p1);
Vect V = p3.minus(p1);
normal = U.cross(V);
lowestLevel = true;
triangleId = numTriangles + 1;
numTriangles = triangleId;
}
は私の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);
}
}
は、再帰的にtriangleDynamicを印刷する機能であります完了したら:
ここvoid TriangleDynamic::printTriangle()
{
cout<< "p1";
p1.printPoint();
cout << "\np2";
p2.printPoint();
cout << "\np3";
p3.printPoint();
cout << "\n\n";
if(!lowestLevel)
{
int ctr;
for (ctr=0; ctr<=subTriangles.size()-1; ctr++)
{
cout << "subTriangle\n";
subTriangles[ctr].printTriangle();
}
}
}
私は私のメインでそれを呼び出す方法です:
int main()
{
TriangleDynamic t = TriangleDynamic();
t.splitTriangleProject(0,3,Point(), 1);
t.printTriangle();
cin.get();
return 0;
}
私はこの時点であまりにも多くの投稿をしたと思います。どんな助けもありがとうございます。事前に感謝します。
それはとても簡単だった!ありがとうございました。それはうまくいったが、私はあなたの他の提案も試みるだろう。 – user1216527
ここで私の質問にきちんと答えたので、私はあなたが私の新しいジレンマを見ることができることを期待していました。圧力はないが、ここにそれがある:[リンク](http://stackoverflow.com/q/9432499/1216527) – user1216527