`

矩阵碰撞算法

    博客分类:
  • JAVA
阅读更多
package org.ernest.matrixText;

import java.util.Arrays;

public class MatrixHit {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		double [] a1={0,1,2,3,4,5,6,7,8};
		double [] a2={0,1,2,3,4,5,6,7,8};

		//rc(a1,a2,a1.length-1);
		matrixRc(a1,a2);
		System.out.println(Arrays.toString(a1));
		System.out.println(Arrays.toString(a2));
	}
	/**
	 * 方正碰撞算法(等行等列)适用于元素全为正整数
	 * @param a
	 * @param b
	 */
	public static void matrixRc(double[] a,double [] b){
		int numRows=(int) Math.sqrt(a.length);
		int numColumns=numRows;
		double [][] aM=new double[numRows][numColumns];
		double [][] bM=new double[numRows][numColumns];
		
		for(int i=0;i<numRows;i++){
			double [] aR=getRowVector(a,i);
			double [] bR=getRowVector(b,i);
			rc(aR,bR);
			aM[i]=aR;
			bM[i]=bR;
		}
		
		for(int i=0;i<numRows;i++){
			for(int j=0;j<numColumns;j++){
				a[j+i*numColumns]=aM[i][j];
				b[j+i*numColumns]=bM[i][j];
			}
		}
	}
	/**
	 * 按行列坐标得元素值算法
	 * @param elements
	 * @param nRow
	 * @param nCol
	 * @return
	 */
	public static double getElement(double[] elements,int nRow,int nCol){
		int numColumns=(int) Math.sqrt(elements.length);
		return elements[nCol+nRow*numColumns];
	}
	/**
	 * 得行向量算法
	 * @param elements
	 * @param nRow
	 * @return
	 */
	public static double[] getRowVector(double[] elements,int nRow){
		int numColumns=(int) Math.sqrt(elements.length);
		double[] pVector=new double[numColumns];
		for(int j=0;j<numColumns;++j){
			pVector[j]=getElement(elements,nRow,j);
		}
		return pVector;
	}
	/**
	 * 单行向量碰撞算法(递归算法)
	 */
	public static void rc(double[] a,double[] b,int n){
		if(n<0)return;
		
		double[] s=new double[b.length];
		for(int i=0;i<b.length;i++){
			if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];}
		}
		if(a[n]>s[s.length-1]){
			a[n]-=s[s.length-1];
			Arrays.fill(b,0.0);
			return;
		}else{
			int p=0;
			for(int i=0;i<s.length;i++){
				if(a[n]<=s[i]){p=i;break;}
			}
			Arrays.fill(b, 0,(p-1)<0?0:p,0.0);
			b[p]=s[p]-a[n];
			a[n]=0.0;
			rc(a,b,n-1);
		}	
	}
	/**
	 * 单行向量碰撞算法(循环算法)
	 * @param a
	 * @param b
	 */
	public static void rc(double[] a,double[] b){
		for(int n=a.length-1;n>=0;n--){
			double[] s=new double[b.length];
			for(int i=0;i<b.length;i++){
				if(0==i){s[i]=b[i];}else{s[i]=s[i-1]+b[i];}
			}
			if(a[n]>s[s.length-1]){
				a[n]-=s[s.length-1];
				Arrays.fill(b,0.0);
				return;
			}else{
				int p=0;
				for(int i=0;i<s.length;i++){
					if(a[n]<=s[i]){p=i;break;}
				}
				Arrays.fill(b, 0,(p-1)<0?0:p,0.0);
				b[p]=s[p]-a[n];
				a[n]=0.0;
			}
		}
	}
}

 

2
0
分享到:
评论

相关推荐

    小球碰撞反弹经典算法

    在IT领域,尤其是在游戏开发与动画效果实现中,小球碰撞反弹算法是一个常见的技术要点,尤其是在J2ME(Java 2 Micro Edition)平台上的应用。本文将深入解析“小球碰撞反弹经典算法”这一主题,从算法的设计思路、...

    2D多边形碰撞算法及示例

    在计算机图形学中,2D多边形碰撞算法是一种核心技术,广泛应用于游戏开发、物理模拟、几何计算等领域。本文将深入探讨这一主题,并通过代码示例和OpenGL演示来阐述其工作原理和实现方法。 首先,我们要理解碰撞检测...

    《实时碰撞检测算法技术》

    在数学和几何学入门部分,作者介绍了矩阵、坐标系统、向量、质心坐标、直线与平面等基本概念,这些基础知识对于理解后续的碰撞检测算法至关重要。例如,向量不仅是描述位置和方向的基础工具,也是进行几何计算的基本...

    矩阵相乘的快速算法.doc

    在计算机科学和图形学中,矩阵相乘的快速算法是一个重要的优化技巧,特别是在处理大量数据时,例如在3D渲染和物理模拟中。传统的矩阵乘法算法时间复杂度为O(n^3),对于大型矩阵来说效率低下。快速算法如Strassen算法...

    稀疏矩阵-Hash算法

    稀疏矩阵和Hash算法在IT领域中扮演着重要的角色,特别是在大数据处理和机器学习应用中。本文将深入探讨这两种技术,以及它们如何结合在个性化推荐系统中解决高稀疏性问题。 稀疏矩阵是一种用于存储大量零元素的矩阵...

    3D数学碰撞库,球,obb,胶囊体等碰撞

    - 各种几何体的变换(旋转、平移、缩放)和辅助函数,如向量和矩阵操作,用于实现复杂的碰撞检测逻辑。 利用`MathGeoLib-1.5`,开发者可以快速集成这些碰撞检测算法到自己的项目中,而无需从零开始编写底层代码。这...

    《MFC游戏开发》笔记十 碰撞检测 配套源代码

    我们可以通过建立地图的二维数组表示,并使用线性搜索或二分查找等算法快速定位角色的位置及周围环境,从而进行碰撞检测。 此外,为了提高效率,我们可以采用空间划分技术,如AABB(轴对齐包围盒)树或四叉树等数据...

    3d拾取算法(碰撞检测)

    3D拾取算法(碰撞检测) 3D拾取算法是计算机图形学和游戏开发中一个重要的技术,用于实现三维空间中的拾取操作。本章节将详细介绍3D拾取算法的原理和实现方法,包括窗口转换、拾取射线的计算、射线与物体坐标系的...

    matlab开发-fast3碰撞检测gjkalgorithm

    《MATLAB实现Fast3碰撞检测GJK算法详解》 在计算机图形学和物理模拟领域,碰撞检测是一项基础且至关重要的任务。它广泛应用于游戏开发、虚拟现实、机器人控制等多个领域。GJK(Gilbert-Johnson-Keerthi)算法是一种...

    碰撞检测算法

    2. 刚体碰撞检测:刚体是指在碰撞过程中保持形状不变的物体,可以通过计算物体的质心、半径和旋转矩阵来进行检测。 3. 复杂形状的碰撞检测:对于非规则形状,如多边形或细分表面,可以使用BVH(Bounding Volume ...

    用C编写的碰撞检测程序

    下面将详细阐述碰撞检测的基本概念、算法以及C语言实现的相关知识点。 1. **基本概念**:碰撞检测分为简单的二维检测和复杂的三维检测。在二维空间中,我们通常考虑的是矩形、圆形等简单形状;而在三维空间中,可能...

    计算机图形学算法与实现.docx

    碰撞检测算法可以根据不同的场景和需求分为不同的类型,如离散时间碰撞检测算法和连续时间碰撞检测算法。 这些算法都是计算机图形学中非常重要的基础算法,它们对生成高质量的图形和动画至关重要。掌握这些算法对于...

    6轴工业机械臂运动学算法(C++).zip_6轴算法 c++_dotxir_warmuts_六轴机械臂_机械臂

    在实际应用中,可能还会涉及到碰撞检测、轨迹规划、动力学模型等相关知识。 总的来说,理解和实现六轴机械臂的运动学算法是复杂而富有挑战性的,它需要扎实的数学基础,尤其是线性代数和微分方程的知识。C++作为一...

    算法笔记.胡凡(完整版)

    10.1 平面几何:直线、圆、多边形等几何对象的计算,以及碰撞检测、最近点对查找等问题。 11. 计算机科学基础:包括递归、复杂性理论、图灵机模型等,这些都是理解算法和计算机工作原理的基础。 以上内容只是...

    TDMA.rar_TDMA算法_tdma_三对角矩阵

    对于三对角矩阵的处理,TDMA算法可能利用了迭代方法,如高斯消元法或者Gauss-Seidel法。在这些方法中,主对角线不为零是一个关键条件,因为这保证了矩阵的可逆性,即可以找到矩阵的唯一解。如果主对角线元素为零,...

    空间中三角形碰撞检测TTI——ESTTI.zip

    在计算机图形学中,碰撞检测...总的来说,"ESTTI"算法提供了一种高效且精确的方法来检测三维空间中两个三角形的碰撞。通过理解这个算法,开发者可以在游戏引擎、物理模拟和其他需要精确碰撞检测的场景中应用这一技术。

    多个物体碰撞运动演示游戏java语言

    在程序中,我们需要实现碰撞检测算法来识别何时两个小球相碰。这通常涉及到计算每个小球的位置、速度和半径,然后检查它们之间的距离是否小于两倍的半径之和。如果是,那么就发生了碰撞,接下来需要进行碰撞响应处理...

Global site tag (gtag.js) - Google Analytics