[Drawkit] Transforms / ScaleBy

Michael Caron michael.r.caron at gmail.com
Tue Apr 7 17:13:13 PDT 2009


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Thanks Graham, that's really helpful. I'll give it a shot.

And yes, I'm acually going from mm - micrometers, so it's a 1000. Just  
forgot to reconvert in my example.

m

On Apr 7, 2009, at 6:35 PM, Graham Cox wrote:

>
> On 08/04/2009, at 8:45 AM, Michael Caron wrote:
>
>> Hi all,
>>
>> I'm trying to understand the use of Affine Transforms through the  
>> use of DKLayer::applyTransformToObjects. Let me give some context.
>>
>> So I have a Drawing with a grid layer, a guide layer and a drawing  
>> layer. The grid layer is setup to use a centimeter span. I  
>> programatically add some DK objects like a few DKDrawablePaths, a  
>> few DKArcPaths. At the end of adding objects, I get the bounding  
>> box for the layer. Then I create an Affine Transform to scale  
>> everything by 1000 (to go to cm to mm). I'm a bit surprised to find  
>> it doesn't work as I thought.
>>
>> Bounding Box Before Transform:
>> 	x = 16.023.9811
>> 	y = 15.9680157
>> 	w = 18.1520519
>> 	h = 18.1520519
>>
>> Transform:
>> 	NSAffineTransform* txfm = [NSAffineTransform transform];
>> 	[txfm scaleBy: 1000];
>> 	[currentLayer applyTransformToObjects:txfm];
>>
>> Bounding Box After Transform:
>> 	x = 25086.7695
>> 	y = 25030.8047
>> 	w = 26.4765625
>> 	h = 26.4765625
>>
>> I would have expected the size of the bounding box to scale by 1000  
>> if the shapes contained in it scale by 1000. Thus yielding a  
>> bounding box like this:
>>
>> 	x = 16023.9811
>> 	y = 15968.0157
>> 	w = 18152.0519
>> 	h = 18152.0519
>>
>> Am I missing something here? Did the transform take the grid into  
>> consideration when scaling? I expected that it would simply rescale  
>> in quartz.
>>
>
> Firstly, there are 10mm in 1 cm, so surely you only want to scale by  
> 10?
>
> Secondly, transforms affect the coordinate system as a whole, so you  
> must always be mindful of where the origin is and how objects are  
> located with respect to it. Just scaling without taking that into  
> account is rarely enough. In this case you probably would need to  
> treat the top, left of your original bounding box as the origin so  
> that the objects are all repositioned and sized relative to that  
> point. Then you should find that the resulting bounding box ends up  
> as you expected. This involves:
>
> 1. create an empty (identity) transform
> 2. translate by -x, -y to the origin.
> 3. scale by 10 (or whatever)
> 4. translate by x, y to undo step 1.
> 5. apply the transform.
>
> The -applyTransformToObjects: method doesn't take into account the  
> grid. In fact, the grid really has very little involvement with the  
> internal structure of DK. What it does is provide a reference grid  
> that is meaningful to the user, so that sizes and positions can be  
> reported/displayed relative to that grid. Internally all drawing is  
> done using native Quartz units, always. Therefore you could simply  
> recalibrate the grid to convert objects from mm to cm. They wouldn't  
> need to move or change size, you just call them something else. The  
> view zoom factor can be changed to make them appear larger.
>
> --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)

iD8DBQFJ2+wZ5CEAr1NK/dQRAtJKAJ9XODYFyJVtVBe4xGPPrbgxusee7gCfdYFP
MnzaJoNFep9usjCvMVRxZWQ=
=Qwl2
-----END PGP SIGNATURE-----


More information about the Drawkit mailing list