Adam
Adam

Reputation: 33126

CGAffineTransform: apply a Scale to a Translation, how?

The affine transforms Apple use have "scale" defined as "does not affect translation"

This seems to me completely wrong, and doesn't match what I'd expect from normal affine transforms (where a scale multiplied by a translation DOES affect the translation), and makes it extremely difficult to work with real-world problems, where "scaling" is expected to scale the entire co-ordinate system, not just the local co-ords of a single object at a time.

Is there a safe way within Apple's library to workaround this problem (i.e. make "scale" apply to the whole matrix, not just the non-translation parts)?

Or have I made a stupid mistake and completely misunderstood what's happening with the scaling, somehow?

Upvotes: 0

Views: 758

Answers (2)

Adam
Adam

Reputation: 33126

Ah. Embarassing. My mistake: arguments to concat were wrong way around! At least I can leave this here and hopefully help the next person to make such a dumb mistake.

  1. I had a Concat call with the arguments the wrong way around; obviously, "translating" a "scale" works as expected - the scale doesn't affect the translate!

  2. When I googled this issue, I hit a couple of pages that talked about CGAffineTransform doing scale and translate independently. Confirmation bias :( I read that and assumed it was true. Doh.

FYI: CGAffineTransformConcat( A, B ) ... does: Matrix A * Matrix B ... i.e. "A's effects first, then B's effects"

So, make sure your scaling matrix is the second argument (or the "later" argument if you have a chain of nested Concat calls).

Upvotes: 0

Lily Ballard
Lily Ballard

Reputation: 185671

I'm pretty sure that just means it doesn't affect the translation values in the matrix. CGAffineTransform isn't some special brand of math, it's just a regular transformation matrix. It works like any other transformation matrix you've ever used.

Upvotes: 1

Related Questions