2012-11-06 40 views
9

Tôi có đoạn mã này. Tôi không hiểu ma trận.prescale() và createBitmap với ma trận được truyền. Điều đó có nghĩa là gì? Có trang web mô phỏng nào để hiểu tính toán ma trận không? Bạn có thể cho tôi một số trang web về toán học được sử dụng cho đồ họa không? Tôi xin lỗi vì tôi không giỏi môn toán. :)Hiểu rõ ma trận tính toán

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

Tôi thấy rằng bạn đã chỉnh sửa bài đăng của mình. Tôi có thể trả lời cho tôi nhiều hơn không? – Simon

+0

Quá trừu tượng để hiểu nhưng không sao cả. Tôi thấy khó hiểu ma trận chuyển đổi và đại số. – Emerald214

Trả lời

64

Đừng nghĩ về điều đó quá khó, ít nhất là không ở giai đoạn đầu.

Chỉ cần nghĩ về ma trận dưới dạng một dãy số. Trong trường hợp này, Ma trận Android có 3 hàng gồm 3 số. Mỗi số cho biết chức năng đồ họa của Android phải làm gì để mở rộng (lớn hơn/nhỏ hơn), dịch (di chuyển), xoay (lần lượt) hoặc nghiêng (biến dạng trong mặt phẳng 2D) là "vật" mà ma trận được áp dụng.

Ma trận trông như thế này (xem docs tại đây).

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

Tin tốt là bạn không cần phải biết toán học ma trận, thực sự hầu như không có môn toán, để sử dụng ma trận trong Android. Đó là những phương thức như preScale() làm cho bạn. Để hiểu toán học đằng sau không phải là khó, đối với hầu hết những thứ bạn chỉ cần thêm, nhân và SOHCAHTOA.

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

Khi bạn đọc tài liệu Matrix, bạn sẽ thấy phương pháp để xoay, dịch vv với các tiền tố của 'đặt', 'bài' hoặc 'trước'.

Hãy tưởng tượng rằng bạn tạo một ma trận mới. Sau đó, bạn sử dụng setRotate() để thiết lập ma trận để thực hiện xoay vòng. Sau đó bạn sử dụng preTranslate() để làm một bản dịch. Bởi vì bạn đã sử dụng 'pre', bản dịch diễn ra trước khi xoay vòng. Nếu bạn đã sử dụng 'post', vòng quay sẽ xảy ra trước tiên. 'set' xóa bất cứ điều gì trong ma trận và bắt đầu lại.

Để trả lời câu hỏi cụ thể của bạn, Matrix mới() tạo ra 'nhận dạng ma trận'

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

mà quy mô 1 (do đó cùng kích thước) và không có dịch, luân chuyển hoặc nghiêng. Do đó, việc áp dụng ma trận nhận diện sẽ không làm gì cả. Phương thức tiếp theo là preScale() được áp dụng cho ma trận nhận dạng này và trong trường hợp bạn đã hiển thị, kết quả là ma trận có tỷ lệ và không làm gì khác cũng có thể được thực hiện bằng cách sử dụng setScale() hoặc postScale().

Hy vọng điều này sẽ hữu ích.

+1

Đây là giải thích tốt nhất cho ma trận, tôi đã từng đọc – Rasmus

+1

Simon, đây là tóm tắt nhưng trong cùng một lời giải thích ngắn. Xuất sắc! – Mike

+1

trái đất cần nhiều người hơn như bạn, Simon! –

Các vấn đề liên quan