gpt4 book ai didi

java - 二维质量守恒

转载 作者:行者123 更新时间:2023-12-02 10:18:16 24 4
gpt4 key购买 nike

我有一个程序,其中球在屏幕上弹跳。我希望球能够相互弹开。

所以,我有这个 boolean intersects(ball b2) {. . .}方法,它检查 b.是否与 b2 相交。如果 b.intersects(x) 返回 true,则 calcDX()calcDY()被调用。

void calcDX(Ball b2) {
double b1Momentum = mass * dx;
double b2Momentum = b2.mass * b2.dx;

double b2FinalVelocity = (b1Momentum + b2Momentum + mass * (dx + b2.dx)) / (mass + b2.mass);

dx = b2FinalVelocity - dx - b2.dx;
b2.dx = b2FinalVelocity; //hi
}

void calcDY(Ball b2) {
double b1Momentum = mass * dy;
double b2Momentum = b2.mass * b2.dy;

double b2FinalVelocity = (b1Momentum + b2Momentum + mass * (dy + b2.dy)) / (mass + b2.mass);

dy = b2FinalVelocity - dy - b2.dy;
b2.dy = b2FinalVelocity;
}

这就是我正在使用的弹性碰撞方程,其中 dxdyx 的变化以及 y 的变化.

所以我有这个循环(我知道, while(true) ,忽略它。)每秒更新 60 次,调用 updateBallPositions()每次

@Override
public void run() {
int ticksPerSecond = 60;
long lastTime = System.nanoTime();
double nanoSecondsPerTick = 1000000000.0 / ticksPerSecond; // How many nano-seconds in a tick
double delta = 0.0;

while (true) { // main game loop
long now = System.nanoTime();
delta += (now - lastTime) / nanoSecondsPerTick;
lastTime = now;

while (delta >= 1) { // tick
delta -= 1;

updateBallPositions();
f.panel.repaint();
}
}
}

private void updateBallPositions() {
for (Ball b : balls) {
b.x += b.dx;
b.y += b.dy;

for (Ball b2 : balls) {
if(b != b2 & b.intersects(b2)) {
b.calcDX(b2);
b.calcDY(b2);
}
}

if(b.isTouchingHorizontalWall(f))
b.dy *= -1;
if(b.isTouchingVerticalWall(f))
b.dx *= -1;
}
}

这一切都很棒,但行不通。球经常粘在一起并永远碰撞,而它应该让球顺利弹跳。 (如果您需要更多代码,请说出来)

最佳答案

你的碰撞处理看起来不对。

设球A具有质量ma,速度 vector VA0
设球B具有质量mb,速度 vector VB0
它们在 C 点发生碰撞
为了计算碰撞后的速度,我们必须使用能量守恒定律和动量守恒定律

考虑临时轴:
T - 通过点 C 与两个球相切,并通过连 catch 中心的径向 R

enter image description here

速度在 T 上的投影是切向 vector (例如,VAt),在轴 R 上的投影是径向 vector (例如,VAr)

重要 - 碰撞期间切向动量不会改变:VAt1=VAt, VBt1=VBt

所以我们在T-R坐标系中有方程

 ma * VAr + mb * VBr = ma * VAr1 + mb * VAr2
ma * VA0^2 + mb*VB0^2 = ma * VA1^2 + mb*VB1^2 // I removed division by two
but
VA1^2 = VAr1^2 + VAt^2
VB1^2 = VBr1^2 + VBt^2

最后是具有两个未知数的两个方程组VAr1, VBr1

 ma * VAr + mb * VBr = ma * VAr1 + mb * VAr2
ma * VA0^2 + mb*VB0^2 = ma * (VAr1^2 + VAt^2) + mb*(VBr1^2 + VBt^2)

求解,将速度分量变换到世界坐标系OXY

关于java - 二维质量守恒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54527226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com