2010-04-22 11 views
17

Znalazłem podobne pytanie o uzyskanie tylko rotacji, ale jak rozumiem, skalowanie i obracanie pracy różni się w macierzy transformacji.Zdobądź tylko transformację skalowania z CGAffineTransform

Matryce nie są moją siłą, więc jeśli ktokolwiek mógłby mi wskazać, jak uzyskać tylko skalowanie z CGAffineTransform, które bardzo doceniam.

btw. Próbowałem zastosować CGAffineTransform na CGSize, a następnie uzyskać wysokość x szerokość, aby zobaczyć, jak dużo skalowane, ale wysokość x szerokość ma dziwne wartości (w zależności od obrotu znalezionego w CGAffineTransform, więc ... hm, który nie działa)

Odpowiedz

43

Zakładając, że przemiana jest skalowanie następnie obrotu (ewentualnie z przeliczenia tam, ale nie ma pochylenie) współczynnik skali pozioma sqrt(a^2+c^2) współczynnik skala pionowa jest sqrt(b^2+d^2), a stosunek współczynnika skali poziomej do współczynnik skali pionowej należy a/d = -c/b gdzie a, b, c i d cztery z sześciu członków CGAffineTransform per the documentation (tx i ty reprezentuje tylko tłumaczenie, które nie ma wpływu na współczynniki skali).

| a b 0 | 
| c d 0 | 
| tx ty 1 | 
+0

Pierwsza odpowiedź dostaje znacznik. Zarówno głosowanie w górę. Dziękuję za to, że rzuciłeś trochę światła na to. –

+1

Pamiętajcie jednak, że skala wyekstrahowana w ten sposób zawsze będzie dodatnia (skale negatywne można wykorzystać do odwrócenia obiektu). – thenickdude

4

nie jestem zaznajomiony z CGAffineTransform lub Objective-C (mnie złowionych z tagiem matematyki). Ogólnie rzecz biorąc, musisz wycofać transformacje indywidualnie. Na przykład, jeśli przekształcenia afiniczne wykonuje skalowanie, obrót i translację tylko (kolejność skalowanie i obrót nie jest ważne w poniższej metody, ale tłumaczenie należy z pewnością ostatni):

Tłumaczenie: wprowadzającego do wektor (0,0) zwróci wynik (tx, ty), gdzie tx i ty są odpowiednio tłumaczeniami w kierunkach X i Y.

Skalowanie w X: Zastosuj A do wektora (1, 0) i uzyskaj (sx0 + tx, sx1 + ty). Skalowanie X będzie sqrt (sx0 Sx1^2 +^2)

Scaling Y: zastosować do wektora (0, 1) i inne (sy0 + TX, SY1 + TY). Skalowanie w Y będzie sqrt (sy0^2 + SY1^2)

Od transformacje afiniczne są realizowane przez prosty trick z przekształceń liniowych i od przekształceń liniowych nie są przemienne, trzeba zrozumieć, w jaki sposób przemiany są sortowane przed faktycznie pracując nad tym, jak wyciągnąć indywidualne przekształcenie.

8

To stare pytanie, ale wciąż dodaje więcej informacji na wypadek, gdyby ktoś potrzebował.

Dla mnie dobra odpowiedź i przykładowy kod dla coraz skalę, obrót transformacji i odtwarzając je pochodzą z artykułu:

http://www.informit.com/articles/article.aspx?p=1951182

+1

świetny artykuł !!! –

23
- (CGFloat)xscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.a * t.a + t.c * t.c); 
} 

- (CGFloat)yscale { 
    CGAffineTransform t = self.transform; 
    return sqrt(t.b * t.b + t.d * t.d); 
}