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

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)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美成人中文字幕| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久综合狠狠综合久久综合88| 国产精品高清一区二区三区| 亚洲一区二区动漫| 99av国产精品欲麻豆| 亚洲在线一区二区三区| 激情国产一区| 欧美精品入口| 免费欧美在线| 欧美亚洲免费| 9久re热视频在线精品| 欧美v亚洲v综合ⅴ国产v| 久久网站免费| 久久www成人_看片免费不卡| 亚洲美女在线国产| 国产日韩一级二级三级| 韩国福利一区| 国内综合精品午夜久久资源| 国产精品久久99| 久久精品女人的天堂av| 欧美福利视频| 麻豆成人精品| 久久婷婷蜜乳一本欲蜜臀| 亚洲视频中文字幕| 午夜精品美女久久久久av福利| 亚洲精品视频在线观看免费| 黄色精品在线看| 亚洲天堂久久| 亚久久调教视频| 亚洲国产精彩中文乱码av在线播放| 99精品国产在热久久下载| 美国成人直播| 亚洲视频图片小说| 亚洲精品一线二线三线无人区| 欧美激情视频一区二区三区在线播放 | 久久久人成影片一区二区三区| 欧美一区二区视频97| 亚洲国产mv| 欧美一区二区在线视频| 亚洲特级片在线| 亚洲视频观看| 韩国av一区二区三区四区| 亚洲人成小说网站色在线| 日韩天堂av| 亚洲天堂av在线免费| 国产精品亚洲产品| 99精品久久久| 亚洲欧美日韩综合国产aⅴ| 欧美日韩美女在线观看| 亚洲精选视频免费看| 亚洲午夜视频在线| 亚洲欧美日韩一区二区在线| 午夜精品美女久久久久av福利| 欧美成人免费观看| 亚洲蜜桃精久久久久久久| 亚洲免费一在线| 免费成人美女女| 亚洲第一福利视频| 一区二区av| 久久久99免费视频| 国产一区日韩欧美| 一本久道久久久| 久久精品天堂| 亚洲激情国产精品| 免费试看一区| 亚洲精品一区二区三区福利| 亚洲尤物影院| 乱人伦精品视频在线观看| 久久精品国产v日韩v亚洲| 欧美日韩播放| 在线观看精品视频| 欧美电影在线观看完整版| 中文国产一区| 免费在线看一区| 欧美性猛交xxxx乱大交蜜桃| 一本到高清视频免费精品| 久久手机精品视频| 91久久国产综合久久| 亚洲一二三区精品| 欧美激情中文字幕一区二区| 国内伊人久久久久久网站视频| 日韩视频免费看| 欧美成人午夜剧场免费观看| 欧美在线观看你懂的| 欧美大片免费观看在线观看网站推荐| 国产精品久久久| 日韩天堂在线观看| 亚洲香蕉伊综合在人在线视看| 女同性一区二区三区人了人一| 国产精品伦一区| 亚洲一区二区免费| 亚洲欧美国产va在线影院| 欧美日韩免费观看中文| 亚洲美洲欧洲综合国产一区| 欧美黄色大片网站| 欧美日韩一级黄| 在线一区亚洲| 日韩视频在线观看国产| 欧美日韩成人免费| 亚洲国产美女久久久久| 久久一区二区三区av| 日韩视频在线一区二区三区| 欧美日韩亚洲高清一区二区| ●精品国产综合乱码久久久久| 久久精品人人做人人爽| 久久久久久久久伊人| 亚洲乱码国产乱码精品精| 欧美性片在线观看| 久久精品一区二区| 一区二区免费在线观看| 国产精品二区在线| 中文在线不卡视频| 亚洲欧美日韩精品久久| 香蕉免费一区二区三区在线观看| 欧美91大片| 午夜精品久久久久久99热软件| 亚洲影院免费观看| 亚洲一区免费网站| 欧美成人中文字幕在线| 亚洲午夜精品视频| 久久野战av| 亚洲一区二区在线免费观看视频| 亚洲一级网站| 久久国产欧美精品| 国产在线播放一区二区三区| 亚洲国产精品免费| 国产啪精品视频| 国产日韩在线看片| 欧美四级伦理在线| 国产精品美女久久久久aⅴ国产馆| 欧美日本国产一区| 欧美日韩性生活视频| 国产精品久久久久影院亚瑟| 欧美性开放视频| 国产一区二区三区av电影| 狠狠狠色丁香婷婷综合激情| 亚洲片在线观看| 性欧美精品高清| 亚洲免费成人| 久久嫩草精品久久久久| 最新日韩在线视频| 欧美亚洲一级片| 伊人夜夜躁av伊人久久| 最近中文字幕日韩精品 | 午夜精品网站| 亚洲午夜国产一区99re久久| 亚洲国产一成人久久精品| 99国产精品久久久久久久成人热| 亚洲激情网站免费观看| 国产丝袜一区二区| 国内视频一区| 欧美成人精品高清在线播放| 欧美一区二区三区另类 | 久久网站热最新地址| 日韩午夜免费视频| 亚洲摸下面视频| 亚洲国产精品综合| 日韩视频免费观看| 中文av一区二区| 欧美专区第一页| 欧美日韩综合不卡| 亚洲尤物在线视频观看| 亚洲国产精选| 在线精品视频一区二区| 国产精品欧美日韩一区| 欧美日韩国产三级| 国产欧美一区二区色老头| 欧美性猛交xxxx乱大交退制版| 欧美图区在线视频| 欧美性天天影院| 久久婷婷久久一区二区三区| 欧美中文字幕在线| 免费在线观看精品| 红桃视频亚洲| 亚洲日本中文字幕免费在线不卡| 一区国产精品| 久久久精品一区| 久久男女视频| 性做久久久久久久久| 国内精品免费午夜毛片| 亚洲高清视频在线观看| 欧美国产在线观看| 性8sex亚洲区入口| 久久手机精品视频| 亚洲黄色尤物视频| 欧美一区激情| 亚洲黄色在线视频| 午夜精品婷婷| 91久久国产综合久久91精品网站| 亚洲美女淫视频| 国模叶桐国产精品一区| 中国日韩欧美久久久久久久久| 国产精品免费久久久久久| 久久免费99精品久久久久久| 亚洲深爱激情| 亚洲第一狼人社区| 美女黄毛**国产精品啪啪| 亚洲天堂男人| 欧美成人四级电影|