<div class="gmail_quote">On Sun, Sep 2, 2012 at 4:40 PM, cerina <span dir="ltr"><<a href="mailto:cerine-baratelli@hotmail.fr" target="_blank">cerine-baratelli@hotmail.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,
I'm using vtkOctree to segment my Mesh to 8 regions. I tried to pick on the mesh in order to get the picked point's coordinates, but i got an unhandled exception. The program is using the vtk Octree, here is my code:
<h3>
#include <u></u>
#include "vtkOctree.h"
#include "RenderWindow.h"
#include <u></u>
#include <u></u>
#include <u></u>
#include <u></u>
#include <u></u>
#include <u></u>
#include <u></u>
// Catch mouse events
class MouseInteractorStyle : public vtkInteractorStyleTrackballCamera
{
public:
static MouseInteractorStyle* New();
vtkSurface* Mesh2;
vtkIntArray *lesNodes;
virtual void OnLeftButtonDown()
{
// Get the location of the click (in window coordinates)
int* pos = this->GetInteractor()->GetEventPosition();
vtkSmartPointer<u></u> picker =
vtkSmartPointer<u></u>::New();
// Pick from this location.
picker->Pick(pos[0], pos[1], pos[2], this->GetDefaultRenderer());
double* worldPosition = picker->GetPickPosition();
vtkIdType c=picker->GetPointId();
cout<<" the PointId is : "<<u></u>GetPointId()<<endl;
cout<<" point coordinates are: "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<endl;
Mesh2->GetPoint(c);
cout<<"nombre des sommets : "<< Mesh2->GetNumberOfPoints()<<endl;
this->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(selectedActor);
// Forward events
vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
};
// vtkSmartPointer<u></u> Data;
vtkSmartPointer<u></u> selectedMapper;
vtkSmartPointer<u></u> selectedActor;
};
vtkStandardNewMacro(MouseInteractorStyle);
void vtkOctree::Decompose(vtkSurface *Mesh1)
{
// vtkSurface *Edges=vtkSurface::New();
RenderWindow *Window=RenderWindow::New();
Window->SetInput(this->Input);
vtkIntArray *PointsNode=vtkIntArray::New();
PointsNode->SetNumberOfValues(this->Input->GetNumberOfPoints());
std::vector<u></u> Nodes;
Node Node1;
double Bounds[6];
this->Input->GetPoints()->ComputeBounds();
this->Input->GetPoints()->GetBounds(Bounds);
// Create Root Node and push it into the array of nodes
Node1.NumberOfPoints=this->Input->GetNumberOfPoints();
// subdivide the Mesh to 8 areas
for (int i=0;i<3;i++)
{
Node1.Center[i]=0.5*(Bounds[2*i+1]+Bounds[2*i]);
Node1.Radius[i]=0.5*(Bounds[2*i+1]-Bounds[2*i]);
}
Nodes.push_back(Node1);
// Assign all points to root node
for (int i=0;i<u></u>Input->GetNumberOfPoints();i++)
PointsNode->SetValue(i,0);
int NumberOfSplitNodes;
int Level=0;
for(int h=0;h<2; h++)
{
cout<<"Level "<<Level++<<endl;
NumberOfSplitNodes=0;
for (int i=0;i<this->Input->GetNumberOfPoints();i++)
{
int NodeId=PointsNode->GetValue(i);
if (Nodes[NodeId].NeedsSplit())
{
if (!Nodes[NodeId].HasChildren())
{
NumberOfSplitNodes++;
// we need to create 8 sub-nodes (one for each octant)
int Coordinates[3];
for (Coordinates[0]=0;Coordinates[0]<2;Coordinates[0]++)
{
for (Coordinates[1]=0;Coordinates[1]<2;Coordinates[1]++)
{
for (Coordinates[2]=0;Coordinates[2]<2;Coordinates[2]++)
{
Node1.Reset();
// Create one child node
for (int j=0;j<3;j++)
{
Node1.Center[j]=Nodes[NodeId].Center[j]+
((double) Coordinates[j]-0.5)*Nodes[NodeId].Radius[j];
Node1.Radius[j]=0.5*Nodes[NodeId].Radius[j];
}
Nodes[NodeId].Children[Coordinates[0]][Coordinates[1]][Coordinates[2]]=
Nodes.size();
Nodes.push_back(Node1);
}
}
}
}
double Point[3];
this->Input->GetPoint(i,Point);
int Coordinates[3];
for (int j=0;j<3;j++)
{
if (Point[j]<Nodes[NodeId].Center[j])
Coordinates[j]=0;
else
Coordinates[j]=1;
}
int Child=Nodes[NodeId].Children[Coordinates[0]][Coordinates[1]][Coordinates[2]];
PointsNode->SetValue(i,Child);
Nodes[Child].NumberOfPoints++;
}
}
h++;
};
// create polydata for visualization
cout<<NumberOfSplitNodes<<" Nodes split"<<endl;
Window->DisplayVerticesColors(PointsNode);
Window->Render();
<font color="#32CD32"> //here i initialize the interaction</font>
vtkRenderWindowInteractor *interactor=vtkRenderWindowInteractor::New();
interactor->SetRenderWindow(Window->GetvtkRenderWindow());
interactor->Initialize();
vtkSmartPointer<u></u> style = vtkSmartPointer<u></u>::New();
style->Mesh2=Mesh1;
style->lesNodes=PointsNode;
interactor->SetInteractorStyle(style);
Window->GetvtkRenderWindow()->SetInteractor(interactor);
interactor->Start();
Window->Interact();
Window->Delete();
PointsNode->Delete();
}
</h3>
and this is the main file:
#include "vtkSurface.h"
#include "RenderWindow.h"
#include "vtkOctree.h"
int main( int argc, char *argv[] )
{
// Parse command line arguments
if(argc != 2)
{
std::cout << "Usage: " << argv[0] << " Filename(.ply)" << std::endl;
return EXIT_FAILURE;
}
vtkSurface *Mesh;
// Load the mesh and create the vtkSurface data structure
Mesh=vtkSurface::New();
cout <<"load : "<<argv[1]<<endl;
Mesh->CreateFromFile(argv[1]);
// prints to standard output the mesh caracteristics
Mesh->DisplayMeshProperties();
vtkOctree *Octree=vtkOctree::New();
Octree->SetInput(Mesh);
Octree->Decompose(Mesh);
return (0);
}<br></blockquote><div><br></div>Please ensure your code formatting remains when composing your message to the mailing list. This is impossible to read.<br clear="all"><br>David </div><br>