1: package com.jme.math;
2:
3: import java.io.IOException;
4: import java.io.Serializable;
5: import java.nio.FloatBuffer;
6: import java.util.logging.Logger;
7:
8: import com.jme.system.JmeException;
9: import com.jme.util.export.InputCapsule;
10: import com.jme.util.export.JMEExporter;
11: import com.jme.util.export.JMEImporter;
12: import com.jme.util.export.OutputCapsule;
13: import com.jme.util.export.Savable;
14: import com.jme.util.geom.BufferUtils;
15:
16: /**
17: * <code>Matrix3f</code> defines a 3x3 matrix. Matrix data is maintained
18: * internally and is accessible via the get and set methods. Convenience methods
19: * are used for matrix operations as well as generating a matrix from a given
20: * set of values.<br/>
21: * 3X3矩阵类
22: *
23: * @author Mark Powell
24: * @author Joshua Slack
25: */
26: public class Matrix3f implements Serializable, Savable, Cloneable {
27: private static final Logger logger = Logger.getLogger(Matrix3f.class
28: .getName());
29:
30: private static final long serialVersionUID = 1L;
31:
32: public float m00, m01, m02;
33: public float m10, m11, m12;
34: public float m20, m21, m22;
35:
36: /**
37: * Constructor instantiates a new <code>Matrix3f</code> object. The initial
38: * values for the matrix is that of the identity matrix.<br/>
39: * 默认构造单位矩阵
40: *
41: */
42: public Matrix3f() {
43: loadIdentity();
44: }
45:
46: /**
47: * constructs a matrix with the given values.
48: *
49: * @param m00
50: * 0x0 in the matrix.
51: * @param m01
52: * 0x1 in the matrix.
53: * @param m02
54: * 0x2 in the matrix.
55: * @param m10
56: * 1x0 in the matrix.
57: * @param m11
58: * 1x1 in the matrix.
59: * @param m12
60: * 1x2 in the matrix.
61: * @param m20
62: * 2x0 in the matrix.
63: * @param m21
64: * 2x1 in the matrix.
65: * @param m22
66: * 2x2 in the matrix.
67: */
68: public Matrix3f(float m00, float m01, float m02, float m10, float m11,
69: float m12, float m20, float m21, float m22) {
70:
71: this.m00 = m00;
72: this.m01 = m01;
73: this.m02 = m02;
74: this.m10 = m10;
75: this.m11 = m11;
76: this.m12 = m12;
77: this.m20 = m20;
78: this.m21 = m21;
79: this.m22 = m22;
80: }
81:
82: /**
83: * Copy constructor that creates a new <code>Matrix3f</code> object that is
84: * the same as the provided matrix.
85: *
86: * @param mat
87: * the matrix to copy.
88: */
89: public Matrix3f(Matrix3f mat) {
90: copy(mat);
91: }
92:
93: /**
94: * <code>copy</code> transfers the contents of a given matrix to this
95: * matrix. If a null matrix is supplied, this matrix is set to the identity
96: * matrix.
97: *
98: * @param matrix
99: * the matrix to copy.
100: */
101: public void copy(Matrix3f matrix) {
102: if (null == matrix) {
103: loadIdentity();
104: } else {
105: m00 = matrix.m00;
106: m01 = matrix.m01;
107: m02 = matrix.m02;
108: m10 = matrix.m10;
109: m11 = matrix.m11;
110: m12 = matrix.m12;
111: m20 = matrix.m20;
112: m21 = matrix.m21;
113: m22 = matrix.m22;
114: }
115: }
116:
117: /**
118: * <code>get</code> retrieves a value from the matrix at the given position.
119: * If the position is invalid a <code>JmeException</code> is thrown.<br/>
120: * 获取指定位置的元素值
121: *
122: * @param i
123: * the row index.行索引(取值范围:0、1、2)
124: * @param j
125: * the colum index.列索引(取值范围:0、1、2)
126: * @return the value at (i, j).
127: */
128: public float get(int i, int j) {
129: switch (i) {
130: case 0:
131: switch (j) {
132: case 0:
133: return m00;
134: case 1:
135: return m01;
136: case 2:
137: return m02;
138: }
139: case 1:
140: switch (j) {
141: case 0:
142: return m10;
143: case 1:
144: return m11;
145: case 2:
146: return m12;
147: }
148: case 2:
149: switch (j) {
150: case 0:
151: return m20;
152: case 1:
153: return m21;
154: case 2:
155: return m22;
156: }
157: }
158:
159: logger.warning("Invalid matrix index.");
160: throw new JmeException("Invalid indices into matrix.");
161: }
162:
163: /**
164: * <code>get(float[])</code> returns the matrix in row-major or column-major
165: * order.<br/>
166: * 将矩阵按行或列的顺序存入参数data数组中
167: *
168: * @param data
169: * The array to return the data into. This array can be 9 or 16
170: * floats in size. Only the upper 3x3 are assigned to in the case
171: * of a 16 element array.
172: * @param rowMajor
173: * True for row major storage in the array (translation in
174: * elements 3, 7, 11 for a 4x4), false for column major
175: * (translation in elements 12, 13, 14 for a 4x4).
176: */
177: public void get(float[] data, boolean rowMajor) {
178: if (data.length == 9) {
179: if (rowMajor) {
180: data[0] = m00;
181: data[1] = m01;
182: data[2] = m02;
183: data[3] = m10;
184: data[4] = m11;
185: data[5] = m12;
186: data[6] = m20;
187: data[7] = m21;
188: data[8] = m22;
189: } else {
190: data[0] = m00;
191: data[1] = m10;
192: data[2] = m20;
193: data[3] = m01;
194: data[4] = m11;
195: data[5] = m21;
196: data[6] = m02;
197: data[7] = m12;
198: data[8] = m22;
199: }
200: } else if (data.length == 16) {
201: if (rowMajor) {
202: data[0] = m00;
203: data[1] = m01;
204: data[2] = m02;
205: data[4] = m10;
206: data[5] = m11;
207: data[6] = m12;
208: data[8] = m20;
209: data[9] = m21;
210: data[10] = m22;
211: } else {
212: data[0] = m00;
213: data[1] = m10;
214: data[2] = m20;
215: data[4] = m01;
216: data[5] = m11;
217: data[6] = m21;
218: data[8] = m02;
219: data[9] = m12;
220: data[10] = m22;
221: }
222: } else {
223: throw new JmeException(
224: "Array size must be 9 or 16 in Matrix3f.get().");
225: }
226: }
227:
228: /**
229: * <code>getColumn</code> returns one of three columns specified by the
230: * parameter. This column is returned as a <code>Vector3f</code> object.<br/>
231: * 获取指定列构造的向量
232: *
233: * @param i
234: * the column to retrieve. Must be between 0 and 2.
235: * @return the column specified by the index.
236: */
237: public Vector3f getColumn(int i) {
238: return getColumn(i, null);
239: }
240:
241: /**
242: * <code>getColumn</code> returns one of three columns specified by the
243: * parameter. This column is returned as a <code>Vector3f</code> object.<br/>
244: * 获取指定列构造的向量
245: *
246: * @param i
247: * the column to retrieve. Must be between 0 and 2.
248: * @param store
249: * the vector object to store the result in. if null, a new one
250: * is created.
251: * @return the column specified by the index.
252: */
253: public Vector3f getColumn(int i, Vector3f store) {
254: if (store == null)
255: store = new Vector3f();
256: switch (i) {
257:
分享到:
相关推荐
在这个主题中,我们将深入探讨3x3矩阵模的概念,并通过C语言实现一个计算3x3矩阵模的程序。 首先,我们需要理解什么是3x3矩阵。一个3x3矩阵是由3行3列的数构成的二维数组,表示为: ``` | a11 a12 a13 | | a21 a22...
本文将深入探讨如何使用51单片机驱动3x3矩阵键盘,并结合给定的文件"key3x3.c"和"key.h"来解析实现方法。 3x3矩阵键盘是由9个按键排列成3行3列的结构,通过连接到单片机的IO口来实现按键检测。这种键盘布局可以有效...
3x3矩阵键盘显示通过按键用一位数码管显示012345678
定义了一个矩阵的储存方法CMatrix 定义了一个矩阵的预算方法CMatrix_Operation 代码可以实现以下功能: ...7.矩阵的逆(只限于3x3) 8.向量的单位化 此代码为本人做3D建模(空间旋转)时用的基础代码
在MATLAB开发中,理解和操作不同尺寸的矩阵是至关重要的,特别是对于2x2和3x3矩阵。这些矩阵在图像处理与计算机视觉领域中有着广泛的应用,因为它们可以用来表示变换、描述图像特征或者进行滤波操作。在这个话题中,...
在Simulink中处理矩阵运算,特别是计算3x3矩阵的行列式,是信号处理和系统建模过程中常见的任务。行列式是线性代数中的一个基本概念,它能够反映矩阵的一些重要特性,如矩阵是否可逆、其秩以及特征值等。下面将详细...
3X3键盘是一种微型的机械键盘设计,通常用于节省桌面空间或者作为个人定制的输入设备。这个项目包含PCB(印刷电路板)设计和原理图,是制作这种小尺寸键盘的关键部分。 首先,我们来详细了解一下3X3键盘的设计特点...
C语言 实现3X3矩阵主对角线和副对角线求和,输入矩阵,输出主对角线和副对角线,欢迎下载,桌面系统VS环境直接运行
COMP_DECOMP_MATRIX:从欧拉角(以度为单位)组成 3x3 旋转矩阵或将 3x3 旋转矩阵分解为欧拉角(以度为单位) 输入:1x3 欧拉向量围绕 x 旋转 (1), y 旋转 (2) 和 z、旋转 (3) 或 3x3 旋转矩阵输出:表示绕 x、y 和 ...
3. 矩阵的存储方式:矩阵可以以顺序存储或以列存储。在实现矩阵乘法时,需要确保矩阵的存储方式是正确的。 汇编语言实现矩阵乘法是一个复杂的计算机科学概念,它需要了解计算机科学的基础知识,如数据类型、存储...
矩阵的Java实现,含矩阵的所有运算,也可与向量进行运算表示图形的变换。
在使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作。
本篇文章将详细讨论如何利用卡丹公式(Cayley-Hamilton Theorem)来一次性计算多个 3x3 矩阵的特征值,以及为何这种方法相对于直接使用内置的 `eig` 函数可以显著提高效率。 首先,特征值是矩阵 A 的解,满足方程 |...
**源代码实现3x3中值滤波器的FPGA技术** 在数字信号处理领域,滤波器是一种关键的工具,用于去除噪声、平滑数据或突出特定频率成分。3x3中值滤波器是一种非线性滤波器,特别适用于消除椒盐噪声(即由离散像素值造成...
简易的矩阵加密编码法(cipher),使用2*2、3*3矩阵加密编码。 M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素,但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示...
在本文中,我们将深入探讨Arduino平台以及如何使用它来创建一个引人入胜的3x3x3 LED矩阵项目。Arduino是一种开源电子原型平台,它结合了硬件和软件,使得即使是初学者也能轻松进行电子创新。这个项目由Joshua Manley...
在数学上,一个3x3矩阵是一个由3行3列组成的方阵,而这个矩阵中的每一个元素都可以通过两个索引进行访问,其中第一个索引代表行,第二个索引代表列。例如,如果我们有一个3x3矩阵M,那么M[1][2]代表的是第二行第三列...
3x3高斯滤波器是一种局部操作,它通过在图像上滑动一个3x3的矩阵(也称为核或权重矩阵)来对每个像素进行处理。这个矩阵包含了高斯函数的离散近似值,其中中心元素的权重最高,周围元素的权重逐渐降低。高斯滤波器的...
在描述中提到的“网红按钮”,可能是指这种3x3矩阵键盘因其简单易用且具有趣味性,在网络上受到了广泛的关注和喜爱。 1. **矩阵键盘原理**: 矩阵键盘的工作原理基于行列扫描法。通过连接键盘的行线(Row)和列线...
计算许多3x3实对称矩阵的特征值。 计算是非迭代的,基于完全矢量化的 matlab 矩阵运算,并且支持 GPU 计算。 它可以快速有效地同时处理多个 3×3 矩阵。 此代码特别适合 3D 中的张量/黎曼微积分、体积张量图像的可视...