-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrotate_point_about_axis.cpp
59 lines (51 loc) · 1.24 KB
/
rotate_point_about_axis.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
*@author http://paulbourke.net/geometry/rotate/
*@brief axes defined by a line between two points P1 = (x1,y1,z1) and P2 = (x2,y2,z2)
*/
XYZ RotatePointAboutLine(XYZ p,double theta,XYZ p1,XYZ p2)
{
XYZ u,q1,q2;
double d;
/* Step 1 */
q1.x = p.x - p1.x;
q1.y = p.y - p1.y;
q1.z = p.z - p1.z;
u.x = p2.x - p1.x;
u.y = p2.y - p1.y;
u.z = p2.z - p1.z;
Normalise(&u);
d = sqrt(u.y*u.y + u.z*u.z);
/* Step 2 */
if (d != 0) {
q2.x = q1.x;
q2.y = q1.y * u.z / d - q1.z * u.y / d;
q2.z = q1.y * u.y / d + q1.z * u.z / d;
} else {
q2 = q1;
}
/* Step 3 */
q1.x = q2.x * d - q2.z * u.x;
q1.y = q2.y;
q1.z = q2.x * u.x + q2.z * d;
/* Step 4 */
q2.x = q1.x * cos(theta) - q1.y * sin(theta);
q2.y = q1.x * sin(theta) + q1.y * cos(theta);
q2.z = q1.z;
/* Inverse of step 3 */
q1.x = q2.x * d + q2.z * u.x;
q1.y = q2.y;
q1.z = - q2.x * u.x + q2.z * d;
/* Inverse of step 2 */
if (d != 0) {
q2.x = q1.x;
q2.y = q1.y * u.z / d + q1.z * u.y / d;
q2.z = - q1.y * u.y / d + q1.z * u.z / d;
} else {
q2 = q1;
}
/* Inverse of step 1 */
q1.x = q2.x + p1.x;
q1.y = q2.y + p1.y;
q1.z = q2.z + p1.z;
return(q1);
}