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

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 閱讀(1595) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   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>
            午夜久久一区| 亚洲国产cao| 久久精品一区二区三区四区 | 欧美69视频| 免费日韩成人| 欧美电影电视剧在线观看| 另类综合日韩欧美亚洲| 美日韩在线观看| 欧美激情精品| 日韩亚洲成人av在线| 在线中文字幕不卡| 亚洲欧美国产精品va在线观看 | 免费不卡在线视频| 欧美黄色免费网站| 亚洲人午夜精品| 亚洲青色在线| 亚洲男人av电影| 久久久精品日韩| 欧美激情国产日韩精品一区18| 欧美日韩亚洲视频| 国产美女精品在线| 亚洲人成77777在线观看网| 99综合视频| 欧美区日韩区| 国产一区二区三区成人欧美日韩在线观看 | 亚洲欧美日韩精品久久久| 久久久久久久精| 欧美日韩成人综合在线一区二区| 国产精品卡一卡二卡三| 在线观看三级视频欧美| 一区二区三区日韩欧美精品| 欧美一区三区二区在线观看| 欧美好骚综合网| 亚洲综合精品自拍| 欧美精品色网| 精品91在线| 亚洲欧美日韩系列| 欧美国产日韩在线| 亚洲欧美综合网| 欧美伦理视频网站| 亚洲国产精品va在线看黑人动漫| 欧美一级大片在线观看| 日韩视频在线一区二区三区| 玖玖视频精品| 国产在线精品一区二区中文| 亚洲欧美久久久| 亚洲精品一区中文| 欧美国产日韩亚洲一区| 黄色精品一区| 久久精品国产69国产精品亚洲| 亚洲乱码国产乱码精品精天堂| 麻豆久久精品| 亚洲福利免费| 欧美成人精品不卡视频在线观看| 欧美在线三级| 国产一区视频在线观看免费| 亚洲欧洲99久久| 亚洲伊人久久综合| 国产精品久久网站| 午夜精品久久久久影视| 亚洲视频免费看| 国产精品麻豆成人av电影艾秋| 亚洲在线视频免费观看| 亚洲视频在线观看一区| 国产精品久久久一本精品| 亚洲综合色激情五月| 亚洲一区二区三区三| 欧美午夜在线观看| 亚洲欧美日韩精品久久亚洲区 | 久久午夜色播影院免费高清| 国产一区二区三区在线观看网站| 亚洲婷婷综合久久一本伊一区| 国产亚洲福利一区| 先锋影音久久| 日韩视频不卡| 欧美成人网在线| 亚洲二区在线观看| 亚洲毛片播放| 亚洲欧美日韩国产中文| 国内精品免费在线观看| 亚洲自拍高清| 欧美在线你懂的| 国产精品国码视频| 久久国产一区二区| 亚洲免费观看| 国产日韩欧美日韩| 亚洲一区二区四区| 欧美一区二区视频网站| 国产视频一区二区在线观看| 欧美一区二区三区免费看| 亚洲在线观看视频| 国产欧美一二三区| 久久精品国产亚洲aⅴ| 欧美激情网友自拍| 欧美性一区二区| 欧美一区二区观看视频| 午夜精品亚洲| 在线国产日韩| 亚洲欧洲精品一区二区三区| 国产精品美女www爽爽爽视频| 欧美在线观看一二区| 欧美国产综合视频| 亚洲欧美另类国产| 老司机67194精品线观看| 一区二区免费在线播放| 久久国产欧美| 亚洲人成网站精品片在线观看| 亚洲一区二区三区四区五区午夜| 国产日产精品一区二区三区四区的观看方式 | 猛男gaygay欧美视频| 亚洲黄色成人久久久| 欧美激情一区二区三区| 欧美日韩国产一区二区三区| 性色一区二区三区| 狂野欧美激情性xxxx| 国产一区二区三区四区五区美女| 99re视频这里只有精品| 国产主播一区二区| 日韩一区二区福利| 激情小说另类小说亚洲欧美| 亚洲精品黄网在线观看| 国产欧美精品日韩精品| 欧美激情一区二区三区高清视频| 久久噜噜亚洲综合| 亚洲一区二区三区四区视频| 久久精品国产免费观看| 中文av字幕一区| 欧美.com| 激情成人av在线| 一区二区三区国产精品| 亚洲精品三级| 久久精品视频网| 久久精品国产亚洲精品| 欧美视频日韩视频| 亚洲国产精品小视频| 国产日韩欧美三区| 久久一区二区三区四区| 暖暖成人免费视频| 久久久噜噜噜久久中文字免| 国产精品人人做人人爽人人添| 欧美成人一区二免费视频软件| 国产精品每日更新| aa国产精品| 日韩视频专区| 久久久久久久久蜜桃| 欧美成人嫩草网站| 国产一区二区三区最好精华液| 一本色道久久88亚洲综合88| 亚洲人体一区| 免费亚洲一区| 亚洲一卡久久| 国产精品进线69影院| 在线视频欧美日韩精品| 亚洲永久视频| 久久久之久亚州精品露出| 久久看片网站| 国产精品视频1区| 欧美一级片在线播放| 久久最新视频| 亚洲国产欧美一区二区三区久久| 欧美 日韩 国产在线| 亚洲国产精品成人| 亚洲一区二区高清| 欧美日韩视频一区二区| 亚洲欧美精品伊人久久| 久久er99精品| 亚洲精品乱码久久久久久久久| 欧美成人a视频| 在线亚洲欧美专区二区| 免费美女久久99| 一区二区国产日产| 亚洲欧美日韩一区在线| 国产精品私人影院| 久久国产精品久久久久久| 亚洲精品久久久蜜桃| 亚洲无线视频| 国产人成一区二区三区影院| 久久精品国产精品亚洲| 午夜在线一区二区| 亚洲精品在线观| 欧美日韩在线三级| 欧美一区二区观看视频| 欧美1区3d| 韩国亚洲精品| 国产精品高清网站| 欧美亚洲综合网| 欧美国产精品| 亚洲一区二区欧美| 国产精品videosex极品| 久久夜色精品国产欧美乱极品| 亚洲日产国产精品| 欧美亚洲一区三区| 亚洲人成人一区二区在线观看| 欧美福利视频一区| 午夜在线观看欧美| 91久久视频| 久久精品伊人| 亚洲伊人第一页| 先锋影音网一区二区| 伊人蜜桃色噜噜激情综合|