C++多小球非对心弹性碰撞(HGE引擎)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++多小球非对心弹性碰撞(HGE引擎),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5014字,纯文字阅读大概需要8分钟。
内容图文
程序是一个月前完成的,之前一直没正儿八经的来整理下这个程序,感觉比较简单,不过即使简单的东西也要跟大家分享下。
开篇
上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#pragma once
#include <math.h>
#include "hge.h"
class
CBall
{
public
:
CBall();
CBall(
float
_x,
float
_y,
float
_speedX ,
float
_speedY,
float
_radius ,
DWORD
_color,
float
_density = 1.0f);
~CBall(){};
public
:
bool
IsCollision(CBall *ball,
float
dt);
//碰撞检测
void
CollisionWith(CBall *ball);
//弹性正碰
void
CollisionWith2(CBall *ball);
//弹性斜碰
void
SwapColor(CBall *ball);
//好玩点,加个交换颜色
void
MoveNext(
float
dt,
float
_width,
float
_height);
//由于程序不大,方便起见所有就都public了
public
:
float
x;
//x轴坐标
float
y;
//y轴坐标
float
speed_x;
//x轴方向速度
float
speed_y;
//x轴方向速度
float
radius;
//球体半径
float
density;
//密度
float
weight;
//质量
DWORD
color;
//混合颜色
};
|
1
2
3
4
5
6
7
8
9
10
11
|
bool
CBall::IsCollision(CBall *ball,
float
dt)
{
//计算的是下一刻的位置,以免发生粘连
float
disX = (
this
->x+
this
->speed_x*dt)-(ball->x+ball->speed_x*dt);
float
disY = (
this
->y+
this
->speed_y*dt)-(ball->y+ball->speed_y*dt);
float
dis =
sqrt
(disX*disX+disY*disY);
//判断下一刻是否 发生碰撞
if
(dis <
this
->radius+ball->radius)
return
true
;
return
false
;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
void
CBall::CollisionWith2(CBall *ball)
{
//参考资料:
//球心点
float
x1 =
this
->x ;
float
y1 =
this
->y ;
float
x2 = ball->x ;
float
y2 = ball->y ;
//碰撞处切平面向量t,及其法向量s
hgeVector s(x2-x1, y2-y1);
s.Normalize();
//标准化矢量
hgeVector t(x2-x1, y2-y1);
t.Rotate(3.1415926f/2);
t.Normalize();
//速度向量
hgeVector v1(
this
->speed_x,
this
->speed_y);
hgeVector v2(ball->speed_x,ball->speed_y);
//先算v1(v1x, v1y)在s和t轴的投影值,分别设为v1s和v1t
//再算v2(v2x, v2y)在s和t轴的投影值,分别设为v2s和v2t:
float
v1s = v1.Dot(&s);
float
v1t = v1.Dot(&t);
float
v2s = v2.Dot(&s);
float
v2t = v2.Dot(&t);
//转换后于s向量上的弹性正碰撞。质量不等
//弹性正碰撞公式
//v1‘ = [ (m1-m2)*v1 + 2*m2*v2 ] / (m1+m2)
//v2‘ = [ (m2-m1)*v2 + 2*m1*v1 ] / (m1+m2)
float
m1 =
this
->weight;
float
m2 = ball->weight;
float
temp_v1s = ((m1-m2)*v1s + 2*m2*v2s )/ (m1+m2);
v2s = ((m2-m1)*v2s + 2*m1*v1s )/ (m1+m2);
v1s = temp_v1s;
//首先求出v1t和v2t在t轴的向量v1t‘和v2t‘(将数值变为向量)
//再求出v1s‘和v2s‘在s轴的向量v1s‘和v2s‘(将数值变为向量)
hgeVector v1tVector = t*v1t;
hgeVector v1sVector = s*v1s;
hgeVector v2tVector = t*v2t;
hgeVector v2sVector = s*v2s;
//新速度矢量
hgeVector v1_new = v1tVector+v1sVector;
hgeVector v2_new = v2tVector+v2sVector;
//划分成x,y方向分量速度
this
->speed_x = v1_new.x;
this
->speed_y = v1_new.y;
ball->speed_x = v2_new.x;
ball->speed_y = v2_new.y;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void
CBall::MoveNext(
float
dt,
float
_width,
float
_height)
{
float
moveX = speed_x*dt;
float
moveY = speed_y*dt;
//x方向边界
if
(x+moveX<radius||x+moveX>_width-radius)
speed_x = -speed_x;
//Y方向边界
if
(y+moveY<radius||y+moveY>_height-radius)
speed_y = -speed_y;
x+=speed_x*dt;
y+=speed_y*dt;
}
|
结束语
原文:http://www.cnblogs.com/yinlong1991/p/3710247.html
内容总结
以上是互联网集市为您收集整理的C++多小球非对心弹性碰撞(HGE引擎)全部内容,希望文章能够帮你解决C++多小球非对心弹性碰撞(HGE引擎)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。