The function rotate() rotates a Point about one or more of
the main axes.
It takes three real arguments, specifying the
angles of rotation in degrees about the x, y, and z-axes respectively.
Only the first argument is required, the other two are 0 by default. If
rotation about the y-axis, or the y and z-axes only are required, then 0
must be used as a placeholder for the first and possibly the second
argument.
Point p(0, 1);
p.rotate(90);
p.show("p:");
-| p: (0, 0, -1)
p.rotate(0, 90);
p.show("p:");
-| p: (1, 0, 0)
p.rotate(0, 0, 90);
p.show("p:");
-| p: (0, 1, 0)
The rotations are performed successively about the
x, y, and z-axes. However, rotation is not a commutative
operation, so if rotation about the main axes in a different
order is required, then rotate() must be invoked more than once:
Point A(2, 3, 4);
Point B(A);
A.rotate(30, 60, 90);
A.show("A:");
-| A: (-4.59808, -0.700962, 2.7141)
B.rotate(0, 0, 90);
B.rotate(0, 60);
B.rotate(30);
B.show("B:");
-| B: (-4.9641, 1.43301, -1.51795)
Rotation need not be about the main axes; it can also be performed
about a line defined by two Points. The function rotate()
with two Point arguments and a real argument for the
angle of rotation (in degrees) about the axis. The real argument
is optional, with
180 degrees
as the default.
Point p0 (-1.06066, 0, 1.06066);
Point p1 (1.06066, 0, -1.06066);
p1 *= p0.rotate(0, 30, 30);
p0.show("p0:");
-| p0: (-1.25477, -0.724444, 0.388228)
p1.show("p1:");
-| p1: (1.25477, 0.724444, -0.388228)
p0.draw(p1);
Point p2(1.06066, 0, 1.06066);
p2.show("p2:");
-| p2: (1.06066, 0, 1.06066)
Point p3(p2);
p3.rotate(p1, p0, 45);
p3.show("p3:");
-| p3 (1.09721, 1.15036, 1.17879)
Point p4(p2);
p4.rotate(p1, p0, 90);
p4.show("p4:");
-| p4: (0.882625, 2.05122, 0.485242)
Point p5(p2);
p5.rotate(p1, p0, 135);
p5.show("p5:");
-| p5: (0.542606, 2.17488, -0.613716)
Point p6(p2);
p6.rotate(p1, p0);
p6.show("p6:");
-| p6: (0.276332, 1.44889, -1.47433)
Fig. 2.
I have sometimes gotten erroneous results using rotate() for
rotation about two Points. It's usually worked to reverse the
order of the Point arguments, or to change sign of the angle
argument. I think I've fixed the problem, though.