2012-11-06 4 views
9

이 코드가 있습니다. matrix.prescale()과 행렬이 전달 된 createBitmap을 이해할 수 없습니다. 그게 무슨 소리 야? 매트릭스 계산을 이해할 수있는 시뮬레이션 웹 사이트가 있습니까? 그래픽에 사용되는 수학에 대한 웹 사이트를 제공해 줄 수 있습니까? 수학에 만족하지 못해 죄송합니다. :)행렬 계산을 명확하게 이해하십시오.

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

내 소식을 수정 한 것으로 나타났습니다. 내가 대답 할 수있는 것이 더 많습니까? – Simon

+0

이해 하기엔 너무 추상적이지만 괜찮습니다. 행렬 변환과 대수학을 이해하는 것이 어렵다는 것을 알게되었습니다. – Emerald214

답변

64

적어도 초기 단계에서는 너무 어렵지 않다고 생각하지 마십시오.

행렬을 숫자 배열로 생각하십시오. 이 경우 Android 매트릭스는 3 행의 3 행을 갖습니다. 각 숫자는 행렬이 적용되는 "물건"을 Android 그래픽 함수가 확장 (더 크게/더 작게), 변환 (이동), 회전 (회전) 또는 기울이기 (2D 평면에서 왜곡)

매트릭스 모양은 다음과 같습니다 (여기 docs 참조).

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

좋은 소식

당신이 어떤 매트릭스 수학을 알고 실제로 거의 수학을 필요로하지 않는 안드로이드에서 행렬을 사용하는 것입니다. 이것이 preScale()과 같은 메소드가 당신을 위해하는 일입니다. 뒤에있는 수학을 이해하는 것은 그다지 어렵지 않습니다. 대부분의 것들을 위해서만 덧셈하고 곱해야합니다. SOHCAHTOA. 당신은 매트릭스 문서를 읽을 때

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

, 당신이 '설정', '포스트'또는 '사전'의 접두사 등 번역, 회전을위한 방법을 볼 수 있습니다.

새 행렬을 만들었다 고 가정 해보십시오. 그런 다음 setRotate()를 사용하여 행렬을 설정하여 순환 게재를 설정합니다. 그런 다음 preTranslate()를 사용하여 번역을 수행합니다. 'pre'를 사용 했으므로 회전이 회전하기 전에 변환이 발생합니다. '게시'를 사용했다면 먼저 회전이 발생합니다. 'set'은 행렬에있는 모든 내용을 지우고 다시 시작합니다.

가 특정 질문에 대답하기 위해, 새로운 매트릭스 (1) (따라서 같은 크기)으로의 배율 '행렬'

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

만들고 더 이동, 회전하지 않습니다 또는 왜곡. 따라서 항등 행렬을 적용하면 아무런 효과가 없습니다. 다음 방법은이 항등 행렬에 적용되는 preScale()이며, 표시된 경우에는 배율이있는 행렬이되며 그 밖의 것은 수행하지 않으므로 setScale() 또는 postScale()을 사용하여 수행 할 수도 있습니다.

희망이 도움이됩니다.

+1

이것은 행렬에 대한 가장 좋은 설명이다. 나는 – Rasmus

+1

Simon을 읽었다. 이것은 간단하지만 짧은 설명이다. 우수한! – Mike

+1

지구는 당신 같은 더 많은 사람들이 필요합니다, Simon! –