[vtkusers] more local control for thin plate transform
mail.ru
patalog at mail.ru
Mon Mar 1 06:15:34 EST 2004
Hi All!
There is shape (initially - sphere).
Then I add a point and I need to deform initial shape in such way, that
new shape interpolates new point.
I try to use vtkThinPlateSplineTransform class, passing shape as input
data and some points on shape surface as source landmark and the
_same_ points plus a new point as target landmark -
-----------code-----------
/* auto_vtk - si simple wrapper like std::auto_ptr */
/* initial shape - sphere */
auto_vtk<vtkPolyData> sphere_out = create_sphere(point_type(0., 0., 0.), .5);
_ASSERTE(sphere_out);
/* cut function */
auto_vtk<vtkPlane> plane = vtkPlane::New();
plane->SetOrigin(.0, .0, .0);
/* noraml - vector from center to the new point */
plane->SetNormal(normal);
/* find intersection sphere and plane (or other implicite function) -
get points on sphere surface */
auto_vtk<vtkPolyData> int_data = get_intersection(sphere_out, plane);
_ASSERTE(int_data);
/* mask unnecessary points to reduce landmark count */
auto_vtk<vtkMaskPoints> mask_points = vtkMaskPoints::New();
mask_points->SetInput(int_data);
mask_points->GenerateVerticesOn();
mask_points->SetOnRatio(3);
mask_points->Update();
vtkPolyData* masked_out = mask_points->GetOutput();
_ASSERTE(masked_out);
vtkPoints* mp = masked_out->GetPoints();
const vtkIdType count = mp->GetNumberOfPoints() + 1;
/* source landmarks */
auto_vtk<vtkPoints> spoints = vtkPoints::New();
spoints->SetNumberOfPoints(count);
for (vtkIdType i = 0; i < count; ++i)
spoints->SetPoint(i, mp->GetPoint(i));
/* int_point - point of intersection of shape and line from center of sphere
and new point */
spoints->SetPoint(count - 1, int_point);
/* target landmarks */
auto_vtk<vtkPoints> tpoints = vtkPoints::New();
tpoints->SetNumberOfPoints(count);
for (vtkIdType i = 0; i < count; ++i)
tpoints->SetPoint(i, mp->GetPoint(i)); //same point as source
/* new_point - a point to "add" to shape */
tpoints->SetPoint(count - 1, new_point);
auto_vtk<vtkThinPlateSplineTransform> thin_plate = vtkThinPlateSplineTransform::New();
thin_plate->SetSourceLandmarks(spoints);
thin_plate->SetTargetLandmarks(tpoints);
thin_plate->SetBasisToR();
//thin_plate->SetBasisToR2LogR();
-----------end of code-----------
than I apply transform to initial shape and get a new, deformed shape.
(than new shape pass as initial and so on...)
Problem - result shape is deformed as a whole, but I have to deform
only part of shape, in such a way that the part "beyond" cutter plane stay
unchanged! Is there way to do this?
Maybe I need to pass as source and target landmark additional points
on surface to prevent deformation of shape at its other part?
[vtk 4.4.0, MSVC 7.1, WinXp SP1]
--
Best regards,
Dmitry Guruelv mailto: patalog at mail.ru
More information about the vtkusers
mailing list