`
xiefeifeihu
  • 浏览: 99577 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

3x3矩阵类

J# 
阅读更多
   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矩阵模

    在这个主题中,我们将深入探讨3x3矩阵模的概念,并通过C语言实现一个计算3x3矩阵模的程序。 首先,我们需要理解什么是3x3矩阵。一个3x3矩阵是由3行3列的数构成的二维数组,表示为: ``` | a11 a12 a13 | | a21 a22...

    51单片机3x3矩阵键盘驱动

    本文将深入探讨如何使用51单片机驱动3x3矩阵键盘,并结合给定的文件"key3x3.c"和"key.h"来解析实现方法。 3x3矩阵键盘是由9个按键排列成3行3列的结构,通过连接到单片机的IO口来实现按键检测。这种键盘布局可以有效...

    矩阵键盘3x3

    3x3矩阵键盘显示通过按键用一位数码管显示012345678

    C#用矩阵运算(实现3x3矩阵求逆)

    定义了一个矩阵的储存方法CMatrix 定义了一个矩阵的预算方法CMatrix_Operation 代码可以实现以下功能: ...7.矩阵的逆(只限于3x3) 8.向量的单位化 此代码为本人做3D建模(空间旋转)时用的基础代码

    matlab开发-2x2和3x3矩阵的多个等效值

    在MATLAB开发中,理解和操作不同尺寸的矩阵是至关重要的,特别是对于2x2和3x3矩阵。这些矩阵在图像处理与计算机视觉领域中有着广泛的应用,因为它们可以用来表示变换、描述图像特征或者进行滤波操作。在这个话题中,...

    simulink 中 3 x 3 矩阵的行列式.rar

    在Simulink中处理矩阵运算,特别是计算3x3矩阵的行列式,是信号处理和系统建模过程中常见的任务。行列式是线性代数中的一个基本概念,它能够反映矩阵的一些重要特性,如矩阵是否可逆、其秩以及特征值等。下面将详细...

    3X3键盘有PCB和原理图

    3X3键盘是一种微型的机械键盘设计,通常用于节省桌面空间或者作为个人定制的输入设备。这个项目包含PCB(印刷电路板)设计和原理图,是制作这种小尺寸键盘的关键部分。 首先,我们来详细了解一下3X3键盘的设计特点...

    C语言 实现3X3矩阵主对角线和副对角线求和

    C语言 实现3X3矩阵主对角线和副对角线求和,输入矩阵,输出主对角线和副对角线,欢迎下载,桌面系统VS环境直接运行

    组合/分解 3x3 旋转矩阵 (comp_decomp_matrix ):从欧拉角组合 3x3 旋转矩阵或将 3x3 旋转矩阵分解为欧拉角-matlab开发

    COMP_DECOMP_MATRIX:从欧拉角(以度为单位)组成 3x3 旋转矩阵或将 3x3 旋转矩阵分解为欧拉角(以度为单位) 输入:1x3 欧拉向量围绕 x 旋转 (1), y 旋转 (2) 和 z、旋转 (3) 或 3x3 旋转矩阵输出:表示绕 x、y 和 ...

    汇编语言实现矩阵乘法

    3. 矩阵的存储方式:矩阵可以以顺序存储或以列存储。在实现矩阵乘法时,需要确保矩阵的存储方式是正确的。 汇编语言实现矩阵乘法是一个复杂的计算机科学概念,它需要了解计算机科学的基础知识,如数据类型、存储...

    Mateix3x3f.java(矩阵的Java实现)

    矩阵的Java实现,含矩阵的所有运算,也可与向量进行运算表示图形的变换。

    编写并测试3*3矩阵转置函数,使用数组保存3*3矩阵

    在使用循环语句实现矩阵元素的行列对调,注意在循环语句中究竟需要对哪些元素进行操作。

    2x2 和 3x3 矩阵的多个特征值:使用卡丹公式一次性计算多个 (3 x 3) 矩阵的特征值-matlab开发

    本篇文章将详细讨论如何利用卡丹公式(Cayley-Hamilton Theorem)来一次性计算多个 3x3 矩阵的特征值,以及为何这种方法相对于直接使用内置的 `eig` 函数可以显著提高效率。 首先,特征值是矩阵 A 的解,满足方程 |...

    源代码_3x3中值滤波器的fpga实现_VERILOG

    **源代码实现3x3中值滤波器的FPGA技术** 在数字信号处理领域,滤波器是一种关键的工具,用于去除噪声、平滑数据或突出特定频率成分。3x3中值滤波器是一种非线性滤波器,特别适用于消除椒盐噪声(即由离散像素值造成...

    VB使用2x2、3x3矩阵加密编码法(cipher)实例.rar

    简易的矩阵加密编码法(cipher),使用2*2、3*3矩阵加密编码。 M 是用来将字串 "编码" 的矩阵 ,可以任意指定矩阵中的元素,但是必须是一个n×n的可逆方阵(invertible square matrix),这里只简单的以2×2的方阵来表示...

    arduino::alien_monster:3x3x3 LED矩阵

    在本文中,我们将深入探讨Arduino平台以及如何使用它来创建一个引人入胜的3x3x3 LED矩阵项目。Arduino是一种开源电子原型平台,它结合了硬件和软件,使得即使是初学者也能轻松进行电子创新。这个项目由Joshua Manley...

    3阶矩阵转置

    在数学上,一个3x3矩阵是一个由3行3列组成的方阵,而这个矩阵中的每一个元素都可以通过两个索引进行访问,其中第一个索引代表行,第二个索引代表列。例如,如果我们有一个3x3矩阵M,那么M[1][2]代表的是第二行第三列...

    3X3高斯滤波,模糊等图像处理

    3x3高斯滤波器是一种局部操作,它通过在图像上滑动一个3x3的矩阵(也称为核或权重矩阵)来对每个像素进行处理。这个矩阵包含了高斯函数的离散近似值,其中中心元素的权重最高,周围元素的权重逐渐降低。高斯滤波器的...

    009矩阵键盘3x3_网红按钮_

    在描述中提到的“网红按钮”,可能是指这种3x3矩阵键盘因其简单易用且具有趣味性,在网络上受到了广泛的关注和喜爱。 1. **矩阵键盘原理**: 矩阵键盘的工作原理基于行列扫描法。通过连接键盘的行线(Row)和列线...

    海量3×3实对称矩阵的快速特征值计算:对于多个3x3实对称矩阵,向量化矩阵运算,支持GPU计算-matlab开发

    计算许多3x3实对称矩阵的特征值。 计算是非迭代的,基于完全矢量化的 matlab 矩阵运算,并且支持 GPU 计算。 它可以快速有效地同时处理多个 3×3 矩阵。 此代码特别适合 3D 中的张量/黎曼微积分、体积张量图像的可视...

Global site tag (gtag.js) - Google Analytics