18 #ifndef __otbSpatialObjectToImageDrawingFilter_txx
19 #define __otbSpatialObjectToImageDrawingFilter_txx
28 template <
class TInputSpatialObject,
class TOutputImage>
32 this->SetNumberOfRequiredInputs(1);
36 for (
unsigned int i = 0; i < OutputImageDimension; ++i)
44 m_UseObjectValue =
false;
48 template <
class TInputSpatialObject,
class TOutputImage>
55 template <
class TInputSpatialObject,
class TOutputImage>
63 const_cast<InputSpatialObjectType *>(input));
67 template <
class TInputSpatialObject,
class TOutputImage>
70 ::SetInput(
unsigned int index,
const TInputSpatialObject *
object)
74 const_cast<TInputSpatialObject *>(
object));
78 template <
class TInputSpatialObject,
class TOutputImage>
83 if (this->GetNumberOfInputs() < 1)
88 return static_cast<const TInputSpatialObject *
>
93 template <
class TInputSpatialObject,
class TOutputImage>
98 return static_cast<const TInputSpatialObject *
>
103 template <
class TInputSpatialObject,
class TOutputImage>
109 for (i = 0; i < TOutputImage::ImageDimension; ++i)
111 if ((
double) spacing[i] != m_Spacing[i])
116 if (i < TOutputImage::ImageDimension)
118 for (i = 0; i < TOutputImage::ImageDimension; ++i)
120 m_Spacing[i] = spacing[i];
127 template <
class TInputSpatialObject,
class TOutputImage>
133 for (i = 0; i < OutputImageDimension; ++i)
135 if (spacing[i] != m_Spacing[i])
140 if (i < OutputImageDimension)
142 for (i = 0; i < OutputImageDimension; ++i)
144 m_Spacing[i] = spacing[i];
149 template <
class TInputSpatialObject,
class TOutputImage>
155 for (i = 0; i < OutputImageDimension; ++i)
157 if ((
double) spacing[i] != m_Spacing[i])
162 if (i < OutputImageDimension)
164 for (i = 0; i < OutputImageDimension; ++i)
166 m_Spacing[i] = spacing[i];
171 template <
class TInputSpatialObject,
class TOutputImage>
180 template <
class TInputSpatialObject,
class TOutputImage>
186 for (i = 0; i < TOutputImage::ImageDimension; ++i)
188 if ((
double) origin[i] != m_Origin[i])
193 if (i < TOutputImage::ImageDimension)
195 for (i = 0; i < TOutputImage::ImageDimension; ++i)
197 m_Origin[i] = origin[i];
204 template <
class TInputSpatialObject,
class TOutputImage>
210 for (i = 0; i < OutputImageDimension; ++i)
212 if (origin[i] != m_Origin[i])
217 if (i < OutputImageDimension)
219 for (i = 0; i < OutputImageDimension; ++i)
221 m_Origin[i] = origin[i];
227 template <
class TInputSpatialObject,
class TOutputImage>
233 for (i = 0; i < OutputImageDimension; ++i)
235 if ((
double) origin[i] != m_Origin[i])
240 if (i < OutputImageDimension)
242 for (i = 0; i < OutputImageDimension; ++i)
244 m_Origin[i] = origin[i];
250 template <
class TInputSpatialObject,
class TOutputImage>
258 template <
class TInputSpatialObject,
class TOutputImage>
269 double origine[ObjectDimension];
270 InputObject->ComputeBoundingBox();
271 bool originspecified =
false;
272 if (!strcmp(InputObject->GetNameOfClass(),
"GroupSpatialObject"))
275 children = InputObject->GetChildren(0);
278 double minimum[ObjectDimension];
280 (*iter)->ComputeBoundingBox();
281 for (i = 0; i < ObjectDimension; ++i)
283 minimum[i] = (*iter)->GetBoundingBox()->GetMinimum()[i];
288 (*iter)->ComputeBoundingBox();
289 for (i = 0; i < ObjectDimension; ++i)
291 if ((*iter)->GetBoundingBox()->GetMinimum()[i] < minimum[i])
293 minimum[i] = (*iter)->GetBoundingBox()->GetMinimum()[i];
299 for (i = 0; i < ObjectDimension; ++i)
301 size[i] = (
long unsigned int) (InputObject->GetBoundingBox()->GetMaximum()[i] - minimum[i]) + 1;
302 origine[i] = (
long int) minimum[i];
303 originspecified =
true;
307 <<
"minx= " << minimum[0] <<
", miny= " << minimum[0] <<
", maxx= " <<
308 InputObject->GetBoundingBox()->GetMaximum()[0] <<
", maxy= " << InputObject->GetBoundingBox()->GetMaximum()[1]);
313 for (i = 0; i < ObjectDimension; ++i)
315 size[i] = (
long int) (InputObject->GetBoundingBox()->GetMaximum()[i]
316 - InputObject->GetBoundingBox()->GetMinimum()[i]);
320 typename OutputImageType::IndexType index;
322 typename OutputImageType::RegionType region;
328 bool specified =
false;
329 for (i = 0; i < OutputImageDimension; ++i)
340 region.SetSize(m_Size);
344 region.SetSize (size);
347 region.SetIndex(index);
349 OutputImage->SetLargestPossibleRegion(region);
351 for (i = 0; i < OutputImageDimension; ++i)
353 if (m_Spacing[i] != 0)
362 OutputImage->SetSpacing(this->m_Spacing);
366 OutputImage->SetSpacing(InputObject->GetIndexToObjectTransform()->GetScaleComponent());
367 m_Spacing[0] = InputObject->GetIndexToObjectTransform()->GetScaleComponent()[0];
368 m_Spacing[1] = InputObject->GetIndexToObjectTransform()->GetScaleComponent()[1];
373 OutputImage->SetOrigin(origine);
374 m_Origin[0] = OutputImage->GetOrigin()[0];
375 m_Origin[1] = OutputImage->GetOrigin()[1];
378 else OutputImage->SetOrigin(m_Origin);
384 template <
class TInputSpatialObject,
class TOutputImage>
389 itkDebugMacro(<<
"SpatialObjectToImageDrawingFilter::Update() called");
395 typename OutputImageType::RegionType region = OutputImage->GetLargestPossibleRegion();
396 OutputImage->SetBufferedRegion(region);
397 OutputImage->SetRequestedRegion(region);
399 OutputImage->Allocate();
403 myIteratorType it(OutputImage, region);
407 while (!it.IsAtEnd())
411 for (
unsigned int i = 0; i < ObjectDimension; ++i)
413 point[i] = (int) (it.GetIndex()[i] * m_Spacing[i]) + m_Origin[i];
417 InputObject->ValueAt(point, val, 99999);
418 if (m_InsideValue != 0 || m_OutsideValue != 0)
422 if (m_UseObjectValue)
424 it.Set(static_cast<ValueType>(val));
428 it.Set(m_InsideValue);
433 it.Set(m_OutsideValue);
438 it.Set(static_cast<ValueType>(val));
443 itkDebugMacro(<<
"SpatialObjectToImageDrawingFilter::Update() finished");
447 template<
class TInputSpatialObject,
class TOutputImage>
452 Superclass::PrintSelf(os, indent);
453 os << indent <<
"Size : " << m_Size << std::endl;
454 os << indent <<
"Children depth : " << m_ChildrenDepth << std::endl;
455 os << indent <<
"Inside Value : " << m_InsideValue << std::endl;
456 os << indent <<
"Outside Value : " << m_OutsideValue << std::endl;
457 if (m_UseObjectValue)
459 os << indent <<
"Using Object Value : ON" << std::endl;
463 os << indent <<
"Using Object Value : OFF" << std::endl;