2012-02-17 31 views
2

我對C++非常陌生,我試圖實現一個TriangleDynamic對象,它可以使用名爲splitTriangleProject的函數遞歸地自我分割。它將自己分解成四個較小的TriangleDynamic對象(並將新三角形的頂點投影到具有給定半徑和原點的球體上,但我相信這不在這一點上),將新創建的三角形推入作爲原始對象的成員數據。矢量成員數據稱爲subTriangles。然後,每個子三角形都會調用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

問題就在這裏

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 ::舉動。不要進入指針,除非你要。)

+0

太簡單了!謝謝。它的工作,但我會嘗試你的其他建議。 – user1216527 2012-02-17 16:26:45

+0

既然你在這裏很好地回答了我的問題,我希望你能看看我的新困境。沒有壓力,但這裏是:[鏈接](http://stackoverflow.com/q/9432499/1216527) – user1216527 2012-02-24 18:03:17

0

當您將三角形push_back到矢量中時,它將推送三角形的副本。然後,您將t1遞歸到t4,但此遞歸不會影響已被推入向量中的內容,因爲它是副本。

0

在計算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()); 

} 

然後,你需要添加額外的訪問方法 「常量矢量& getSubTriangles()」。(現在你似乎將所有成員變量作爲公共共享,這不是一個好的做法)

+0

謝謝!是的,在試圖讓事情發揮作用的過程中,我公開了一切。一點都不好。 – user1216527 2012-02-17 16:29:15