CodeForge QQ客服 CodeForge 400电话 客服电话 4006316121
首页 » 源代码 » 模拟重力和碰撞 C#

模拟重力和碰撞 C#

maninwest
发布于2015-02-13 17:38:17
源码作者
浏览次数:
下载次数:1
下载所需积分:1 
源码分类 Tags:
源码分类 所属分类:
.NET.NET C SharpC#

分享有礼! 》

  • 请点击右侧的分享按钮,把本代码分享到各社交媒体。
  • 通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
  • 通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。

代码介绍

翻译 maninwest@Codeforge 作者:Suhib N. Rawshdeh@CodeProject
模拟物体在重力和碰撞环境中的运动,需要对计时器和线程管理有良好的理解。
在这里,将展示如何使用计时器和基本运动和碰撞方程模拟物体的运动。我们将使用 3 个球和重力环境构建模型。你将会看到这些球如何相互碰撞。你甚至可以通过更新运动变量控制球的运动。
球在重力和碰撞系统中运动,球的位置会每20ms 使用计时器更新一次,计时器也会截取位置的快照。
背景
首先了解重力和碰撞方程。
原理分析:
重力和碰撞方程:
位置方程:
X = Xi + Vx * tx
Xi: 物体的初始位置
Vx: 忽略摩擦力和空气阻力,则是个常数速度。我在模拟中假设空气是固定阻力,必须定期处理,所以我将运动分为两个期间并计算每个期间的新位置
tx: 时间.
运动方程:
Y = Y0 + Vy * ty – 0.5 * g * t^2
g: 重力加速度
方程的速率:
Vy = Vy0 – g*t
Vy: 最终的Y 速度.
Vy0: 初始Y 速度.
g: 重力加速度.
Vx = 0.99*Vx0
Vx0:旧的 X 速度
Vx: 加上空气阻力后的新的 X 速度
0.99: 表示空气阻力的 定比。
碰撞和保存的动量:
碰撞: 两个或以上物体 在非常短的时间内以很大的力相互影响,两个物体甚至不必接触。
+ Notes:
  • 两个物体运动方向相反
  • 两个物体运动方向相同
  • 一个运动一个静止
  • 碰撞时间内两个物体的力可以用下图表示:

Collision power


如果两个物体碰撞,他们的动量总和在碰撞前等于碰撞后。
原理:
V1×m1 + V2×m2 = V1`×m1 + V2`×m2


Assuming same mass:
V1 + V2 = V1` + V2`

Collision


以下代码会在代码上下文中对方程进行解释
使用代码

首先,需要定义每个球的运动变量
///////////////////////////////////////// ball /////////////////////////////////////
// xspeed: The X axis speed of the ball –                                         //
//           it will be calculated based on the mouse movement speed.             //
// yspeed: The Y axis speed of the ball –                                         //
//           it will be calculated based on the mouse movement speed.             //
// newyspeed: The updated Y acis speed of the ball                                //
//              after applying Newton and collision equations.                    //
// startingypos: The initial Y position of the ball –                             //
//               when stop dragging the ball.                                     //
// newxpos: The updated X position of the ball                                    //
// newypos: The updated Y position of the ball                                    //
// oldxpos: The previous X position of the ball                                   //
// oldypos: The previous Y position of the ball                                   //
// newx: The new X position of the mouse after dragging                           //
// oldx: The old X position of the mouse after dragging                           //
// newy: The new Y position of the mouse after dragging                           //
// oldy: The old Y position of the mouse after dragging                           //    
// acc: The acceleration = 10                                                     //
// t: The time                                                                    //
// xmouse: The X axis of the mouse pointer position                               //    
// ymouse: The Y axis of the mouse pointer position                               //
// dragging: Boolian variable to check whether the ball is being dragged or not.  //
// trace: Boolian variable to check if the trace option is on or off.             //
// collisiony: Boolian variable to check if the ball hits the ground or not.      //
////////////////////////////////////////////////////////////////////////////////////

// ball 1 variables
double xspeed,yspeed,newyspeed,startingypos;
double newxpos,newypos,oldxpos,oldypos;
double newx,oldx,newy,oldy;
double acc,t;
const int ground = 500;
int xmouse,ymouse;
bool dragging=true,trace,collisiony;

int choice = 1;
int numberofballs = 1;

Ballinstance b1 = new Ballinstance();

下一步,我们将跟踪球的运动并在计时器中每隔 20ms检查一次碰撞,并相应地更新球的位置。
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    b1.play(ref xspeed,ref yspeed,
            ref newyspeed,ref startingypos,
            ref newxpos,ref newypos,ref oldxpos,ref oldypos,
            ref newx,ref oldx,ref newy,ref oldy,
            ref acc,ref t,
            ref xmouse,ref ymouse,
            ref dragging,ref trace,ref collisiony);
    ball.Left = (int)newxpos;
    ball.Top = (int)(ground - newypos);

    Collision();
}

以下是 Ballinstance类和 play 函数。 这个函数会每隔 20 ms 被访问一次,然后调用球的状态:
拖拉状态:
如果调用 play函数的球是在拖拉模式,球的位置会根据鼠标指针的位置更新,会通过球位置在两次调用 play 函数之间的变化计算球的初始速度(20ms 内)。
运动状态:
如果调用 play 函数的球不是在拖拉模式下,则会根据牛顿定理和抛物线运动方程以及碰撞保存的动量来更新球的位置。
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    b1.play(ref xspeed,ref yspeed,
            ref newyspeed,ref startingypos,
            ref newxpos,ref newypos,ref oldxpos,ref oldypos,
            ref newx,ref oldx,ref newy,ref oldy,
            ref acc,ref t,
            ref xmouse,ref ymouse,
            ref dragging,ref trace,ref collisiony);
    ball.Left = (int)newxpos;
    ball.Top = (int)(ground - newypos);

    Collision();
}

总结
项目还未完成。我想创建一些障碍来看看球如何碰撞。你也可对代码进行改进。
Sponsored links

源码文件列表

温馨提示: 点击源码文件名可预览文件内容哦 ^_^
...
名称 大小 修改日期
Gravity96.00 kB2007-12-25 13:05
程序员商城

资源评论

(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
zsalimizadeh
2016-01-23

i will change some things

f781976192
2016-09-27

为什么看不到代码

  • 1
  • 第1页
  • 共1页

模拟重力和碰撞 C# (13.03 kB)(15.66 kB)

需要 1 积分
您持有 积分

CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了 了解更多

您的积分不足,优惠套餐快速获取 30 积分

订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。

更多付款方式:网银PayPal

上传代码,免费获取CodeForge积分

您本次下载所消耗的积分将转交上传作者。

同一源码,30天内重复下载,只扣除一次积分。

登录 CodeForge

还没有CodeForge账号? 立即注册
关注微博
联系客服

Switch to the English version?

Yes
CodeForge 英文版
No
CodeForge 中文版

完善个人资料,获价值¥30元积分奖励!

^_^"呃 ...

Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧
好的