Flash中步入Matrix函式

2021-05-25 02:51:23 字數 2900 閱讀 3348

看到標題也許很多數學不好或中學時上課打盹的朋友會感到反感,但放心的是在這裡的matrix已經簡化了很多瑣碎的步驟,也不用大家拿一張紙拼命的做計算。對想製作遊戲的朋友也是必學的路程,所以大致上明白了運用的思路就可以說掌握了技巧。

在字典中的說明不夠充分讓大家去理解,所以開始還是要重複說明一下。matrix矩陣就像個陣列,排列方式是以列與行組成。在flash 8中所提供的是3 x 3矩陣,3x3的矩陣可以定義出乙個3d計算,但在flash 8中只供2d的計算,即 x 和 y 的計算,那麼我們來看看這個矩陣的定義

以上的每個字母都有各自的運用意義,分別是:

a = 控制 x 的寬度

b = 控制 y 的傾斜

c = 控制 x 的傾斜

d = 控制 y 的高度

tx = 控制 x 座標位置

ty = 控制 y 座標位置

接下來就是如何在matrix函式中定義,其實很簡單。首先匯入 matrix 的封包,然後就可以開始定義

import flash.geom.matrix; //匯入類包

var mymatrix:matrix = new matrix(a, b, c, d, tx, ty); //開始定義matrix類

當中的a, b, c, d, tx, ty可以直接定義。再來我們把這段引入例子,以證明及幫助了解以上各個引數的運用。

步驟1:在場景上建立乙個mc,即畫個方形後按f8選擇movieclip(影片),定義例項名為mc

步驟2:到場景第一幀開始我們的**

matrix 必須配合 transform 才能實現出所定義的效果,不多說了開始看看**吧

import flash.geom.matrix; //匯入matrix 類包

import flash.geom.transform; //到入transform類包

var mymatrix:matrix = new matrix(1,0,0,1,100,100); //引數定義為寬度比例為1,無任何的傾斜,高度比例1,xy座標為100

var mytransform:transform = new transform(mc); //transform物件為場景上的mc

mytransform.matrix = mymatrix; //賦予transform的matrix函式為我們所定的mymatrix類

那麼接下來測試就可以看到結果了,看不出什麼效果??那麼我來換換matrix的引數值成

var mymatrix:matrix = new matrix(1,1,0,1,100,100); //第二引數改為1

這樣測試是不是就看到我們的b影響了mc的形狀呢??matrix的運用就是這樣,很簡單吧??所以很多東西不要以為很困難,其實都很簡單。

再來我們要深入一點,去了解matrix的計算,知其一不知其二也是無法正確掌握好運用的。matrix的計算其實很簡單,就只有兩行的公式:

x』 = a*x + c*y + tx;

y』 = b*x + d*y + ty;

意思就是

新座標x = a * 現有x座標 + c * 現有y座標 + 常量tx;

新座標y =b * 現有x座標 +d * 現有y座標 + 常量ty;

我們把這個例子代入公式中

a = 2, b = 0, c = 0, d = 1, tx = 0, ty = 0

x』 = 2x + 0y + 0;

y』 = 0x + 1y + 0;

x』 = 2x;

y』 = y;

可以知道下乙個新的x值會是目前x的兩倍,而y保持不變,在一開始已經說了a的變化會影響寬度,那麼出來的形狀就是寬度為現有的兩倍了。

在matrix中還有幾個基本函式可以控制,所以也可以不用一直重新定義matrix類,那就是

matrix.scale(a,d);

matrix.translate(tx1, ty2); //這裡的tx1和ty1是所要遞增或遞減原有tx和ty的數值

matrix.rotate(弧度); //弧度就是 (角度/ 180)* math.pi

基本上只要代入公式就可以得到答案,所以我只說明rotate函式的計算

math.rotate((50/180)*math.pi) //這裡是要求旋轉 50 度

公式為:

x』 = cos(a)*x + sin(c)*y + tx;

y』 = -sin(b)*x + cos(d)*y + ty;

x』 = cos(50)*x + sin(50)*y + tx;

y』 = -sin(50)*x + cos(50)*y + ty;

x』 = 0.64*x + 0.76*y + tx;

y』 = -0.76*x + 0.64*y + ty;

得到的這個答案再把現有座標x和y代入就可以求出新座標了

那麼我們來驗證a,b,c,d的數值是否正確吧,開啟乙個新的場景,在幀上輸入

import flash.geom.matrix;

var mymatrix:matrix = new matrix();

mymatrix.rotate((50/180)*math.pi);

trace(mymatrix.tostring()); //看看當中的a,b,c,d是不是也是這個數值呢?

好啦。。到了最後的部分也就可以完結這篇教程了,最重要的一點也是很多人百思不解的問題是:

求出乙個x和y,為何會能夠讓元件轉動呢?這只是乙個座標啊??最多也只是控制座標點,怎麼那麼神奇??

這點就是flash提供的方便了,其實為何需要配合transform的關鍵就是在此,transform指定了元件之後會得到4個角的座標。所以我們使用transform.matrix函式就是讓transform把matrix的公式代入每個角的座標。

所以公式中的x和y就是每個角的座標,座標代入公式就直接取得了新的座標值而達到旋轉變形等的功能。這是不是簡單化了很多呢??總比在之前版本還要自己定義函式。

步入Matrix函式

步入matrix函式 因為工作忙,所以很久沒有出來寫教程了。今天就來寫個目前flash 8所提供的新函式,在中文 中也還沒有看到的,這應該比較新鮮吧 看到標題也許很多數學不好或中學時上課打盹的朋友會感到反感,但放心的是在這裡的matrix已經簡化了很多瑣碎的步驟,也不用大家拿一張紙拼命的做計算。對想...

Android中Matrix開發彙總

開發中遇到一些涉及到matrix的地方,現在此歸納,便於日後查閱。通過對imageview設定matrix來實現imageview中的單指拖動和兩指縮放 核心方法 imageview.setimagematrix matrix 所以我們的重點在於去操作乙個matrix.該處主要用到的是利用matri...

NumPy中ndarray和matrix的四則運算

numpy中最重要的類是ndarray,顧名思義,即多維陣列。import numpy as np行向量 a np.array 1,2,3 a.shape 3l,列向量 b np.array 1 2 3 b.shape 3l,1l 二維矩陣 m np.array 1,2,3 4,5,6 7,8,9 ...