`

简单物理模拟

 
阅读更多

 

晚上,看完神探夏洛克之后写的。还需要再多研究研究,感觉运行的不是很流畅。毕竟光有物理的概念还是不够的。还需要很多游戏编程与JavaScript方面的知识。

还有我终于知道C++有什么用了。

1.以下代码取出了能量不守恒的bug。之前的bug出现在碰撞处理中。

2.计算方法:精度最差的单步欧拉法。

 

<html>
<head>
<script type="text/javascript">
	//主方法
	window.onload=function(){
		var cxt=$("canvas").getContext("2d");
		
		//初始化时间控制器
		var timer=new Timer();
		
		//初始化世界控制器
		var world=new World(1000,700,100,70,25);
		
		//创建一个粒子
		var p1=new Particle(1,10,60,20,0);
		var p2=new Particle(1,50,20,-6,5);
		var p3=new Particle(1,50,30,4,-7);
		var p4=new Particle(1,50,40,-8,-15);
		
		//在世界中加入粒子
		world.addParticle(p1);
		//world.addParticle(p2);
		//world.addParticle(p3);
		//world.addParticle(p4);
		
		//事件绑定
		$("startbutton").onclick=function(){
			var cdt=world.cdt;
			timer.start(step,cdt);
		}
		$("endbutton").onclick=function(){
			timer.end();
		}
		
		function step(){
			world.run();
			world.view(cxt);		
		}
		
	}
	
	//世界类
	function World(canvas_width,canvas_height,world_width,world_height,fps){
		var AllP=new Array();  //粒子容器
		var cw=canvas_width;
		var ch=canvas_height;
		var ww=world_width;
		var wh=world_height;
		var cdt=Math.round(1000/fps);//绘图间隔时间;    单位:毫秒
		var dt=cdt/1000;    //运动时间
		var widthRate=cw/ww;
		var heightRate=ch/wh;
		var g=10;	//重力加速度
		this.addParticle=function(p){
			AllP.push(p);
		}

		this.run=function(){
			for(var i=0;i<AllP.length;i++){
				
				if(AllP[i].r.x<=0 || AllP[i].r.x>=ww){//撞击竖直壁
					AllP[i].r.x-=AllP[i].v.x*dt;//x速度反向。y方向继续
					AllP[i].v.x=-AllP[i].v.x;
					AllP[i].r.y+=AllP[i].v.y*dt;
					continue;
				}
				if( AllP[i].r.y<=0 ||AllP[i].r.y>=wh){//撞击水平壁
					AllP[i].r.y-=AllP[i].v.y*dt;//y速度反向。x方向继续
					AllP[i].v.y=-AllP[i].v.y;
					AllP[i].r.x+=AllP[i].v.x*dt;
					continue;
				}
				AllP[i].v.y+=g*dt;
				AllP[i].r.x+=AllP[i].v.x*dt;
				AllP[i].r.y+=AllP[i].v.y*dt;
			}
		}
		
		this.view=function(context){
			context.clearRect(0,0,cw,ch);
			for(var i=0;i<AllP.length;i++){
				var x=widthRate*AllP[i].r.x;
				var y=heightRate*AllP[i].r.y;
				context.beginPath();
				context.arc(x,y,2,0,Math.PI*2,true);
				context.fill();
			}
		}
		
	}
	
	
	//粒子类
	function Particle(m,x,y,vx,vy){
			this.m=m;
			this.r=new Vector2D(x,y);
			this.v=new Vector2D(vx,vy);
	}
	
	
	//定时器类
	function Timer(){
		var timer=null;
		this.start=function(fn,time){
			if(timer==null){
				timer=setInterval(fn,time);
			}
		}
		this.end=function(){
			clearInterval(timer);
		}
	}
	
	//2维向量类
	function Vector2D(x,y){
		this.x=x;
		this.y=y;
	}
	
	
	//================函数======================
	
	//id选择器
	function $(id){
		return document.getElementById(id);
	}
	
	//[a,b)之间的随机数
	function random(a,b){
		return Math.random()*(b-a)+a;
	}
	
</script>
</head>
<body>
<canvas id="canvas" width="1000" height="700" style="border:2px solid red"></canvas><br>
<input type="text" id="intext" value="1"><br>
<input type="button" id="startbutton" value="开始">
<input type="button" id="endbutton" value="结束">
<input type="text" id="t">
</body>
</html>

 

 

 

 

分享到:
评论

相关推荐

    使用Bullet的简单物理模拟

    《使用Bullet进行简单物理模拟》 在游戏开发和模拟领域,物理引擎扮演着至关重要的角色,它们赋予虚拟世界以真实感。Bullet物理引擎就是这样一款强大的开源实时物理模拟库,广泛应用于DirectX等图形API中。本文将...

    物理模拟小资料

    【物理模拟小资料】是一个关于物理模拟的学习资源集合,涵盖了多个不同的模拟项目和工具,适合对物理引擎感兴趣的初学者和开发者。这个压缩包包含了多种类型的文件,如HTML文档、PDF教程、文本文件以及两个不同版本...

    几个简单物理现象在Mathlab中的模拟

    1. **抛物线模拟**:在MATLAB中,我们可以创建一个简单的函数`po`来模拟抛物线运动。这个函数首先定义了初始速度和重力加速度,然后通过循环迭代计算每个时间步长的位置,并更新坐标。`plot`函数用于绘制轨迹,`...

    VB物理模拟小球运动

    【VB物理模拟小球运动】是一个基于Visual Basic(VB)编程环境开发的程序,它能够实现对小球在各种物理条件下的运动进行仿真。通过这个程序,用户可以使用鼠标进行交互,控制小球的初始位置和速度,观察其在重力、...

    一个简单的物理模拟冥想放松实验。_CoffeeScript_CS.zip

    标题中的“一个简单的物理模拟冥想放松实验”表明这是一个结合了物理模拟和冥想放松的项目,而“CoffeeScript_CS.zip”则暗示该项目是用CoffeeScript编程语言编写的,并且可能与JavaScript有关,因为CoffeeScript是...

    基于现代OpenGL的简单物理运动模拟

    根据Nehe第39节教程,使用Opengl核心模式下编程实现匀速,平抛,以及弹簧质点运动。代码根据learnopengl的文件配置方式配置,按着来就好了

    COMSOL多物理场模拟软件简单入门教程PPT课件.pptx

    "COMSOL 多物理场模拟软件简单入门教程" COMSOL 是一个功能强大的多物理场模拟软件,适用于各个领域的模拟和分析。本教程旨在为读者提供 COMSOL 的基本概念和使用方法,帮助读者快速入门和掌握 COMSOL 的使用。 一...

    Physical-Sandbox:此仓库包含简单的物理模拟

    《物理沙盒——深入探索简单物理模拟的奥秘》 在计算机科学领域,尤其是游戏开发、动画制作以及教育软件设计中,物理模拟是一项至关重要的技术。"Physical-Sandbox"项目,正如其名,是一个用于实验和学习物理模拟的...

    模拟物理运动

    java写的一个模拟物理运动小球,有反弹的效果

    OpenGL教程第39课物理模拟.rar

    OpenGL教程第39课主要讲解了如何在图形编程中实现物理模拟,这是一项重要的技能,因为物理模拟可以为游戏和交互式应用带来更真实的视觉效果和用户体验。在本教程中,我们将深入探讨以下几个关键知识点: 1. **...

    软件工程中的物理模拟与仿真.pptx

    ### 软件工程中的物理模拟与仿真 #### 第1章 软件工程与物理模拟 ##### 软件工程概述 软件工程是一门综合性的学科,它结合了计算机科学、项目管理以及数学等多个领域的知识和技术,旨在解决大规模软件系统的开发、...

    Java简单物理引擎.pdf

    Java简单物理引擎是一款基于Java语言开发的物理引擎,旨在提供简单易用的物理模拟解决方案。该引擎原本是基于FLASH版本的,后来被移植到Java和C++版本,但是Java版本和C++版本存在一定的差异。 APE(Actionscript ...

    matlab开发-简单物理基础模拟冷藏版本1a

    在本项目"matlab开发-简单物理基础模拟冷藏版本1a"中,主要涉及的是使用MATLAB编程语言来实现一个基础的物理模拟,具体为自由落体运动的模拟。MATLAB是一款强大的数值计算和数据可视化软件,常用于科学研究、工程...

    NEHE 39课 物理模拟——glut框架实现

    【NEHE 39课:物理模拟——glut框架实现】是NeHe教程系列中的一课,主要讲解如何在OpenGL编程环境中使用glut框架来创建一个基础的物理模拟系统。这个教程面向的是初学者,旨在帮助那些正在学习图形编程和物理模拟的...

    Curvilinear and Rectilinear Motions:曲线和直线运动的简单物理模拟-开源

    该项目的作用是使用易于使用的用户界面来模拟简单的曲线和直线运动。 该程序可以用于教育目的,也可以用于任何其他人想要的目的。 可执行文件是.jar文件,这意味着它可以在任何支持Java的操作系统中运行。 在上方,...

    Cellular_Automata_Modeling_of_Physical_Systems 物理系统的元胞自动机模拟

    ### 物理系统的元胞自动机模拟 #### 元胞自动机的概念与基本原理 元胞自动机(Cellular Automata, CA)是一种数学模型,主要用于模拟复杂系统的行为,特别是那些可以通过局部规则来描述全局行为的系统。在物理学...

    h5_canvas2D简单物理引擎和简单开发.zip

    4. **时间步长**:通过控制每一帧的时间间隔,确保物理模拟的稳定性。 5. **动量守恒**:在碰撞过程中保持总动量不变,以确保物理行为的真实感。 在"earth"这个子文件中,可能是实现了一个与地球相关的游戏或动画,...

    简单的乒乓球游戏源代码

    通过阅读和分析这些文件,开发者不仅可以学习到VB6的基础知识,还能了解到游戏开发的基本流程和技巧,包括图形绘制、事件处理和简单物理模拟。同时,这也为进阶学习更复杂的游戏引擎和3D游戏开发打下了基础。

    newton:用Dart编写的简单物理库

    Dart的简单物理模拟。 弹簧,摩擦,重力等" "牛顿"这个库以著名的物理学家艾萨克·牛顿的名字命名,旨在提供一个易于理解和使用的物理模拟框架。库中的核心概念是基于牛顿运动定律,它允许开发者创建出具有真实感的...

    e语言-易语言OpenGL教程第39课物理模拟

    在本教程中,我们将深入探讨如何使用易语言和OpenGL库来实现物理模拟。易语言,又称E语言,是一种中国本土开发的、以简单易学为特点的编程语言,旨在降低编程入门难度。OpenGL则是一个跨语言、跨平台的图形库,广泛...

Global site tag (gtag.js) - Google Analytics