Fork me on GitHub

空间任意点沿着任意一条直线旋转的实现

给定任意一点p(x,y,z),直线AB,其中A(a0,b0,c0)、B(a,b,c),旋转的角度θ=theta,可对其进行如下实现:

 1 private double[] random_rotateObject(double x, double y, double z, double a, double b, double c,double a0,double b0,double c0,double theta)
 2         {
 3             //(a0,b0,c0)轴线的始点
 4             //(a,b,c)轴线L末点
 5             //(x,y,z)初始点位置
 6             //数组xyz 绕L旋转后的位置
 7             //行(1,0,0,-m)(0,1,0,-n)(0,0,1,-k)(0,0,0,1)移至原点
 8             double u = Math.Sqrt(3)/3; ;
 9             double v = Math.Sqrt(3)/3;
10             double w = Math.Sqrt(3)/3;       //方向向量(u,v,w)需为单位向量!!!
11             double PI = 3.1415926535898
12             double[] xyz=new double[3];
13             double SinA = Math.Sin(theta * PI / 180);
14             double CosA = Math.Cos(theta * PI / 180); 
15 
16             double uu=u*u;
17             double vv=v*v;
18             double ww=w*w;
19             double uv=u*v;
20             double uw=u*w;
21             double vw=v*w;
22 
23             float t00 = uu + (vv + ww) * CosA;
24             float t10 = uv * (1 - CosA) + w * SinA;
25             float t20 = uw * (1 - CosA) - v * SinA;
26             float t30 = 0;
27 
28             float t01 = uv * (1 - CosA) - w * SinA;
29             float t11 = vv + (uu + ww) * CosA;
30             float t21 = vw * (1 - CosA) + u * SinA;
31             float t31 = 0;
32 
33             float t02 = uw * (1 - CosA) + v * SinA;
34             float t21 = vw * (1 - CosA) - u * SinA;
35             float t22 = ww + (uu + vv) * CosA;
36             float t32 = 0;
37 
38             float t03 = (a0 * (vv + ww) - u * (b0 * v + c0 * w)) * (1 - CosA) + (b0 * w - c0 * v) * SinA;
39             float t13 = (b0 * (uu + ww) - v * (a0 * u + c0 * w)) * (1 - CosA) + (c0 * u - a0 * w) * SinA;
40             float t23 = (c0 * (uu + vv) - w * (a0 * u + b0 * v)) * (1 - CosA) + (a0 * v - b0 * u) * SinA;
41             float t33 = 1;
42        
43             xyz[0] = t00 * x + t01 * y + t02 * z + t03;
44             xyz[1] = t10 * x + t11 * y + t12 * z + t13;
45             xyz[2] = t20 * x + t21 * y + t22 * z + t23;
46             return xyz;
47         }
View Code

 

posted @ 2016-03-07 16:27  千秋此意  阅读(3059)  评论(4编辑  收藏  举报