加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
APE.cpp 2.52 KB
一键复制 编辑 原始数据 按行查看 历史
SadLava 提交于 2022-05-08 17:08 . first update
//本文件为Arrow-3物理引擎
//本引擎中的Weight(首字母大写) 均指缩放权值
//所有值默认为被缩放过的处理
//整个引擎均为3D运算
//但本引擎只考虑z相同的情况
//一些物理常量
//重力常数
#define G 0.00001//实际值(6.67*0.00000000001)
#define Ff 0.1//恒定摩擦
//返回球体积
inline float getVolume(float r,float Weight=1){
return (r/Weight)*(r/Weight)*(r/Weight)*4/3;
}
//计算物体1对物体2所做的引力 ,建议计算前先检查是否发生撞击
//F=G*M1*M2/(R*R)
inline float getG(float r1,float l1,float r2,float l2,float len,float Weight=1){
return G*getVolume(r1,Weight)*l1*getVolume(r2,Weight)*l2/(len*len);
}
inline float getG(float m1,float m2,float len){
return G*m1*m2/(len*len);
}
inline float getG(float x1,float y1,float r1,float l1,float x2,float y2,float r2,float l2,float Weight=1){
int lenS=abs(x1-x2)/Weight*abs(y1-y2)/Weight;
if(lenS>MAXTN*MAXTN) return 0;//超出表的范围则不考虑
return G*getVolume(r1,Weight)*l1*getVolume(r2,Weight)*l2/((sRoot[lenS]-r1-r2)*(sRoot[lenS]-r1-r2));
}
//计算某个力对物体的加速度
//由F=ma可得a=F/m
inline float v2a(float F,float m){
return F/m;
}
//根据加速度计算速度
//参数a指加速度,v指原速度
//a=(v2-v1)/t,v1=s/t
//此处令t=1则
//a=v2-v1,v1=s
//a=v2-s
//v2=a+s或v2=a+v1
inline float a2v(float a,float v){
return a+v;
}
//单纯地考虑是否相交
//三种返回值
//0未相交
//1相交
//2发生摩擦(很罕见可以不处理)
inline int isIntersect(float x1,float y1,float r1,float x2,float y2,float r2){
float x=x1-x2;
float y=y1-y2;
if(x*x+y*y<r1*r1+(r1*r2)*2+r2*r2){
return 1;
}else if(x*x+y*y==r1*r1+(r1*r2)*2+r2*r2){
return 2;
}else{
return 0;
}
}
//计算弹飞效果
inline void calcIntersect(float& r1,float v1,float& r2,float v2,float& x1,float& y1,float& x2,float& y2){
float r3=(r1+r2)/2;
VECTOR3D vec1,vec2,vec3,Y;
J2DtoS2D(vec1.x,vec1.y,r1,v1);
J2DtoS2D(vec2.x,vec2.y,r2,v2);
Y.y=1;
vec3=vec1+vec2;//求中间向量
J2DtoS2D(vec3.x,vec3.y,vec3*Y+PI/2,1);//求中间向量的法向量
J2DtoS2D(x1,y1,vec3*Y-vec1*vec3,abs(v1)+abs(v2));
J2DtoS2D(x2,y2,vec3*Y-vec2*vec3,abs(v1)+abs(v2));
}
//刚体物体类
class APEItem{
public:
//基础量
float r;//半径
float x,y;//位置
float l;//密度
float v;//速度
float dx,dy;//惯性所导致的目标运动方向
float u;//表面粗糙程度
//可计算的量
float m;//质量
float Volume;//体积
float a;//加速度
float Weight;
APEItem(){
r=1;
x=y=v=0;
l=1;
dx=0;
dy=0;
u=0;
}
//初始化个别物理量
void calc(){
Volume=getVolume(r,Weight);
m=Volume*l;
}
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化