程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 二維和三維向量的旋轉

二維和三維向量的旋轉

編輯:C++入門知識

二維向量旋轉:   二維向量旋轉代碼:   [cpp]   #include<iostream>   #include<stdio.h>   #include<math.h>   using namespace std;   #define N 1000   #define eps 1e-8   #define PI acos(-1.0)      struct point{double x,y;}p[N];   int n;   //點q繞(x0,y0) 逆時針旋轉ang   point rotate(point q,double x0,double y0,double ang)   {       point ans;       double cosa=cos(ang);       double sina=sin(ang);       double dx=q.x-x0;       double dy=q.y-y0;       ans.x=cosa*dx-sina*dy+x0;       ans.y=sina*dx+cosa*dy+y0;       return ans;   }      int main()   {       while(scanf("%d",&n)!=EOF)       {           point s={1,1};           int i;           for(i=0;i<n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);           for(i=0;i<n;i++)p[i]=rotate(p[i],s.x,s.y,PI/4.0);           for(i=0;i<n;i++)printf("%.2lf %.2lf\n",p[i].x,p[i].y);       }       return 0;   }      /*  in:  4  1 1  2 0  3 1  2 2  out:  1.00 1.00  2.41 1.00  2.41 2.41  1.00 2.41    */       三維向量旋轉: 向量繞任意軸OS(x, y, z)旋轉的矩陣:       =⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x2+(y2+z2)cosθx2+y2+z2yx(1−cosθ)x2+y2+z2+zsinθx2+y2+z2−−−−−−−−−−√zx(1−cosθ)x2+y2+z2−ysinθx2+y2+z2−−−−−−−−−−√xy(1−cosθ)x2+y2+z2−zsinθx2+y2+z2−−−−−−−−−−√y2+(z2+x2)cosθx2+y2+z2zy(1−cosθ)x2+y2+z2+xsinθx2+y2+z2−−−−−−−−−−√xz(1−cosθ)x2+y2+z2+ysinθx2+y2+z2−−−−−−−−−−√yz(1−cosθ)x2+y2+z2−xsinθx2+y2+z2−−−−−−−−−−√z2+(x2+y2)cosθx2+y2+z2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥ 三維向量旋轉代碼:   [cpp]   #include<iostream>   #include<cstdio>   #include<math.h>   #include<string.h>   #define PI acos(-1.0)   #define eps 1e-8   #define N 1000   using namespace std;      struct point3{double x,y,z;}p[N];   int n;      //求三維空間上一點q繞 向量(x0,y0,z0)正向旋轉ang 弧度的點,向量起點在原點   point3 rotate3(point3 q,double x0,double y0,double z0,double ang)   {       double x2=x0*x0;       double y2=y0*y0;       double z2=z0*z0;       double d2=x2+y2+z2;       double d=sqrt(d2);       double sina=sin(ang);       double cosa=cos(ang);       point3 ans;       ans.x=(x2+(y2+z2)*cosa)/d2*q.x           + (x0*y0*(1-cosa)/d2 - z0*sina/d )* q.y           + (x0*z0*(1-cosa)/d2+y0*sina/d)*q.z;       ans.y=(y0*x0*(1-cosa)/d2+z0*sina/d)*q.x            + (y2+(x2+z2)*cosa)/d2* q.y           + (y0*z0*(1-cosa)/d2-x0*sina/d)*q.z;       ans.z=(z0*x0*(1-cosa)/d2 - y0*sina/d)*q.x           + (z0*y0*(1-cosa)/d2+x0*sina/d)*q.y            + (z2+(x2+y2)*cosa)/d2*q.z;       return ans;   }      int main()   {   #ifndef Online_Judge       freopen("in.txt","r",stdin);   #endif       while(scanf("%d",&n)!=EOF)       {           int i;           for(i=0;i<n;i++)scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);           double x0=0,y0=0,z0=1;           double ang=PI/4.0;           for(i=0;i<n;i++)p[i]=rotate3(p[i],x0,y0,z0,ang);           for(i=0;i<n;i++)printf("%.8lf %.8lf %.8lf\n",p[i].x,p[i].y,p[i].z);       }       return 0;   }      /*  in:  8  0 0 0  1 -1 0  2 0 0  1 1 0  0 0 1  1 -1 1  2 0 1  1 1 1    out:  0.00000000 0.00000000 0.00000000  1.41421356 -0.00000000 0.00000000  1.41421356 1.41421356 0.00000000  0.00000000 1.41421356 0.00000000  0.00000000 0.00000000 1.00000000  1.41421356 -0.00000000 1.00000000  1.41421356 1.41421356 1.00000000  0.00000000 1.41421356 1.00000000  */    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved