[vtkusers] vtkOctree and Interaction

tasnim hanene-jeder at hotmail.fr
Sun Sep 2 09:08:55 EDT 2012


Hi,
I'm using vtkOctree to segment my Mesh to 8 regions. Now, i'd like that when
i pick on the mesh, i can retrieve the pointId and than the region of this
point. this is the */vtkOctree.cxx/* after modification:
#include <vtkObjectFactory.h>
#include "vtkOctree.h"
#include "RenderWindow.h"
class Node
{
public:
	int NumberOfPoints;
	int Children[2][2][2];
double Center[3];
	double Radius[3];
	
	bool HasChildren()
	{
		return (this->Children[0][0][0]!=-1);
	};
	
	bool NeedsSplit()
	{
		return (this->NumberOfPoints>1);
	};
	
	void Reset()
	{
		NumberOfPoints=0;
		Children[0][0][0]=-1;
	};
	
	Node()
	{
		this->Reset();
	};
	
	~Node()
	{};
};


void vtkOctree::Decompose()
{
//	vtkSurface *Edges=vtkSurface::New();
	
	RenderWindow *Window=RenderWindow::New();
	Window->SetInput(this->Input);
	
	vtkIntArray *PointsNode=vtkIntArray::New();
	PointsNode->SetNumberOfValues(this->Input->GetNumberOfPoints());
	
	std::vector<Node> 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<this->Input->GetNumberOfPoints();i++)
		PointsNode->SetValue(i,0);
	
	int NumberOfSplitNodes;
	int Level=0;
	for(int h=0;h<2; h++)
	{
		cout<<"Level "<<Level++&lt;&lt;endl;
		NumberOfSplitNodes=0;
		for (int i=0;i&lt;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&lt;&lt;&quot; Nodes split&quot;&lt;&lt;endl;
		Window->DisplayVerticesColors(PointsNode);
		Window->Render();
		Window->Interact();
		
	
	
	Window->Delete();
	PointsNode->Delete();
}

void vtkOctree::SetInput(vtkSurface *Input)
{
	if (this->Input)
		this->Input->UnRegister(this);
	
	Input->Register(this);
	this->Input=Input;
}

vtkOctree *
vtkOctree::New ()
{
	// First try to create the object from the vtkObjectFactory
	vtkObject *ret = vtkObjectFactory::CreateInstance ("vtkOctree");
	if (ret)
	{
		return (vtkOctree *) ret;
	}
	// If the factory was unable to create the object, then create it here.
	return (new vtkOctree);

}

vtkOctree::vtkOctree()
{
	this->Input=0;
}

vtkOctree::~vtkOctree()
{
	if (this->Input)

		this->Input->UnRegister(this);

}

and the main.cxx:
#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]&lt;&lt;endl;
	Mesh->CreateFromFile(argv[1]);

	// prints to standard output the mesh caracteristics
	Mesh->DisplayMeshProperties();
	
	vtkOctree *Octree=vtkOctree::New();
	Octree->SetInput(Mesh);
	Octree->Decompose();
	

	return (0);
}

Any help please!!!
Best Regards, 
Tasnim




--
View this message in context: http://vtk.1045678.n5.nabble.com/vtkOctree-and-Interaction-tp5715769.html
Sent from the VTK - Users mailing list archive at Nabble.com.



More information about the vtkusers mailing list