青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Maths - Angle between vectors

LINK: http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/index.htm

How do we calculate the angle between two vectors?

For 2D Vectors

This is relatively simple because there is only one degree of freedom for 2D rotations. If v1 and v2 are normalised so that |v1|=|v2|=1, then,

angle = acos(v1•v2)

where:

  • • = 'dot' product (see box on right of page).
  • acos = arc cos = inverse of cosine function see trigonometry page.
  • |v1|= magnitude of v1.

The only problem is, this won't give all possible values between 0° and 360°, or -180° and +180°. In other words, it won't tell us if v1 is ahead or behind v2, to go from v1 to v2 is the opposite direction from v2 to v1.

In most math libraries acos will usually return a value between 0 and PI (in radians) which is 0° and 180°.

If we want a + or - value to indicate which vector is ahead, then we probably need to use the atan2 function (as explained on this page). using:

angle of 2 relative to 1= atan2(v2.y,v2.x) - atan2(v1.y,v1.x)

For 3D Vectors

Axis Angle Result

This is easiest to calculate using axis-angle representation because:

  • the angle is given by acos of the dot product of the two (normalised) vectors: v1•v2 = |v1||v2| cos(angle)
  • the axis is given by the cross product of the two vectors, the length of this axis is given by |v1 x v2| = |v1||v2| sin(angle).

as explained here

this is taken from this discussion.

So, if v1 and v2 are normalised so that |v1|=|v2|=1, then,

angle = acos(v1•v2)

axis = norm(v1 x v2)

If the vectors are parallel (angle = 0 or 180 degrees) then the length of v1 x v2 will be zero because sin(0)=sin(180)=0. In the zero case the axis does not matter and can be anything because there is no rotation round it. In the 180 degree case the axis can be anything at 90 degrees to the vectors so there is a whole range of possible axies.

angle (degrees) sin(angle) cos(angle) v1•v2 v1 x v2
0 0 1 1 0,0,0
90 1 0 0 unit len
180 0 -1 -1 0,0,0
270 -1 0 0 unit len

Quaternion Result

One approach might be to define a quaternion which, when multiplied by a vector, rotates it:

p2=q * p1

This almost works as explained on this page.

However, to rotate a vector, we must use this formula:

p2=q * p1 * conj(q)

where:

  • p2 = is a vector representing a point after being rotated
  • q = is a quaternion representing a rotation.
  • p1= is a vector representing a point before being rotated

This is a bit messy to solve for q, I am therefore grateful to minorlogic for the following approach which converts the axis angle result to a quaternion:

The axis angle can be converted to a quaternion as follows, let x,y,z,w be elements of quaternion, these can be expressed in terms of axis angle as explained here.

angle = arcos(v1•v2/ |v1||v2|)
axis = norm(v1 x v2)
s = sin(angle/2)
x = axis.x *s
y = axis.y *s
z = axis.z *s
w = cos(angle/2)

We can use this half angle trig formula on this page: sin(angle/2) = 0.5 sin(angle) / cos(angle/2)

so substituting in quaternion formula gives:
s = 0.5 sin(angle) / cos(angle/2)
x = norm(v1 x v2).x *s
y = norm(v1 x v2).y *s
z = norm(v1 x v2).z *s
w = cos(angle/2)

multiply x,y,z and w by 2* cos(angle/2) (this will de normalise the quaternion but we can always normalise later)

x = norm(v1 x v2).x * sin(angle)
y = norm(v1 x v2).y * sin(angle)
z = norm(v1 x v2).z * sin(angle)
w = 2 * cos(angle/2) * cos(angle/2)

now substitute half angle trig formula on this page: cos(angle/2) = sqrt(0.5*(1 + cos (angle)))

x = norm(v1 x v2).x * sin(angle)
y = norm(v1 x v2).y * sin(angle)
z = norm(v1 x v2).z * sin(angle)
w = 1 + cos (angle)

because |v1 x v2| = |v1||v2| sin(angle) we can normalise (v1 x v2) by dividing it with sin(angle),

also apply v1•v2 = |v1||v2| cos(angle)so,

x = (v1 x v2).x / |v1||v2|
y = (v1 x v2).y/ |v1||v2|
z = (v1 x v2).z/ |v1||v2|
w = 1 + v1•v2 / |v1||v2|

If v1 and v2 are already normalised then |v1||v2|=1 so,

x = (v1 x v2).x
y = (v1 x v2).y
z = (v1 x v2).z
w = 1 + v1•v2

If v1 and v2 are not already normalised then multiply by |v1||v2| gives:

x = (v1 x v2).x
y = (v1 x v2).y
z = (v1 x v2).z
w = |v1||v2| + v1•v2

Matrix Result

Using the quaternion to matrix conversion here we get:

1 - 2*qy2 - 2*qz2 2*qx*qy - 2*qz*qw 2*qx*qz + 2*qy*qw
2*qx*qy + 2*qz*qw 1 - 2*qx2 - 2*qz2 2*qy*qz - 2*qx*qw
2*qx*qz - 2*qy*qw 2*qy*qz + 2*qx*qw 1 - 2*qx2 - 2*qy2

so substituting the quaternion results above into the matrix we get:

1 - 2*(v1 x v2).y2 - 2*(v1 x v2).z2 2*(v1 x v2).x*(v1 x v2).y - 2*(v1 x v2).z*(1 + v1•v2) 2*(v1 x v2).x*(v1 x v2).z + 2*(v1 x v2).y*(1 + v1•v2)
2*(v1 x v2).x*(v1 x v2).y + 2*(v1 x v2).z*(1 + v1•v2) 1 - 2*(v1 x v2).x2 - 2*(v1 x v2).z2 2*(v1 x v2).y*(v1 x v2).z - 2*(v1 x v2).x*(1 + v1•v2)
2*(v1 x v2).x*(v1 x v2).z - 2*(v1 x v2).y*(1 + v1•v2) 2*(v1 x v2).y*(v1 x v2).z + 2*(v1 x v2).x*(1 + v1•v2) 1 - 2*(v1 x v2).x2 - 2*(v1 x v2).y2

Substituting the following expansions:

(v1 x v2).x = v1.y * v2.z - v2.y * v1.z
(v1 x v2).y = v1.z * v2.x - v2.z * v1.x
(v1 x v2).z = v1.x * v2.y - v2.x * v1.y
(v1 x v2).x2 = v1.y * v2.z * v1.y * v2.z + v2.y * v1.z * v2.y * v1.z - 2 * v2.y * v1.z * v1.y * v2.z
(v1 x v2).y2 = v1.z * v2.x * v1.z * v2.x + v2.z * v1.x * v2.z * v1.x - 2* v2.z * v1.x * v1.z * v2.x
(v1 x v2).z2 = v1.x * v2.y * v1.x * v2.y +v2.x * v1.y * v2.x * v1.y - 2 * v2.x * v1.y * v1.x * v2.y
v1•v2 = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z

This is getting far too complicated ! can anyone help me simplify this?

Thank you again to minorlogic who gave me the following solution:

Hi !
and i think can help in matrix version.

you can use :
http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToMatrix/index.htm

And will get some thing :

matrix33 RotAngonst vector3& from, const vector3& to )
{
from.norm();
to.norm();

vector3 vs = cross(from, to); // axis multiplied by sin

vector3 v(vs);
v.norm(); // axis of rotation
float ca = dot(from, to) ; // cos angle

vector3 vt(v*(1.0f - ca));

matrix33 rotM;
rotM.M11 = vt.x * v.x + ca;
rotM.M22 = vt.y * v.y + ca;
rotM.M33 = vt.z * v.z + ca;

vt.x *= v.y;
vt.z *= v.x;
vt.y *= v.z;

rotM.M12 = vt.x - vs.z;
rotM.M13 = vt.z + vs.y;
rotM.M21 = vt.x + vs.z;
rotM.M23 = vt.y - vs.x;
rotM.M31 = vt.z - vs.y;
rotM.M32 = vt.y + vs.x;
return rotM;
}

Code

axis-angle version
sfrotation angleBetween(sfvec3f v1,sfvec3f v2) {
float angle;
// turn vectors into unit vectors
n1 = v1.norm();
n2 = v2.norm();
angle = Math.acos( sfvec3f.dot(n1,n2) );
// if no noticable rotation is available return zero rotation
// this way we avoid Cross product artifacts
if( Math.abs(angle) < 0.0001 ) return new sfrotation( 0, 0, 1, 0 );
// in this case there are 2 lines on the same axis
if(Math.abs(angle)-Math.pi) < 0.001){
n1 = n1.Rotx( 0.5f );
// there are an infinite number of normals
// in this case. Anyone of these normals will be
// a valid rotation (180 degrees). so I rotate the curr axis by 0.5 radians this way we get one of these normals
}
sfvec3f axis = n1;
axis.cross(n2);
return new sfrotation(axis.x,axis.y,axis.z,angle);
}
quaternion version
/** note v1 and v2 dont have to be nomalised, thanks to minorlogic for telling me about this:
* http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm
*/
sfquat angleBetween(sfvec3f v1,sfvec3f v2) {
float d = sfvec3f.dot(v1,v2);
sfvec3f axis = v1;
axis.cross(v2);
float qw = (float)Math.sqrt(v1.len_squared()*v2.len_squared()) + d;
if (qw < 0.0001) { // vectors are 180 degrees apart
return (new sfquat(0,-v1.z,v1.y,v1.x)).norm;
}
sfquat q= new sfquat(qw,axis.x,axis.y,axis.z);
return q.norm();
}

matrix version

sfmatrix angleBetween(sfvec3f v1,sfvec3f v2) {
// turn vectors into unit vectors
n1 = v1.norm();
n2 = v2.norm(); 	sfvec3f vs = new sfvec3f(n1);
vs.cross(n2); // axis multiplied by sin	sfvec3f v = new sfvec3f(vs);
v = v.norm(); // axis of rotation
float ca = dot(n1, n2) ; // cos angle	sfvec3f vt = new sfvec3f(v);	vt.scale((1.0f - ca);	sfmatrix rotM = new sfmatrix();
rotM.m11 = vt.x * v.x + ca;
rotM.m22 = vt.y * v.y + ca;
rotM.m33 = vt.z * v.z + ca;	vt.x *= v.y;
vt.z *= v.x;
vt.y *= v.z;	rotM.m12 = vt.x - vs.z;
rotM.m13 = vt.z + vs.y;
rotM.m21 = vt.x + vs.z;
rotM.m23 = vt.y - vs.x;
rotM.m31 = vt.z - vs.y;
rotM.m32 = vt.y + vs.x;
return rotM;
}

see also code from minorlogic

posted on 2009-05-31 13:50 zmj 閱讀(1599) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情精品久久久久| 久久精品视频免费| 欧美香蕉视频| 亚洲性图久久| 亚洲一区二区三区四区在线观看| 欧美日韩一区视频| 亚洲午夜视频| 亚洲一区二三| 国外视频精品毛片| 欧美大片va欧美在线播放| 欧美jizz19hd性欧美| 亚洲美女视频在线观看| 亚洲视频精品| 伊人久久久大香线蕉综合直播| 免费成人高清视频| 欧美久久精品午夜青青大伊人| 中日韩视频在线观看| 亚洲欧美三级在线| 亚洲黄色一区| 一区二区91| 极品少妇一区二区| 亚洲精品自在久久| 国产亚洲一区二区三区在线播放| 免费成人在线视频网站| 欧美日韩国产天堂| 久久精品亚洲精品| 欧美久久在线| 久久人人爽人人| 欧美日韩一区二区三区在线 | 欧美国产日韩精品免费观看| 一区二区成人精品| 欧美一区二区三区免费在线看| 亚洲黄色一区二区三区| 亚洲性视频网址| 亚洲精品美女久久7777777| 亚洲免费人成在线视频观看| 曰韩精品一区二区| 亚洲免费中文| 亚洲美女在线看| 欧美一区二区三区日韩视频| 日韩一区二区精品在线观看| 久久爱91午夜羞羞| 亚洲免费在线观看视频| 欧美大片va欧美在线播放| 欧美一区二区三区精品 | 亚洲毛片在线观看| 激情丁香综合| 亚洲综合精品四区| 亚洲图片激情小说| 欧美成人中文| 欧美成人中文字幕在线| 国产一区三区三区| 亚洲主播在线| 亚洲欧美国产精品va在线观看| 免播放器亚洲一区| 老司机午夜精品视频在线观看| 国产女优一区| 亚洲一区二区三区四区视频| 中日韩高清电影网| 欧美日韩视频一区二区三区| 亚洲电影欧美电影有声小说| 狠狠久久亚洲欧美| 久久国内精品自在自线400部| 午夜电影亚洲| 国产精品男女猛烈高潮激情| 亚洲无线一线二线三线区别av| 亚洲深夜影院| 欧美午夜不卡影院在线观看完整版免费| 亚洲春色另类小说| 亚洲经典在线看| 模特精品裸拍一区| 亚洲激情图片小说视频| 亚洲毛片网站| 欧美成人首页| 亚洲精品乱码久久久久久日本蜜臀| 亚洲激情亚洲| 欧美日韩国产综合视频在线观看中文| 亚洲经典在线看| 在线视频中文亚洲| 国产精品v欧美精品v日本精品动漫| 亚洲精品中文在线| 欧美一区二区三区免费视频| 国产亚洲一区二区三区在线观看| 欧美一区二区视频免费观看 | 最新中文字幕一区二区三区| 免费观看30秒视频久久| 亚洲激情一区| 亚洲欧美日韩国产一区| 国产午夜精品美女毛片视频| 久久久久免费观看| 亚洲国产成人午夜在线一区| 亚洲色图综合久久| 国产日产亚洲精品系列| 久久综合中文字幕| 日韩午夜免费| 久久xxxx| 亚洲精品久久久一区二区三区| 欧美激情麻豆| 亚洲欧美日韩综合| 亚洲国产成人久久综合一区| 亚洲欧美韩国| 亚洲第一二三四五区| 欧美三级日本三级少妇99| 性欧美xxxx视频在线观看| 欧美大片在线观看一区| 亚洲免费影视第一页| 亚洲电影免费观看高清完整版| 欧美日本三区| 欧美中文字幕视频在线观看| 亚洲欧洲在线观看| 久久精品亚洲精品| 亚洲桃色在线一区| 亚洲国产成人精品久久久国产成人一区 | 久久综合九色99| 在线综合亚洲| 亚洲激情视频在线播放| 国产精品亚洲产品| 欧美成人高清| 久久精品一区二区三区不卡牛牛| 亚洲精品日韩在线观看| 久久综合网hezyo| 午夜一区不卡| 亚洲无限av看| 日韩一区二区精品视频| 亚洲电影第1页| 国产综合色产在线精品| 欧美三级日韩三级国产三级| 美女诱惑一区| 久久亚洲精品一区| 性做久久久久久久免费看| 99精品国产热久久91蜜凸| 欧美激情视频在线播放 | 99re成人精品视频| 精品成人国产| 国产一区久久| 国产欧美在线播放| 国产精品日韩在线一区| 国产精品a久久久久久| 欧美久久九九| 欧美日本国产在线| 欧美精品一区二| 欧美激情在线狂野欧美精品| 美女精品视频一区| 免费不卡亚洲欧美| 免费毛片一区二区三区久久久| 久久精品卡一| 久久躁狠狠躁夜夜爽| 久久久久九九九九| 久久综合福利| 免费精品99久久国产综合精品| 欧美一区在线看| 久久黄色影院| 久久天堂成人| 欧美福利专区| 欧美日韩另类视频| 国产精品福利在线| 国产欧美日韩一区二区三区| 国产日韩欧美亚洲一区| 国产日韩精品久久| 激情婷婷欧美| 亚洲激情第一页| 99视频一区二区| 亚洲特黄一级片| 欧美影院精品一区| 老司机久久99久久精品播放免费 | 欧美激情偷拍| 亚洲欧洲精品成人久久奇米网 | 欧美成人在线影院| 亚洲欧洲在线一区| 亚洲一区网站| 久久免费国产| 欧美日韩国产不卡| 国产无一区二区| 亚洲精品久久久久久一区二区| 亚洲图片你懂的| 久久青草福利网站| 最新日韩精品| 欧美淫片网站| 欧美日本簧片| 伊人精品久久久久7777| 亚洲日本成人在线观看| 午夜一区不卡| 亚洲福利久久| 新狼窝色av性久久久久久| 欧美a级大片| 国产一区二区三区日韩| 日韩一级精品视频在线观看| 久久久久国内| 一区二区三区三区在线| 久久精品一区二区三区不卡牛牛| 欧美人与禽性xxxxx杂性| 国产亚洲精品一区二区| 中文日韩在线| 男女视频一区二区| 亚洲欧美日韩另类精品一区二区三区| 美女久久网站| 国产在线欧美| 香蕉久久国产| 99在线热播精品免费99热| 久久视频这里只有精品|