3

私はプロジェクトに VTK を使用していますが、その一部を把握できないようです。数千のポイントを反復処理し、ポイントごとに最も近い 5 つのポイントを見つけようとしています。単純な for ループ操作のように見えますが、私の問題は、何らかの理由で、同じ 5 つのポイントがデータ内のすべてのポイントの最も近いポイントであると言われていることです...これは真実ではありません。以下に説明しているコードの一部を添付します。

  //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つのポイントは同じままです。私は自分のコードの細部をただ見過ごしているだけだと思っていますが、間違っている可能性があります。役立つ情報がさらに必要な場合は、質問してください。

あなたの時間と助けに感謝します, Luke H

4

1 に答える 1

5

問題が見つかりました...ランダムなポイントを生成する /vtkPointSource を使用していて、ポイントをその関数にフィードしていました。理由はわかりませんが、結果を出すのが非常に難しくなりましたが、正しい情報を渡してポイント ID 配列と結果 ID 配列に Reset() を配置すると、チャンピオンのように機能します。私はこれに何時間も費やしたので、うまくいけば、これは他の人にも同じ問題を引き起こすでしょう。

ルーク・H

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

  }
于 2012-07-10T16:30:25.987 に答える