2012-07-09 56 views
2

我正在使用一個項目的VTK,似乎無法弄清楚它的一部分。我試圖遍歷幾千個點,並找到每個點最接近的5個點。看起來像一個簡單的循環操作,但我的問題是,由於某種原因,我被告知相同的5分是我的數據中每個點的最近點...我知道這是不正確的。我將附加代碼比特我描述下圖:如何在找到每個點的最近鄰點時迭代VTK中的點?

//test 
    vtkSmartPointer<vtkPointSource> pointSource = 
    vtkSmartPointer<vtkPointSource>::New(); 
    pointSource->SetNumberOfPoints(Output->GetNumberOfPoints()); 
    pointSource->Update(); 

    vtkSmartPointer<vtkKdTreePointLocator> Tree = 
    vtkSmartPointer<vtkKdTreePointLocator>::New(); 
    Tree->SetDataSet(pointSource->GetOutput()); 
    Tree->BuildLocator(); 

    unsigned int k = 5; 
    double testpoint[3]; 

    vtkSmartPointer<vtkIdList> result = 
    vtkSmartPointer<vtkIdList>::New(); 

    for(vtkIdType n = 0; n < Output->GetNumberOfPoints(); n++) 
    { 

    result->Reset(); 
    Output->GetPoint(n,testpoint); 
    Tree->Update(); 
    std::cout << "Point: " << testpoint[0] << ", " << testpoint[1] << ", " << testpoint[2] << ": " << endl; 

    Tree->FindClosestNPoints(k, testpoint, result); 

    for(vtkIdType i = 0; i < k; i++) 
     { 
     vtkIdType point_ind = result->GetId(i); 
     double p[3]; 
     pointSource->GetOutput()->GetPoint(point_ind, p); 
     std::cout << "Closest point " << i+1 << ": Point " 
     << point_ind << ": (" << p[0] << ", " << p[1] << ", " << p[2] << ")" << std::endl; 
     } 

    } 
    //end test 

這是做什麼我試圖做...它打印出5個最接近點的興趣的一個點,但儘管點的利益變化,5個最近的點保持不變。我假設我只是在我的代碼中傳遞一個小細節,但我可能是錯的。如果你需要更多的信息來幫助,只需要提問即可。

謝謝您的時間和幫助, 盧克^ h

回答

4

我發現這個問題......我用/ vtkPointSource生成隨機點,我正在餵我點到該功能。我不知道爲什麼,但是這使得獲得結果非常困難,但是一旦我傳遞了正確的信息,並在點Id數組和結果Id數組上放置了Reset(),它就像冠軍一樣工作。希望這會和其他人一樣麻煩,因爲我花了一些時間在這方面工作。

盧克ħ

vtkSmartPointer<vtkKdTreePointLocator> Tree = 
vtkSmartPointer<vtkKdTreePointLocator>::New(); 
Tree->SetDataSet(Output); 
Tree->BuildLocator(); 

vtkSmartPointer<vtkIdList> result = 
    vtkSmartPointer<vtkIdList>::New(); 

vtkSmartPointer<vtkIdList> point_ind = 
    vtkSmartPointer<vtkIdList>::New(); 

unsigned int k = 5; 

double testpoint[3]; 

for(vtkIdType n = 0; n < Output->GetNumberOfPoints(); n++) 
    { 

    Output->GetPoint(n,testpoint); 
    std::cout << "Point: " << testpoint[0] << ", " << testpoint[1] 
    << ", " << testpoint[2] << ": " << endl; 

    Tree->FindClosestNPoints(k, testpoint, result); 

    for(vtkIdType i = 0; i < k; i++) 
    { 

vtkIdType point_ind = result->GetId(i); 

    double p[3]; 

    Output->GetPoint(point_ind, p); 
std::cout << "Closest point " << i+1 << ": Point " 
    << point_ind << ": (" << p[0] << ", " << p[1] << ", " 
     << p[2] << ")" << std::endl; 

    } 

    result->Reset(); 
point_ind->Reset(); 

    }