Laan's steps..

Feed Rss

向量[摘自as4game]

11.16.2009, flash, by .

文内容摘自:http://www.as4game.com/blog/

var v={};
v.po1={x:10, y:20};//向量起始点坐标
v.po2={x:40, y:50};//向量终点坐标
v.vx=v.po2.x - v.po1.x;//x分量
v.vy=v.po2.y - v.po1.y;//y分量

1.计算向量长度

v.len = Math.sqrt(v.vx*v.vx+v.vy*v.vy);

2.向量归一化

v.dx=v.vx/v.len;
v.dy=v.vy/v.len;

3.法线

v.rx=-v.vy;//右法线x分量
v.ry=v.vx;//右法线y分量
v.lx=v.vy;//左法线x分量
v.ly=-v.vx;//左法线y分量

4.向量相加

var resultv={};
resultv.vx=v1.vx+v2.vx;
resultv.vy=v1.vy+v2.vy;

5.向量的点乘

var dp = v1.vx*v2.vx + v1.vy*v2.vy;

dp并不是一个向量,而是一个数字,如果是正数,那么2个向量的方向是相同的(夹角小于90度),如果是负数,那么2个向量的方向是相反的(夹角大于90度)。

6.V1在V2上的投影

var dp = v1.vx*v2.vx + v1.vy*v2.vy;//计算相连点乘
var proj={};
proj.vx=dp*v2.dx;//v1在v2上投影的x分量
proj.vy=dp*v2.dy;//v1在v2上投影的y分量

7.向量相交
判断是否有交点

(v1.dx==v2.dx && v1.dy==v2.dy) || (v1.dx==-v2.dx && v1.dy==-v2.dy)

此时,时v1和v2是平行向量。
向量垂直点乘计算:

p=v1.rx*v2.vx + v1.ry*v2.vy;
//rx,ry分别为向量右法线的、y分量(v.rx = -v.vy; v.ry = v.vx;)。

计算两个向量的交点

v3={vx:v2.p0.x-v1.p0.x, vy:v2.p0.y-v1.p0.y};//v3从v1的起始点到v2的起始点
p3_2= v3.rx*v2.vx + v3.ry*v2.vy;//计算v3和v2的垂直点乘, v.rx = -v.vy; v.ry = v.vx;
p1_2= v1.rx*v2.vx + v1.ry*v2.vy;//计算v1和v2的垂直点乘
var t=p3_2/p1_2;
ip={};//向量交点
ip.x=v1.p0.x+v1.vx*t;
ip.y=v1.p0.y+v1.vy*t;

8.碰撞
v1为运动向量,v2为墙壁向量。将v1在v2上的投影向量加上v1在v2法线向量上的投影,即为v1碰撞后的运动向量。
计算v1在v2上的投影:

var dp1 = v1.vx*v2.vx + v1.vy*v2.vy;
var proj1 = {};//v1在v2上的投影向量
proj1.vx=dp1*v2.dx;
proj1.vy=dp1*v2.dy;

计算v1在v2法线上的投影:

var dp2 = v1.vx*v2.lx + v1.vy*v2.ly;
//这里是用的是左法线,需要判断碰撞发生的方向。v2.lx = v2.vy; v2.ly = -v2.vx;
var proj2 = {};//v1在v2法线上的投影向量
proj2.vx=dp1*(v2.lx/v2.len);//需要将法线除以长度,将其归一化
proj2.vy=dp1*(v2.ly/v2.len);//需要将法线除以长度,将其归一化

相加两个投影向量以得到碰撞后的运动向量:

v1.vx=proj1.vx+proj2.vx;
v1.vy=proj1.vy+proj2.vy;

根据弹性系数以及摩擦系数计算碰撞后的运动向量:

v.b=0.99;//物体弹性系数
v.f=0.99;//物体摩擦系数

//计算碰撞后的运动向量
v1.vx=v1.f*v2.f*proj1.vx+v1.b*v2.b*proj2.vx;
v1.vy=v1.f*v2.f*proj1.vy+v1.b*v2.b*proj2.vy;

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>