Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算速度(粒子运动)与直线之间的角度_Javascript_Vector_Angle - Fatal编程技术网

Javascript 计算速度(粒子运动)与直线之间的角度

Javascript 计算速度(粒子运动)与直线之间的角度,javascript,vector,angle,Javascript,Vector,Angle,因此,我创建了一个弹跳球的模拟,用户可以通过从一个点拖动到另一个点,在画布上放置球可以碰撞的线。基本上可以创建四行: 因此,存储线的对象定义如下: export interface pathSection { xfrom: number; yfrom: number; xto: number; yto: number; length: number; } 例如,图像中的第一行和第三行从中给出的值不同 Math.atan2(yto - yfrom, xt

因此,我创建了一个弹跳球的模拟,用户可以通过从一个点拖动到另一个点,在画布上放置球可以碰撞的线。基本上可以创建四行:

因此,存储线的对象定义如下:

export interface pathSection {
    xfrom: number;
    yfrom: number;
    xto: number;
    yto: number;
    length: number;
}
例如,图像中的第一行和第三行从中给出的值不同

Math.atan2(yto - yfrom, xto - from);
因此,考虑到曲面的(相对)复杂性,我需要找到碰撞点处移动对象和曲面之间的角度:

var spd = Math.sqrt(this.particle.v.x * this.particle.v.x + this.particle.v.y * this.particle.v.y);
var restitution = this.elasticity / 100;

this.particle.v.x = restitution * spd * Math.cos(angleBetween);
this.particle.v.y = restitution * spd * Math.sin(angleBetween);

球以a角撞击表面,这就是我想要的

然而,我很难找到两个向量之间的角度。这就是我所理解的工作原理:

var dx = this.path[index_for_path_section].xfrom - this.path[index_for_path_section].xto;
var dy = this.path[index_for_path_section].yfrom - this.path[index_for_path_section].yto;
var posX = this.particle.pos.x;
var posY = this.particle.pos.y;
var posNextX = posX + this.particle.v.x;
var posNextY = posY + this.particle.v.y;

var angleOfRamp = Math.atan2(dy, dx);
var angleOfvelocity = Math.atan2(posNextY - posY, posNextX - posX);
var angleBetween =  angleOfRamp - angleOfvelocity;
然后,这将用于计算碰撞后对象的速度:

var spd = Math.sqrt(this.particle.v.x * this.particle.v.x + this.particle.v.y * this.particle.v.y);
var restitution = this.elasticity / 100;

this.particle.v.x = restitution * spd * Math.cos(angleBetween);
this.particle.v.y = restitution * spd * Math.sin(angleBetween);
然而,计算的角度约为-4.5π,直接向下的物体约为-90度,表面看起来约为45-60度

红色箭头显示对象在曲面中移动的路径-白点显示在曲面和对象之间检测到碰撞的位置

任何关于如何在两个速度和直线之间获得正确和可用角度的帮助都将不胜感激


注意:我已经尝试过,但一直在努力使其适应我自己的工作。

所以我花了一些时间,我还不能100%确定它为什么能工作,因为我觉得JavaScript angles系统有点棘手,但是:

var dx = this.path[collided].xfrom - this.path[collided].xto;
var dy = this.path[collided].yfrom - this.path[collided].yto;
var spd = Math.sqrt(this.particle.v.x * this.particle.v.x + this.particle.v.y * this.particle.v.y);
                 
var angleOfRamp = Math.atan2(dy, dx);
var angleOfvelocity = Math.atan2(this.particle.v.y, this.particle.v.x);
var angleBetween =  angleOfRamp * 2 - angleOfvelocity; // not sure why :)

if (angleBetween < 0) { angleBetween += 2*Math.PI; } // not sure why :)
                 
const restitution = this.elasticity / 100;

this.particle.v.x = restitution * spd * Math.cos(angleBetween);
this.particle.v.y = restitution * spd * Math.sin(angleBetween);
var dx=this.path[collized].xfrom-this.path[collized].xto;
var dy=this.path[collized].yfrom-this.path[collized].yto;
var spd=Math.sqrt(this.particle.v.x*this.particle.v.x+this.particle.v.y*this.particle.v.y);
var angleOfRamp=数学atan2(dy,dx);
var angleOfvelocity=Math.atan2(this.particle.v.y,this.particle.v.x);
var angleBetween=angleOfRamp*2-速度角;//不知道为什么:)
如果(angleBetween<0){angleBetween+=2*Math.PI;}//不确定原因:)
const restoration=this.elastic/100;
这个.particle.v.x=恢复*spd*Math.cos(angleBetween);
this.particle.v.y=恢复*spd*Math.sin(angleBetween);

感谢所有观看者:)

确定曲面相对于轴的角度。使用此选项调整传入向量,使曲面垂直于轴。对传入向量的垂直轴求反以创建传出向量。