2012-11-06 14 views
9

Mam ten fragment kodu. Nie rozumiem matrix.prescale() i createBitmap z przekazaną macierzą. Co to znaczy? Czy istnieje strona symulacyjna, aby zrozumieć obliczenia macierzy? Czy mógłbyś mi podać kilka stron o matematyce używanej do grafiki? Przykro mi, nie jestem dobry w matematyce. :)Wyraźnie zrozumienie obliczeń macierzy

public Bitmap createReflectedImages(final Bitmap originalImage) { 
    final int width = originalImage.getWidth(); 
    final int height = originalImage.getHeight(); 
    final Matrix matrix = new Matrix(); 
    matrix.preScale(1, -1); 
    final Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, (int) (height * imageReflectionRatio), 
      width, (int) (height - height * imageReflectionRatio), matrix, false); 
    final Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (int) (height + height * imageReflectionRatio + 400), 
      Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bitmapWithReflection); 
    canvas.drawBitmap(originalImage, 0, 0, null); 
    final Paint deafaultPaint = new Paint(); 
    deafaultPaint.setColor(color.transparent); 
    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); 
    final Paint paint = new Paint(); 
    final LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, 
      bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); 
    paint.setShader(shader); 
    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); 
    return bitmapWithReflection; 
} 
+0

Widzę, że edytowałeś swój wpis. Czy mogę więcej dla ciebie odpowiedzieć? – Simon

+0

To zbyt abstrakcyjne, aby zrozumieć, ale jest w porządku. Trudno mi zrozumieć transformację macierzową i algebrę. – Emerald214

Odpowiedz

64

Nie myśl o tym zbyt mocno, przynajmniej nie na wczesnym etapie.

Wystarczy pomyśleć o macierzy jako tablicy liczb. W takim przypadku Android Matrix ma 3 wiersze po 3 numery. Każdy numer mówi funkcji graficznej Androida, co zrobić, aby skalować (większe/mniejsze), tłumaczyć (przesuwać), obracać (obracać) lub pochylać (zniekształcać w płaszczyźnie 2D) "rzecz", do której jest stosowana macierz.

Macierz wygląda następująco (patrz tutaj: docs).

{Scale X, Skew X, Transform X 
Skew Y, Scale Y, Transform Y 
Perspective 0, Perspective 1, Perspective 2} 

Dobrą wiadomością jest to, że nie trzeba znać żadnych matematyki Matrix, rzeczywiście prawie żadnych matematyki, aby korzystać z matryc w Androidzie. Właśnie takie metody jak PreScale() robią dla ciebie. Zrozumienie matematyki nie jest takie trudne, ponieważ większość rzeczy potrzebujesz tylko dodać, pomnożyć i SOHCAHTOA.

matrix-transform-for-the-mathematically-challenged/

Kiedy czytasz dokumentację Matrix, widać metody obracania, tłumaczenia itp z prefiksów „Ustaw”, „post” lub „pre”.

Wyobraź sobie, że tworzysz nową matrycę. Następnie użyj setRotate(), aby ustawić macierz, aby wykonać obrót. Następnie użyj preTranslate(), aby wykonać tłumaczenie. Ponieważ użyłeś "pre", tłumaczenie dzieje się przed rotacją. Gdybyś użył "postu", rotacja byłaby pierwsza. "set" kasuje wszystko, co jest w macierzy i zaczyna się od nowa.

Aby odpowiedzieć na konkretne pytanie, new Matrix() tworzy 'macierz jednostkowa'

{1, 0, 0 
0, 1, 0 
0, 0, 1} 

który skaluje się o 1 (a więc tym samym rozmiarze) i robi translacji, obrotu lub nie pochylać. Dlatego zastosowanie macierzy tożsamości nic nie da. Następną metodą jest preScale(), która jest stosowana do tej macierzy tożsamości, aw przypadku, który pokazałeś, tworzy macierz, która skaluje i nie robi nic innego, tak samo można zrobić przy użyciu funkcji setScale() lub postScale().

Mam nadzieję, że to pomoże.

+1

To jest najlepsze wytłumaczenie matryc, jakie kiedykolwiek przeczytałem. – Rasmus

+1

Szymon, to jest krótkie, ale w tym samym krótkim objaśnieniu. Doskonały! – Mike

+1

Ziemia potrzebuje więcej ludzi takich jak ty, Simon! –