graphics包Matrix类函数理解

二维图形变换的矩阵如下:

|ScaleX  SkewX  TransX|

|SkewY  ScaleY  TransY|

|Persp0  Persp1  Persp2|

ScaleX:x方向缩放倍率

ScaleY:y方向缩放倍率

TransX:x方向平移值

TransY:y方向平移值

SkewX:x方向错切值

SkewY:y方向错切值

Persp:齐次坐标的值,一般取值0或1。

graphics包中的Matrix类的方法调用native计算,jni调用了skia库中SkMatrix.cpp文件下的函数计算,各个函数实际上都是在对二维变换矩阵进行赋值:

void SkMatrix::setScale(SkScalar sx, SkScalar sy) {
    if (1 == sx && 1 == sy) {
        this->reset();
    } else {
        fMat[kMScaleX] = sx;
        fMat[kMScaleY] = sy;
        fMat[kMPersp2] = 1;

        fMat[kMTransX] = fMat[kMTransY] =
        fMat[kMSkewX]  = fMat[kMSkewY] =
        fMat[kMPersp0] = fMat[kMPersp1] = 0;

        this->setTypeMask(kScale_Mask | kRectStaysRect_Mask);
    }
}

这是以原点为中心进行缩放的矩阵赋值。

void SkMatrix::setScale(SkScalar sx, SkScalar sy, SkScalar px, SkScalar py) {
    if (1 == sx && 1 == sy) {
        this->reset();
    } else {
        fMat[kMScaleX] = sx;
        fMat[kMScaleY] = sy;
        fMat[kMTransX] = px - sx * px;
        fMat[kMTransY] = py - sy * py;
        fMat[kMPersp2] = 1;

        fMat[kMSkewX]  = fMat[kMSkewY] =
        fMat[kMPersp0] = fMat[kMPersp1] = 0;

        this->setTypeMask(kScale_Mask | kTranslate_Mask | kRectStaysRect_Mask);
    }
}

这是以指定坐标(px, py)为中心点进行缩放的矩阵赋值。与上一个函数对比可以发现,不仅进行了缩放还进行了平移,所以才可以表现为在指定点处缩放。

void SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
    if (!dx && !dy) {
        return;
    }

    if (this->hasPerspective()) {
        SkMatrix    m;
        m.setTranslate(dx, dy);
        this->preConcat(m);
    } else {
        fMat[kMTransX] += sdot(fMat[kMScaleX], dx, fMat[kMSkewX], dy);
        fMat[kMTransY] += sdot(fMat[kMSkewY], dx, fMat[kMScaleY], dy);
        this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
    }
}

void SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
    if (!dx && !dy) {
        return;
    }

    if (this->hasPerspective()) {
        SkMatrix    m;
        m.setTranslate(dx, dy);
        this->postConcat(m);
    } else {
        fMat[kMTransX] += dx;
        fMat[kMTransY] += dy;
        this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
    }
}
static inline SkScalar sdot(SkScalar a, SkScalar b, SkScalar c, SkScalar d) {
    return a * b + c * d;
}

上面的这三个函数说明了pre和post的区别,假如有如下操作:

(1)

Matrix.scale(0.5, 0.5);

Matrix.preTranslate(100, 100);

(2)

Matrix.scale(0.5, 0.5);

Matrix.postTranslate(100, 100);

第一段代码会平移(100*0.5, 100*0.5),第二段代码会平移(100, 100),post不受之前的矩阵变换的影响。

其它函数的pre和post的意思都是如此。

另外:

scale缩放取值为-1时可以得到镜像矩阵

    protected static Matrix getHorizontalMatrix(float width) {
        Matrix flipHorizontalMatrix = new Matrix();
        flipHorizontalMatrix.setScale(-1, 1);
        flipHorizontalMatrix.postTranslate(width, 0);
        return flipHorizontalMatrix;
    }

上面的矩阵表示对原图进行水平镜像变换。

时间: 2024-10-07 19:04:25

graphics包Matrix类函数理解的相关文章

android.graphics包简介

Tip android.graphics 包 Abstract android.graphics 包android提供的2D开发包,它提供了一些初级图形工具,诸如画布.颜色过滤器.画 笔等 Usage surfaceview结合graphics包可以创建自定义控件 MyTick 绘图时可以想想自己在一个绘图软件中绘画,在一块画布(canvas)上,使用自己调好的笔(Paint)画线(Path)画形状(drawRect drawOval),插入想要的图片(drawBitmap),插入想要的特定格式

R语言绘图——Graphics包

先给出一下参考说明: R绘图 http://www.cnblogs.com/holbrook/archive/2013/05/13/3075777.html R语言中颜色对照表 http://wenku.baidu.com/link?url=PnCsIjv3e_OGw2COt4AEo3_tHTisOYoHLGf9bf-jjzkfGIJhFZpEQrS6CAELUypnR82Wdj6VclURzzACwbUOszZVHoPnNt27RiM-Uv1B4z3 参考书<R语言核心技术手册> 我只是个勤

android.graphics包中的一些类的使用

游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=764 游戏开发系列(opengl es基础知识): http://www.moandroid.com/?p=1730 线性代数(包含矩阵的相关知识): http://dl.iteye.com/topics/download/b56a388a-3408-3179-972b-3a72bdbaaa28 俄

Graphics 和 Matrix 使用注意

Graphics 可以进行画图,Matrix 可以对画布内容进行变换 Font font = new Font("宋体", 1F); //检测字符串大小 SizeF sizeF = CreateGraphics().MeasureString("abc", font); //displayWidth为实际显示宽度,通过此方式将字体变大 float disX =(float)(displayWidth / sizeF.Width); float disY = (flo

Matrix.mapRect()理解

RectF r = new RectF(50, 0, 100, 100); Log.d("m1", "-r.left = " + r.left + ", right = " + r.right + ", top = " + r.top + ", bottom = " + r.bottom); Matrix m = new Matrix(); m.setScale(2, 3); m.mapRect(r); L

理解CSS3 transform中的Matrix(矩阵)

一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵)”的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机会. CSS同行间:你是不是有这样的感觉:哎呀呀,每天就是对着设计图切页面,貌似技术没有得到实质性地提升啊,或者觉得日后高度有限! 我们应该都知道二八法则(巴莱多定律),即任何一组东西中

理解CSS3 transform中的Matrix(矩阵)——张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2427 一.哥,我被你吓住了 打架的时候会被块头大的吓住,学习的时候会被奇怪名字吓住(如“拉普拉斯不等式”).这与情感化设计本质一致:界面设计好会让人觉得这个软件好用! 所以,当看到上面“Matrix(矩阵)”的时候,难免会心生畏惧(即使你已经学过),正常心理.实际上,这玩意确实有点复杂. 然而,这却是屌丝逆袭的一个好机

android camera获取matrix作用于canvas的研究

网上查了一下相关的文章,认为自己看懂了,但是实际测试时和网上说的并不一样(后来研究发现,那个人写的是错的!!!),所以,在此提醒大家,要勇于质疑,勇于提出问题. 首先说明camera类,这个类位于package android.graphics 包下,用于图像3D变换,通过旋转.偏移等方式,最终通过getMatrix(Matrix)方法拿到矩阵,作用于canvas,使得画面呈现出立体效果. camera的源码没什么看的,这里列举他的主要方法: public native void save();

UNITY_MATRIX_IT_MV[Matrix] (转载)

转载 http://blog.csdn.net/cubesky/article/details/38682975 前面发了一篇关于unity Matrix的文章. http://blog.csdn.net/cubesky/article/details/38664143 其中对于一般的Matrix可以说应该有一个清晰的了解了.但是对于UNITY_MATRIX_IT_MV这些matrix估计理解起来还是比较有问题.这里再重点描述一下UNITY_MATRIX_IT_MV. 首先,我们看一下unity