[vtkusers] Surfaces from unorganized point - vtkSurfaceReconstructionFilter
Michele Natrella
michele.cetma at yahoo.it
Mon Jun 22 08:56:25 EDT 2009
Hi,
I am trying to represent a surface as a three-dimensional unorganized points. These pointsets come from a scan. To do this I am using vtkSurfaceReconstructionFilter which is a class specifically designed for this purpose. However there is an error that is driving me mad, it is caused by the method SetExecuteMethod belonging to the class vtkProgrammableSource. It appears as follows:
error C2660: "vtkProgrammableSource::SetExecuteMethod": function does not take 1 parameters
As following the code I wrote. I've put in bold the line which the error refers to, besides at the end of the message I reported the definition of the function readPoints used in the first lines of the main.
MAIN
#include "vtkSurfaceReconstructionFilter.h"
#include "vtkProgrammableSource.h"
#include "vtkContourFilter.h"
#include "vtkReverseSense.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "readPoints.h"
int main()
{
// Read some points. Use a programmable filter to read them.
vtkProgrammableSource* pointSource = vtkProgrammableSource::New();
readPoints();
pointSource->SetExecuteMethod(readPoints()); // ERROR !!
// Construct the surface and create isosurface.
vtkSurfaceReconstructionFilter* surf = vtkSurfaceReconstructionFilter::New();
surf->SetInputConnection(pointSource->GetOutputPort());
vtkContourFilter* cf = vtkContourFilter::New();
cf->SetInputConnection(surf->GetOutputPort());
cf->SetValue(0, 0.0);
// Sometimes the contouring algorithm can create a volume whose gradient
// vector and ordering of polygon (using the right hand rule) are
// inconsistent. vtkReverseSense cures this problem.
vtkReverseSense* reverse = vtkReverseSense::New();
reverse->SetInputConnection(cf->GetOutputPort());
reverse->ReverseCellsOn();
reverse->ReverseNormalsOn();
vtkPolyDataMapper* map = vtkPolyDataMapper::New();
map->SetInputConnection(reverse->GetOutputPort());
map->ScalarVisibilityOff();
vtkActor* surfaceActor = vtkActor::New();
surfaceActor->SetMapper(map);
surfaceActor->GetProperty()->SetDiffuseColor(1.0000, 0.3882, 0.2784);
surfaceActor->GetProperty()->SetSpecularColor(1, 1, 1);
surfaceActor->GetProperty()->SetSpecular(.4);
surfaceActor->GetProperty()->SetSpecularPower(50);
// Create the RenderWindow, Renderer and both Actors
vtkRenderer* ren = vtkRenderer::New();
vtkRenderWindow* renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
// Add the actors to the renderer, set the background and size
ren->AddActor(surfaceActor);
ren->SetBackground(1, 1, 1);
renWin->SetSize(400, 400);
ren->GetActiveCamera()->SetFocalPoint(0, 0, 0);
ren->GetActiveCamera()->SetPosition(1, 0, 0);
ren->GetActiveCamera()->SetViewUp(0, 0, 1);
ren->ResetCamera();
ren->GetActiveCamera()->Azimuth(20);
ren->GetActiveCamera()->Elevation(30);
ren->GetActiveCamera()->Dolly(1.2);
ren->ResetCameraClippingRange();
iren->Initialize();
renWin->Render();
iren->Start();
return 0;
}
FUNCTION readPoints
#include "vtkProgrammableSource.h"
#include "vtkReverseSense.h"
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
#include <sstream>
#include <cstdlib>
using namespace std;
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems);
std::vector<std::string> split(const std::string &s, char delim);
int readPoints(void)
{
vtkProgrammableSource* pointSource = vtkProgrammableSource::New();
vtkPolyData* output = vtkPolyData::New();
output = pointSource->GetPolyDataOutput();
vtkPoints* points = vtkPoints::New();
output->SetPoints(points);
// -1- Apertura file in lettura
ifstream fileStream("file_three-dimensional unorganized points.txt");
// -2- Controllo sulla correttezza dell'apertura del file
if( !fileStream )
{
cout << "Impossibile aprire il file " << endl;
return 1;
}
// -3- Recupero linea per linea e assegnamento valori
string line;
vector<string> data;
float x, y, z; //Punti da inserire
while(getline(fileStream, line)) //Prende una nuova linea
{
if(!line.empty()) // se la linea non è vuota
{
data=split(line, ' '); //il carattere di separazione lo spazio
//Conversione da std::string a float (se si vuole convertire in double sostituire atof con atod)
x=(float)atof(data[0].c_str());
y=(float)atof(data[1].c_str());
z=(float)atof(data[2].c_str());
points->InsertNextPoint(x, y, z);
////points.InsertNextPoint(x, y, z) // in Python
}
}
return 0;
}
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
return split(s, delim, elems);
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20090622/9339167d/attachment.htm>
More information about the vtkusers
mailing list