热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#XNA中实现自定义3x3矩阵类:MMatrix33

本文介绍了如何在C#和XNA框架中实现一个自定义的3x3矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了AS3Starling和其他相关资源,以确保算法的准确性和高效性。
为了更好地理解和应用 3x3 矩阵的运算,本文详细描述了 MMatrix33 类的实现过程。通过借鉴 AS3 Starling 和网络上的相关资源,我们实现了多种矩阵操作,如缩放、位移、旋转和扭曲等。

最终目标是通过深入研究矩阵运算,进一步探索 Cocos2d-xna(WP7)版源码,并最终构建一个轻量级的 2D 渲染框架。

以下是 MMatrix33 类的完整代码实现:

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace Base.MyMath
{
///
/// 3x3 矩阵类
/// Author: Jave.Lin
/// Date: 2013-08-30
///

public struct MMatrix33
{
// 矩阵元素
public float m11, m12, m13;
public float m21, m22, m23;
public float m31, m32, m33;

// 构造函数
public MMatrix33()
{
m11 = m22 = m33 = 1;
m12 = m13 = m21 = m23 = m31 = m32 = 0;
}

// 单位化矩阵
public void Identity()
{
MMatrix33.Identity(ref this);
}

// 旋转矩阵
public void Rotate(float rotation)
{
MMatrix33.Rotate(ref this, rotation);
}

// 根据方向旋转矩阵
public void RotateByV(Vector2 fwd, Vector2 side)
{
MMatrix33.RotateByV(ref this, fwd, side);
}

// 矩阵相乘
public void Multiply(MMatrix33 m)
{
MMatrix33.Multiply(ref this, m);
}

// 位移矩阵
public void Translate(Vector2 v)
{
MMatrix33.Translate(ref this, v);
}

// 缩放矩阵
public void Scale(float s)
{
MMatrix33.Scale(ref this, s);
}

// 根据水平、垂直缩放
public void ScaleXY(float scaleX, float scaleY)
{
MMatrix33.ScaleXY(ref this, scaleX, scaleY);
}

// 根据指定的向量缩放
public void ScaleByV(Vector2 v)
{
MMatrix33.ScaleByV(ref this, v);
}

// 扭曲矩阵
public void Skew(float skewX, float skewY)
{
MMatrix33.Skew(ref this, skewX, skewY);
}

// 复制矩阵
public MMatrix33 Copy()
{
return MMatrix33.Copy(this);
}

// 将所有指定的Vector2向量都应用指定的matrix坐标转换
public static void TransformVector2Arr(MMatrix33 matrix, ref Vector2[] vecArr)
{
for (int i = 0; i {
TransformVector2(matrix, ref vecArr[i]);
}
}

// 将指定的Vector2向量应用指定的matrix坐标转换
public static void TransformVector2(MMatrix33 matrix, ref Vector2 v)
{
v.X = matrix.m11 * v.X + matrix.m21 * v.Y + matrix.m31;
v.Y = matrix.m12 * v.X + matrix.m22 * v.Y + matrix.m32;
}

// 单位化矩阵
public static void Identity(ref MMatrix33 matrix)
{
matrix.m11 = 1; matrix.m12 = 0; matrix.m13 = 0;
matrix.m21 = 0; matrix.m22 = 1; matrix.m23 = 0;
matrix.m31 = 0; matrix.m32 = 0; matrix.m33 = 1;
}

// 旋转矩阵
public static void Rotate(ref MMatrix33 matrix, float rotation)
{
MMatrix33 m = getM();
float sin = (float)Math.Sin(rotation);
float cos = (float)Math.Cos(rotation);
m.m11 = cos; m.m12 = sin; m.m13 = 0;
m.m21 = -sin; m.m22 = cos; m.m23 = 0;
m.m32 = 0; m.m32 = 0; m.m33 = 1;
MMatrix33.Multiply(ref matrix, m);
MMatrix33.PushM(m);
}

// 根据指定的方向向量旋转矩阵
public static void RotateByV(ref MMatrix33 matrix, Vector2 fwd, Vector2 side)
{
MMatrix33 m = getM();
m.m11 = fwd.X; m.m12 = fwd.Y; m.m13 = 0;
m.m21 = side.X; m.m22 = side.Y; m.m23 = 0;
m.m32 = 0; m.m32 = 0; m.m33 = 1;
MMatrix33.Multiply(ref matrix, m);
MMatrix33.PushM(m);
}

// 矩阵相乘
public static void Multiply(ref MMatrix33 matrix, MMatrix33 m)
{
// 第一行
matrix.m11 = matrix.m11 * m.m11 + matrix.m12 * m.m21 + matrix.m13 * m.m31;
matrix.m12 = matrix.m11 * m.m12 + matrix.m12 * m.m22 + matrix.m13 * m.m32;
matrix.m13 = matrix.m11 * m.m13 + matrix.m12 * m.m23 + matrix.m13 * m.m33;
// 第二行
matrix.m21 = matrix.m21 * m.m11 + matrix.m22 * m.m21 + matrix.m23 * m.m31;
matrix.m22 = matrix.m21 * m.m12 + matrix.m22 * m.m22 + matrix.m23 * m.m32;
matrix.m23 = matrix.m21 * m.m13 + matrix.m22 * m.m23 + matrix.m23 * m.m33;
// 第三行
matrix.m31 = matrix.m31 * m.m11 + matrix.m32 * m.m21 + matrix.m33 * m.m31;
matrix.m32 = matrix.m31 * m.m12 + matrix.m32 * m.m22 + matrix.m33 * m.m32;
matrix.m33 = matrix.m31 * m.m13 + matrix.m32 * m.m23 + matrix.m33 * m.m33;
}

// 矩阵根据指定量的Vector2向量位移
public static void Translate(ref MMatrix33 matrix, Vector2 v)
{
MMatrix33 m = getM();
m.m11 = 1; m.m12 = 0; m.m13 = 0;
m.m21 = 0; m.m22 = 1; m.m23 = 0;
m.m32 = v.X; m.m32 = v.Y; m.m33 = 1;
MMatrix33.Multiply(ref matrix, m);
}

// 缩放矩阵
public static void Scale(ref MMatrix33 matrix, float scale)
{
MMatrix33.ScaleXY(ref matrix, scale, scale);
}

// 根据指定的水平、垂直缩放
public static void ScaleXY(ref MMatrix33 matrix, float scaleX, float scaleY)
{
matrix.m11 *= scaleX; matrix.m12 *= scaleX;
matrix.m21 *= scaleY; matrix.m22 *= scaleY;
}

// 根据指定的向量缩放
public static void ScaleByV(ref MMatrix33 matrix, Vector2 v)
{
MMatrix33.ScaleXY(ref matrix, v.X, v.Y);
}

// 扭曲矩阵
public static void Skew(ref MMatrix33 matrix, float skewX, float skewY)
{
float sinX = (float)Math.Sin(skewX);
float cosX = (float)Math.Cos(skewX);
float sinY = (float)Math.Sin(skewY);
float cosY = (float)Math.Cos(skewY);

matrix.m11 = matrix.m11 * cosY - matrix.m12 * sinX;
matrix.m12 = matrix.m11 * sinY + matrix.m12 * cosX;
matrix.m21 = matrix.m21 * cosY - matrix.m22 * sinX;
matrix.m22 = matrix.m21 * sinY + matrix.m22 * cosX;
matrix.m31 = matrix.m31 * cosY - matrix.m32 * sinX;
matrix.m32 = matrix.m31 * sinY + matrix.m32 * cosX;
}

// 复制对象
public static MMatrix33 Copy(MMatrix33 m)
{
return (MMatrix33)m.MemberwiseClone();
}

// 临时矩阵池
private static Queue mPool = new Queue();

// 获取临时矩阵(出队)
private static MMatrix33 getM()
{
return mPool.Count > 0 ? mPool.Dequeue() : new MMatrix33();
}

// 回收临时矩阵(入队)
private static void PushM(MMatrix33 m)
{
m.Identity();
mPool.Enqueue(m);
}
}
}
```

推荐阅读
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了如何在编程中正确处理包含空数组的 JSON 对象,提供了详细的代码示例和解决方案。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
author-avatar
致力于流浪动物救助量
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有