<div dir="ltr"><div><div>Hi Mathieu,<br></div>Sorry, I'm very busy these days. I had a first quick look. Why not, it looks a bit complicated but good. I would have a few things I would change style wise, e.g., move DrawCylinderSpatialObject to DrawCylinderImageFilter, create a common DrawQuadricSpatialObject that would all have the same IsInside function, make DrawSpatialObjectpurely virtual by not defining <br>IsInside etc. but those are details I can correct myself. Do you want to finish what you started and I work from there or should I finish everything?<br></div>Simon<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Nov 1, 2015 at 6:41 PM, Mathieu Dupont <span dir="ltr"><<a href="mailto:mdupont@cppm.in2p3.fr" target="_blank">mdupont@cppm.in2p3.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello Simon,<br>
<br>
I started to implement what I suggested :<br>
<br>
<a href="https://github.com/wrzof/RTK/blob/rewrite_DrawImageFilter/code/rtkDrawImageFilter.h" rel="noreferrer" target="_blank">https://github.com/wrzof/RTK/blob/rewrite_DrawImageFilter/code/rtkDrawImageFilter.h</a><br>
and<br>
<a href="https://github.com/wrzof/RTK/blob/rewrite_DrawImageFilter/code/rtkDrawCylinderImageFilter.h" rel="noreferrer" target="_blank">https://github.com/wrzof/RTK/blob/rewrite_DrawImageFilter/code/rtkDrawCylinderImageFilter.h</a><br>
<br>
rtk::DrawCylinderImageFilter derives from rtk::DrawImageFilter and specializes<br>
it (by defaulting the template parameter TSpatialObject with<br>
DrawCylinderSpatialObject).<br>
<br>
By default, DrawCylinderImageFilter uses Add2 for filling output image (to be<br>
backward compatible (all tests pass)). I created Discard (I did not find<br>
equivalent in itk) functor in order to do what I wanted in my first email.<br>
<br>
I just implemented DrawCylinderImageFilter, the others will follow.<br>
<br>
What do you think about it ?<br>
<div class="HOEnZb"><div class="h5"><br>
Le vendredi 30 octobre 2015, 11:56:50 Mathieu Dupont a écrit :<br>
> Hi,<br>
><br>
> In case of your first solution, you can not chain several<br>
> Draw*ImageFilters. For example, if you want to create small cylinders in<br>
> a big cylinder.<br>
><br>
> Your second solution is better.<br>
><br>
> One another solution can be a thing like itk:SpatialObject but more<br>
> simpler. An rtk::SpatialObject which one function (isInside(point)). We<br>
> create a rtkDrawImageFilter class and implement ThreadedGenerateData<br>
> like this :<br>
><br>
> DrawImageFilter<InImage, OutImage, rtkSpatialObject,<br>
> rtkFillFunctor>::ThreadedGenerateData(const OutputImageRegionType&<br>
> outputRegionForThread,                 ThreadIdType itkNotUsed(threadId)<br>
> {<br>
> ...<br>
><br>
>   while( !itOut.IsAtEnd() )<br>
>      {<br>
>      this->GetInput()->TransformIndexToPhysicalPoint(itOut.GetIndex(),<br>
> point);<br>
><br>
>     if(m_rtkSpatialObject.isInside(point)<br>
>       itOut.Set(m_rtkFillFunctor(density, itIn.Get());<br>
> ...<br>
> }<br>
><br>
><br>
> DrawConeImageFilter class can be a child of this new DrawImageFilter<br>
> (with new methods like setAngle, SetRadius which will adjust the<br>
> rtkConeSpatialObject)<br>
><br>
> This solution suppress duplicated code in<br>
> Draw*ImageFilter::ThreadedGenerateData and makes easier implementation<br>
> of another type of filling.<br>
><br>
> On 28/10/2015 20:52, Simon Rit wrote:<br>
> > Hi Mathieu,<br>
> > Thanks for pointing this out. I agree that it might not be the best<br>
> > solution, yet one could argue that you could simply create a constant<br>
> > image with 0 to do what you'd like from the current implementation. My<br>
> > main problem is that I just tried to do what you suggest and some tests<br>
> > then fail... which shows the obvious, it's not a backward compatible<br>
> > change. I see two solutions:<br>
> > - keep it as is and you use ConstantImageFilter + we remove useless add<br>
> > filters,<br>
> > - a more complex but maybe more elegant solution: add a third template<br>
> > parameter for the operation that would allow the user to do what he'd<br>
> > like in a functor. That's what's done with filters that derive from<br>
> > itk::UnaryImageFilter<br>
> > <<a href="http://www.itk.org/Doxygen/html/classitk_1_1UnaryFunctorImageFilter.html" rel="noreferrer" target="_blank">http://www.itk.org/Doxygen/html/classitk_1_1UnaryFunctorImageFilter.html</a>><br>
> > .<br>
> > The default would be itk::Add2 but we could find or implement another<br>
> > one that simply discards the pixel value.<br>
> > What do you think?<br>
> > Simon<br>
> ><br>
> > PS: looking in the code, I just found that rtk::DrawConeImageFilter is<br>
> > not consistent with the others, it was always setting to 0 outside...<br>
> > that's been fixed!<br>
> ><br>
> > On Wed, Oct 28, 2015 at 4:47 PM, Mathieu Dupont <<a href="mailto:mdupont@cppm.in2p3.fr">mdupont@cppm.in2p3.fr</a><br>
> ><br>
> > <mailto:<a href="mailto:mdupont@cppm.in2p3.fr">mdupont@cppm.in2p3.fr</a>>> wrote:<br>
> >     Hello everyone,<br>
> ><br>
> >     I have a question/suggestion about the set of rtkDraw*ImageFilter.<br>
> >     This filter are written as additive filters: for example, in<br>
> >     rtkDrawEllipsoidImageFilter.txx, we can find<br>
> ><br>
> >     for(..)<br>
> ><br>
> >       itOut.Set( ellipsoid.density + itIn.Get() )<br>
> ><br>
> >     instead of<br>
> ><br>
> >     for(..)<br>
> >     itOut.Set( ellipsoid.density )<br>
> ><br>
> ><br>
> >     I think it can be more flexible the second option, because we can<br>
> >     always associate Draw*ImageFilter and itkAddImageFilter to get an<br>
> >     additive filter.<br>
> ><br>
> >     Moreover, the  rtkDrawGeometricPhantomImageFilter class already uses<br>
> >     itkAddImageFilter in order to have additive filters (which is<br>
> >     redundant in current situation).<br>
> ><br>
> >     What do you think ?<br>
> ><br>
> ><br>
> ><br>
> ><br>
> ><br>
> >     Regards<br>
> ><br>
> ><br>
> ><br>
> >     _______________________________________________<br>
> >     Rtk-users mailing list<br>
> >     <a href="mailto:Rtk-users@public.kitware.com">Rtk-users@public.kitware.com</a> <mailto:<a href="mailto:Rtk-users@public.kitware.com">Rtk-users@public.kitware.com</a>><br>
> >     <a href="http://public.kitware.com/mailman/listinfo/rtk-users" rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/rtk-users</a><br>
</div></div></blockquote></div><br></div>