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.