16 #include "vtkRenderer.h"
17 #include "vtkRenderWindow.h"
18 #include "vtkInteractorStyleTrackballCamera.h"
19 #include "vtkRenderWindowInteractor.h"
20 #include "vtkPolyData.h"
21 #include "vtkPoints.h"
22 #include "vtkProperty.h"
23 #include "vtkCellArray.h"
24 #include "vtkKochanekSpline.h"
25 #include "vtkPolyDataMapper.h"
31 #include "SimpleOpt.h"
37 {
OPT_PREC,_T(
"--precision"), SO_REQ_SEP },
56 std::cerr <<
"bspline:" << std::endl;
57 std::cerr <<
" create a regular spaced list of point by Kochanek-spline interpolation" << std::endl;
58 std::cerr <<
"syntax: spline number_of_points [-p n_decimals|--precision n_decimals] [-v|--view] [-c|--closed] < input_file > output_file" << std::endl;
59 std::cerr <<
" -p n_decimals: number of decimals (default 6)" << std::endl;
60 std::cerr <<
" -v: view results" << std::endl;
61 std::cerr <<
" -c: curve is closed" << std::endl;
62 std::cerr <<
"author: Pierre Smars, 2001-8" << std::endl;
63 std::cerr <<
"version 2011-04-16" << std::endl;
67 void draw(vtkPoints * pts_in, vtkPoints * pts_out)
69 vtkRenderer *
ren = vtkRenderer::New();
70 vtkRenderWindow * renWin = vtkRenderWindow::New();
71 renWin->AddRenderer(
ren);
74 vtkRenderWindowInteractor * iren = vtkRenderWindowInteractor::New();
75 iren->SetRenderWindow(renWin);
77 iren->SetInteractorStyle(style);
78 vtkCellArray * vertices = vtkCellArray::New();
80 vertices->InsertNextCell(1,&i);
81 vtkPolyData * data = vtkPolyData::New();
82 data->SetPoints(pts_in);
84 data->SetVerts(vertices);
86 vtkPolyDataMapper * map = vtkPolyDataMapper::New();
87 map->SetInputData(data);
89 vtkActor * actor = vtkActor::New();
90 actor->SetMapper(map);
92 actor->GetProperty()->SetPointSize(3);
93 vtkCellArray * vertices2 = vtkCellArray::New();
94 for (vtkIdType i = 0; i <
n_output; i++)
95 vertices2->InsertNextCell(1,&i);
96 vtkPolyData * data2 = vtkPolyData::New();
97 data2->SetPoints(pts_out);
99 data2->SetVerts(vertices2);
101 vtkPolyDataMapper * map2 = vtkPolyDataMapper::New();
102 map2->SetInputData(data2);
104 vtkActor * actor2 = vtkActor::New();
105 actor2->SetMapper(map2);
107 actor2->GetProperty()->SetColor(1,1,0);
108 ren->AddActor(actor);
110 ren->AddActor(actor2);
112 renWin->SetSize(640,480);
117 int main(
int argc,
char ** argv)
121 double continuity = 0;
125 if (args.LastError() == SO_SUCCESS)
129 else if (args.OptionId() ==
OPT_VIEW)
133 else if (args.OptionId() ==
OPT_PREC)
135 std::ostringstream o;
136 o << args.OptionArg();
137 std::istringstream
in(o.str().c_str());
140 if ((precision > 0)&&(precision < 12))
146 std::cerr <<
"Invalid argument: " << args.OptionText() << std::endl;
147 return error(args.LastError());
152 if (args.FileCount() != 1)
return error(-2);
154 std::ostringstream o(args.File(0));
155 std::istringstream
in(o.str().c_str());
159 vtkKochanekSpline * s[3];
160 for (
int i = 0; i < 3; i++)
162 s[i] = vtkKochanekSpline::New();
163 s[i]->SetDefaultTension(tension);
164 s[i]->SetDefaultBias(bias);
165 s[i]->SetDefaultContinuity(continuity);
167 vtkPoints * pts_in, * pts_out;
170 pts_in = vtkPoints::New();
171 pts_out = vtkPoints::New();
176 double x[3], x0[3], x00[3];
179 for (
int j = 0; j < 3; j++) std::cin >> x[j];
181 for (
int j = 0; j < 3; j++) x00[j] = x0[j] = x[j];
183 dist += sqrt((x[0]-x0[0])*(x[0]-x0[0])+(x[1]-x0[1])*(x[1]-x0[1])+(x[2]-x0[2])*(x[2]-x0[2]));
185 for (
int j = 0; j < 3; j++) s[j]->AddPoint(0,x[j]);
187 for (
int j = 0; j < 3; j++) s[j]->AddPoint(dist,x[j]);
189 pts_in->InsertNextPoint(x);
190 for (
int j = 0; j < 3; j++) x0[j] = x[j];
194 if ((x00[1]!=x[1])||(x00[1]!=x[1])||(x00[1]!=x[1]))
196 dist += sqrt((x00[0]-x0[0])*(x00[0]-x0[0])+(x00[1]-x0[1])*(x00[1]-x0[1])+(x00[2]-x0[2])*(x00[2]-x0[2]));
197 for (
int j = 0; j < 3; j++) s[j]->AddPoint(dist,x00[j]);
199 for (
int j = 0; j < 3; j++) s[j]->ClosedOn();
203 std::cout <<
n_output+1 << std::endl;
204 std::cout << std::fixed << std::setprecision(
pre);
213 for (
int j = 0; j < 3; j++)
214 x[j] = s[j]->Evaluate(t);
215 std::cout << x[0] <<
"\t" << x[1] <<
"\t" << x[2] <<
"\t" << std::endl;
216 pts_out->InsertNextPoint(x);
219 std::cout << s[0]->Evaluate(t) <<
"\t" << s[1]->Evaluate(t) <<
"\t" << s[2]->Evaluate(t) <<
"\t" << std::endl;
223 draw(pts_in,pts_out);
CSimpleOpt::SOption g_rgOptions[]
int main(int argc, char **argv)
void draw(vtkPoints *pts_in, vtkPoints *pts_out)