将c++代码移植到Java
Porting C++ code to Java
我在c++中有以下方法:
void sphereCollisionResponse(Sphere *a, Sphere *b)
{
Vector3 U1x,U1y,U2x,U2y,V1x,V1y,V2x,V2y;
float m1, m2, x1, x2;
Vector3 v1temp, v1, v2, v1x, v2x, v1y, v2y, x(a->pos - b->pos);
x.normalize();
v1 = a->vel;
x1 = x.dot(v1);
v1x = x * x1;
v1y = v1 - v1x;
m1 = a->mass;
x = x*-1;
v2 = b->vel;
x2 = x.dot(v2);
v2x = x * x2;
v2y = v2 - v2x;
m2 = b->mass;
a->vel = Vector3( v1x*(m1-m2)/(m1+m2) + v2x*(2*m2)/(m1+m2) + v1y );
}
是关于球体物体的碰撞响应。我想把它移植到Java,所以我使用Vector2D类从这里:http://goo.gl/I4R4Y,并把这段代码在Java:
private void sphereCollisionResponse(Sphere a, Sphere b) {
double m1, m2, x1, x2;
Vector2D v1, v2, v1x, v2x, v1y, v2y;
Vector2D x = new Vector2D(a.getPos().subtract(b.getPos()));
x.normalize();
v1 = a.getVelocity();
x1 = x.dot(v1);
v1x = x.multiply(x1);
v1y = v1.subtract(v1x);
m1 = a.getMass();
x = x.multiply(-1);
v2 = b.getVelocity();
x2 = x.dot(v2);
v2x = x.multiply(x2);
v2y = v2.subtract(v2x);
m2 = b.getMass();
Vector2D av = ((v1x.multiply(m1-m2)).divide(m1+m2).add((v2x.multiply(2*m2)).divide(m1+m2))).add(v1y);
a.setVelocity(av);
}
但事实证明,当球体碰撞时,我改变速度的球体,从屏幕上消失了。所以我在移植代码时可能会遇到麻烦。谁可以在这两种语言更有经验检查移植代码,并告诉我,如果有什么问题?
谢谢
我对java不是很好,但是你引用的代码似乎还可以,以我对java的基本知识来判断。
问题可能出在最后一个赋值:
Vector2D av = ((v1x.multiply(m1-m2)).divide(m1+m2).add((v2x.multiply(2*m2)).divide(m1+m2))).add(v1y);
也许得到的速度矢量av太大了?这也许可以解释为什么球体从屏幕上消失了。您可以调试它并检查av的值,或者打印到某个地方吗?
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?