1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/*=========================================================================
Program: Insight Segmentation & Registration Toolkit
Module: $RCSfile: itkTransformMeshFilterTest.cxx,v $
Language: C++
Date: $Date: 2007-08-10 14:34:02 $
Version: $Revision: 1.10 $
Copyright (c) Insight Software Consortium. All rights reserved.
See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#if defined(_MSC_VER)
#pragma warning ( disable : 4786 )
#endif
#include <itkTransformMeshFilter.h>
#include <itkMesh.h>
#include <itkAffineTransform.h>
int itkTransformMeshFilterTest(int, char* [] )
{
// Declare the mesh pixel type.
// Those are the values associated
// with each mesh point. (not used on this filter test)
typedef int PixelType;
// Declare the types of the Mesh
// By default it is a 3D mesh using itk::Point<float,3>
// on the vertices, and an itk::VectorContainter
// as containter for points
typedef itk::Mesh<PixelType> MeshType;
// Declare the type for PointsContainer
typedef MeshType::PointsContainer PointsContainerType;
// Declare the type for PointsContainerPointer
typedef MeshType::PointsContainerPointer
PointsContainerPointer;
// Declare the type for Points
typedef MeshType::PointType PointType;
// Create an input Mesh
MeshType::Pointer inputMesh = MeshType::New();
// Insert data on the Mesh
PointsContainerPointer points = inputMesh->GetPoints();
// Fill a cube with points , just to get some data
int n = 1; // let's start with a few of them
PointsContainerType::ElementIdentifier count = 0; // count them
for(int x= -n; x <= n; x++)
{
for(int y= -n; y <= n; y++)
{
for(int z= -n; z <= n; z++)
{
PointType p;
p[0] = x;
p[1] = y;
p[2] = z;
std::cout << "Inserting point # ";
std::cout.width( 3); std::cout << count << " = ";
std::cout.width( 4); std::cout << p[0] << ", ";
std::cout.width( 4); std::cout << p[1] << ", ";
std::cout.width( 4); std::cout << p[2] << std::endl;
points->InsertElement( count, p );
count++;
}
}
}
std::cout << "Input Mesh has " << inputMesh->GetNumberOfPoints();
std::cout << " points " << std::endl;
// Declare the transform type
typedef itk::AffineTransform<float,3> TransformType;
// Declare the type for the filter
typedef itk::TransformMeshFilter<
MeshType,
MeshType,
TransformType > FilterType;
// Create a Filter
FilterType::Pointer filter = FilterType::New();
// Create an Transform
// (it doesn't use smart pointers)
TransformType::Pointer affineTransform = TransformType::New();
affineTransform->Scale( 3.5 );
TransformType::OffsetType::ValueType tInit[3] = {100,200,300};
TransformType::OffsetType translation = tInit;
affineTransform->Translate( translation );
// Connect the inputs
filter->SetInput( inputMesh );
filter->SetTransform( affineTransform );
// Execute the filter
filter->Update();
std::cout << "Filter: " << filter;
// Get the Smart Pointer to the Filter Output
MeshType::Pointer outputMesh = filter->GetOutput();
std::cout << "Output Mesh has " << outputMesh->GetNumberOfPoints();
std::cout << " points " << std::endl;
// Get the the point container
MeshType::PointsContainerPointer
transformedPoints = outputMesh->GetPoints();
PointsContainerType::ConstIterator it = transformedPoints->Begin();
while( it != transformedPoints->End() )
{
PointType p = it.Value();
std::cout.width( 5 ); std::cout << p[0] << ", ";
std::cout.width( 5 ); std::cout << p[1] << ", ";
std::cout.width( 5 ); std::cout << p[2] << std::endl;
++it;
}
// All objects should be automatically destroyed at this point
return EXIT_SUCCESS;
}
|