2012-02-17 7 views
2

私は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; 
} 

私はこの時点であまりにも多くの投稿をしたと思います。どんな助けもありがとうございます。事前に感謝します。

答えて

1

問題は、splitTrangleProjectを呼び出す前に、あなたはsubTrianglesベクターに三角形のコピーをプッシュする方法に注意してください右ここ

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); 

です。

したがって、ベクトルの三角形には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 ::動きをスピードアップすることができます。あなたがする必要がある場合を除き、ポインタに入らないでください。)

+0

それはとても簡単だった!ありがとうございました。それはうまくいったが、私はあなたの他の提案も試みるだろう。 – user1216527

+0

ここで私の質問にきちんと答えたので、私はあなたが私の新しいジレンマを見ることができることを期待していました。圧力はないが、ここにそれがある:[リンク](http://stackoverflow.com/q/9432499/1216527) – user1216527

0

三角形をベクトルにpush_backすると、三角形のコピーがプッシュされます。その後、t1からt4まで繰り返されますが、この再帰は、コピーであるため、すでにベクトルにプッシュされているものには影響しません。

0

splitTriangleProject()内のサブ三角形を計算した後、それらを取得してクラスの独自のリスト(subTriangles)に追加する必要があります。

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()); 

} 

その後、あなたは追加のアクセス方法を追加する必要があります "constのベクトル& getSubTrianglesを()":このよう 。(今すぐあなたは良い練習ではない公共のすべてのメンバー変数を共有するようだ)

+0

ありがとう!ええ、物事を働かそうとする過程で、私はすべてを公開しました。まあまあです。 – user1216527