BBC Micro Elite

# Drawing meridians and equators

```The algorithms behind the meridians and equators of planets like Lave
---------------------------------------------------------------------
References: PL9 (Part 2 of 3)
This deep dive is a work in progress. It covers part 2 of the PL9 routine,
which draws meridians and equators on planets.

Part 2 of PL9 calculates the following and, for each meridian, calls PLS2 to
do the actual plotting.

For meridian 1, we calculate the following

CNT2 = arctan(-nosev_z_hi / roofv_z_hi) / 4
with opposite sign to nosev_z_hi

(XX16   K2  ) = nosev_x / z
(XX16+1 K2+1) = nosev_y / z
(XX16+2 K2+2) = roofv_x / z
(XX16+3 K2+3) = roofv_y / z

Then PLS2 does this, with CNT2 stepping through a half circle from the
starting point set above:

K6(1 0) = K3(1 0) + (XX16 K2) * cos(CNT2) + (XX16+2 K2+2) * sin(CNT2)
= K3(1 0) + (nosev_x / z) * cos(CNT2) + (roofv_x / z) * sin(CNT2)

(T X) = - |XX16+1 K2+1| * cos(CNT2) - |XX16+3 K2+3| * sin(CNT2)
= - |nosev_y / z| * cos(CNT2) - |roofv_y / z| * sin(CNT2)

calling BLINE each iteration to plot segments to:

x = K6(1 0), y = K4(1 0) + (T X)

and counting CNT2 through half a circle from its starting point.

For meridian 2, we calculate the following

CNT2 = arctan(-nosev_z_hi / sidev_z_hi) / 4
with opposite sign to nosev_z_hi

(XX16   K2  ) = nosev_x / z
(XX16+1 K2+1) = nosev_y / z
(XX16+2 K2+2) = sidev_x / z
(XX16+3 K2+3) = sidev_y / z

Then PLS2 does this, with CNT2 stepping through a half circle from the
starting point set above:

K6(1 0) = K3(1 0) + (XX16 K2) * cos(CNT2) + (XX16+2 K2+2) * sin(CNT2)
= K3(1 0) + (nosev_x / z) * cos(CNT2) + (sidev_x / z) * sin(CNT2)

(T X) = - |XX16+1 K2+1| * cos(CNT2) - |XX16+3 K2+3| * sin(CNT2)
= - |nosev_y / z| * cos(CNT2) - |sidev_y / z| * sin(CNT2)

calling BLINE each iteration to plot segments to:

x = K6(1 0), y = K4(1 0) + (T X)

and counting CNT2 through half a circle from its starting point.

```