Sorry about the very long delay on this, but I finally committed Mike's
convolve function and tests as revision 1796.

Nirav

On Fri, Oct 17, 2008 at 10:25 PM, Michael George <mdgeo...@cs.cornell.edu>wrote:

> Here are the files.  It turns out the actual convolution is much simpler
> than the one I sent out before, since I learned about the bitmask_draw
> method and just use that internally.  It might be slightly slower, but it's
> more likely to be correct.
>
> As I was coding it up, I realized I'm still not completely happy with the
> interface.  Which of the following two possibilities do people prefer?
>
> == Option 1 ==
> Mask.convolve(othermask, outputmask = None, offset = (0,0)): return Mask
>
> Returns a mask with the (i-offset[0],j-offset[1]) bit set if shifting
> othermask
> so that it's lower right corner pixel is at (i,j) would cause it to overlap
> with self.
>
> If outputmask is not None, then the output is drawn onto outputmask and
> outputmask is returned.  Otherwise a mask of size self.get_size() +
> othermask.get_size() - (1,1) is created.
>
> == Option 2 ==
> Mask.convolve(othermask, outputmask, offset = (0,0)): return Mask
> Sets the ((i, j) - offset) bit of outputmask if overlap(self, othermask,
> (i,j)) is true.  Returns outputmask.
>
> Mask.convolve(othermask): return Mask
> Creates a mask just big enough to hold the convolution of self and other,
> and shifts the output so that it fits in the mask. Equivalent to
>  self.convolve(other, Mask(self.get_size() + othermask.get_size() - (1,1)),
> othermask.get_size() - (1,1))
>
> ====
>
> The difference between the two is how the offset is treated.  Both return
> the same result in the single-argument case, but Option 1 explains the
> multi-argument variant in terms of the single-argument variant, whereas
> Option 2 explains the single-argument variant in terms of the multi-argument
> invariant.  I think Option 2 is simpler to explain/understand (the
> lower-right corner of Option 1 just screams "off-by-one").  Option 1 is
> slightly more flexible, because you can call it with 2 arguments, although I
> don't think there would be any reason to do that (except that the unit tests
> do that).  Option 1 is implemented in this tarball, although it would be
> trivial to switch it to option 2 (and the code might even be
> infinitestimally nicer).
>
> It's splitting hairs I know, but I figure the hairs should be split before
> the API becomes public.
>
> --Mike
>
>
> Nirav Patel wrote:
>
>> You can use the diff command to generate patches, but if its easier
>> for you, you can just upload or email the files you changed.
>>
>> Nirav
>>
>>
>
>

Reply via email to