Node:Rotating Points, Previous:Shearing Points, Up:Transforming Points

### Rotating

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.