[Drawkit] Zoom to bounding box
Michael Caron
michael.r.caron at gmail.com
Sat Apr 4 05:12:42 PDT 2009
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Apr 3, 2009, at 6:28 PM, Graham Cox wrote:
>
> On 04/04/2009, at 1:53 AM, Mike Caron wrote:
>
>> However, it seems that I'm still doing something incorrectly here.
>> Suppose, I have a drawing that is mostly whitespace, except for a
>> few drawable objects in the lower right corner. Let's say the
>> bounding box on these objects is at (35,35) and that it's height
>> and width are each 25. Let's say the drawing itself is 60w x 80h. I
>> want to crop the drawing now to be 30 x 30 with the bounding box
>> contents centered in the middle. It seems that the way to do this is:
>>
>> 1. Obtain the bounding box of the drawable objects
>> 2. Compute the X and Y translation factor (to move the objects)
>> 2.1. Xoffset = -(boundingbox.origin.x)
>> 2.2. Yoffset = -(boundingbox.origin.y)
>> 3. Resize the document (so margins are created properly)
>> 4. Iterate through the drawable objects and move them using the -
>> offsetLocationByX:byY method
>> 4.1. xfactor = Xoffset + marginLeft
>> 4.2. yfactor = Xoffset + marginTop
>
> Yes, that should work.
>
>>
>> It seems, based on your response that I'll also have to resize each
>> drawable object since I've changed the size of the document? Do I
>> understand you correctly?
>>
>
> No, resizing the objects isn't necessary here. However, originally
> you were talking about zooming which of course is mostly a scaling
> operation, so to achieve the same effect as zooming a resize is
> implied. I guess I understood your needs as fitting the objects to
> the drawing size rather than the drawing to the objects.
>
>> Does "slightly harder" mean less efficient? At the point of
>> zooming, I've already built an array containing all drawable
>> objects in the drawing document. At that point, it seems pretty
>> easy, but if there's less efficiency with getting the bounds
>> through the array than through the layer, I'll switch it over.
>>
>
> If you have an array of the objects already, this method is as good
> as any. Either way it simply iterates over the objects and unions
> all their bounding rects. The reason I suggested using the layer
> method is that usually the layer owns the objects so there's no need
> to build an array of objects just for the purpose of obtaining the
> bounding rect. If you happen to have an array already, then there's
> no real difference.
>
> BTW, it's a little unusual to maintain a separate array of the same
> objects that are in the drawing. Seems to me that would complicate
> things when it came to adding and removing objects from the drawing
> to maintain your list in synch (especially with Undo and so on). You
> may have your reasons of course. It's straightforward to obtain
> lists of objects from the layer whenever you need them.
In this instance it makes sense, but thanks for the accessibility tip.
> --Graham
>
>
> _______________________________________________
> Drawkit mailing list
> Drawkit at lists.apptree.net
> http://lists.apptree.net/listinfo.cgi/drawkit-apptree.net
Michael
- ------------------------------------------------
michael.r.caron at gmail.com
http://techrad.wordpress.com
http://mrcaron.wordpress.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (Darwin)
iD8DBQFJ10665CEAr1NK/dQRAuWRAJoD4J8hsyzzthvixu7KzYOKSb6vTwCdFuUD
/7MgTIryo4naIr/jtXI+6LA=
=5B2x
-----END PGP SIGNATURE-----
More information about the Drawkit
mailing list