Home  Contents  KwikPik 
Issue 4  part 2: "Spherical Coordinates" 
This program is available on "ZIPi'T'ape", which holds the files for both parts of the article. 
The concepts behind computeraided design (CAD) and, in particular, the delights of threedimensional plotting, are such that they have usually remained the preserve of 'big' computers. Mathematician and engineer Damir Skrgatic sets out over this issue and the next to prove that usefulness in this area is within the reach of our honest but humble eightbitters.  

P L O T T I N G I N 3 D / P A R T O N E GRAPHICS & MATHEMATICS 

For many of its users, maths fascinates firstly for its beauty and
elegance in dealing with complex
manipulations and relationships, and
secondly as a tool which seems
almost to possess a mind of its own.
Providing that the rules of the 'game'
are not broken, it can lead the faithful
along a complex path of calculations
to what sometimes turns out to be a
quite unexpected solution. (Take, for
instance, the supreme examples of
relativity and quantum mechanics,
where results obtained through
mathematics contradict everyday
common sense!) But your author must admit that, until the advent of the microcomputer, this fascination with maths proved less than faithful. All too often when trying to solve a problem using pen and paper, the calculations became too complicated to continue. It was like fighting with an octopus  you escape one set of arms only to fall foul of the next! But how can microcomputers help? Well, even the cheapest available are programmed to carry out mathematical calculations at speeds far beyond our imagination. Thousands of repetitive calculations are easily performed on the execution of a single line of a Basic program. Programs can be written not only to perform these calculations but also to make 'logical' decisions about which formulae should be selected, dependent on interaction between the user and the machine. Nowhere else are these advantages more useful than in the field of computer graphics. However, the demands on computer power (both speed and storage capacity) are enormous and this is why graphics programs used for computer aided design (CAD) have usually had to run on the world's most advanced machines  typically, 32 and 48bit machines with ultrafast parallel processors. These machine code programs are also assisted by special hardware for fast number crunching and display processing. No wonder then the scarcity of graphics programs written for eightbit machines in general and home computers in particular. But although CAD seems far beyond their power capability, various programs for fun and education have been devised and our articles will attempt to describe 
some of the concepts used in 3D plotting.
PROJECT OUTLINEThe emphasis here will be on modelling shapes and objects using mathematical functions rather than the plotting of individual points in space. With the choice of a suitable system of coordinates, geometrical models can easily be rotated, translated or scaled in size without the need for matrix transformations (see Part 2 in our next issue). This rather unusual approach can produce quite a variety of symmetric figures in perspective.Anticipating three different kinds of reader, it seemed best to include a reasonably selfcontained 3D plotting program with full listing. Maths wizards with Basic experience will probably 'eat their way' through the routines and so also may the reader who is not interested in the maths and who merely wishes to key in the program and have some fun following the examples given. Having dealt with these two extremes, the rest of the [article] 
has been written from the point of
view of those wishing to learn, use
and further develop the main concept
used in the program and examples.
(By the way, the full derivation of the
mathematical formulae has been
extracted from the main text and
dumped in the Appendix, together
with a suggested list for further reading.) Let's now enter the main
program and, once that's been
successfully achieved, try some of the
parameter examples shown.
LOOKING INTO PERSPECTIVEPerspective projection can now be introduced by way of the 'floor' plotting subroutine at line 520; it's also illustrated by further examples shown in the Perspective Projection diagram.There are a number of basic assumptions made at this point: 1. The origin of the rectangular coordinate system is in the observer's eye. 2. All distances are expressed in millimetres (other units can easily be 
adopted as long as they are used
consistently throughout). 3. Millimetres (mm) are converted to pixels only in the lines of the program which use DRAW and PLOT statements. 4. The number of pixels/mm (p) for the Spectrum graphics window on a 12inch TV is assumed to be equal to 1.41 (255/180 = 1.41). This nominal value is used throughout. 5. The screen window on your TV should first be plotted using the sub routine at line 450, and then measured with a ruler so that the real size in millimetres can be entered in line 50. If your screen is around 12 inches then line 50 values are correct and program execution can be continued by pressing the CONTinue key. The centre of the screen is at: x=0, y=0, and z=d=500mm (ie. with your eye looking straight at the screen from the distance of half a metre). 6. The object can be placed anywhere within the viewing pyramid which is solely determined by the ratio of the screen size and the eye screen distance (d). A large screen and a short eyescreen distance will result in the rapidly diverging pyramid, ie. similar to a wide aperture in a photographic lens. Lines 290 to 360 limit or 'clip' the parts of the 3D object which fall outside the viewing pyramid. 7. The general conditions to be met for the point to lie within the viewing pyramid are (see the Appendix for a fuller explanation, equation 2a): z*w/d <= x <= z*w/d (where w is half of the screen window width in millimetres) and: z*h/d <= y <= z*h/d (where h is half of the screen window height in millimetres). The values in the program (lines 290 to 360) correspond to the viewing pyramid of d=500mm, and the Spectrum graphics window on a 12inch TV. 8. The clipping conditions in practice are slightly more complicated due to the addition of dx and dy which are incremental (vector) components corresponding to x and y increments used in the Spectrum DRAW statement. This Spectrum instruction is slightly non standard in that it only determines the length and direction of a line (what's known as a vector in maths notation) while the starting point of the vector is the pixel occupied by the last PLOT or DRAW statement. Thus, every DRAW statement must be preceded by a PLOT statement which sets the starting point. 9. Perspective projection of a point, P(x,y,z), on to the screen, P(xp, yp), is based on a simple relationship between the similar triangles, Odxp and Ozx, as shown in Figure 1 in the Appendix. After simple manipulation: xp = x*d/z (1) and:  THE 3D PLOTTING PROGRAM  

COMMENT  LISTING  
Goes to the 'draw screen window' routine at line 450. 
40 GO SUB 450: STOP
 
Prints the drawing parameters onscreen. 
50 PRINT AT 21,13;"Y=62mm";AT 11,26;"x=90mm";AT 0,13;"y=62mm";AT 11,0;"x=90mm"
 
Define the variables, p and d. 
60 LET p=1.41
 
Collect the userdefined parameters and print up a flashinh message to tell the user that the necessary calculations are being undertaken by the computer. 
80 GO SUB 520
 
Set the longitude and latitude increments in degrees. 
170 LET db=360/sb
 
Set up a FORNEXT loop, which is eventually returned by lines 420 and 430. 
190 FOR b=b0 TO 360+b0 STEP db
 
Convert the spherical coordinates (R,a,b) to cartesian coordinates (x,y,,z). 
220 LET x=R*COS (PI/180*a)*COS (PI/180*b)+x0
 
Carry out the clipping outside the viewing pyramid. 
290 IF x>z/5.6 THEN LET x=z/5.6
 
Set the perspective projections for x, y and z. 
370 LET xp=x*d/z: LET yp=y*d/z
 
Plot the projections in pixels (p=pixels/mm). 
380 PLOT xp*p+128,yp*p+87
 
Set the vector perspective projections. 
390 LET dxp=dx*d/z+x*dk: LET dyp=dy*d/z+y*dk
 
Sets the colour coded depth. 
400 LET e=ABS ((zd)/200)
 
Draws the vector projections in pixels. 
410 DRAW INK e;dxp*p,dyp*p

COMMENT  LISTING 
yp = y*dz (1)
ie. projections, xp and yp, are inversely proportional to depth, z. The perspective will now be demonstrated by way of the routine used in the program to plot the 'floor' in a wire frame fashion. In maths notation, this represents a plot of y=62mm plane as shown in the Perspective Projection diagram. Looking at the program, line by line, the following can be seen: Lines 530 and 540 define the size of the plane, ie. z (depth) between 500mm and 1100mm, and x (width) between 90mm and +90mm. Lines 550 and 560 are direct applications of equations (1), ie. perspective projections of each intersection of 'wires' in the plane, y=62=constant. Line 580 plots projections, xp and yp, expressed in pixels (multiplying with p) and sets the PLOT origin in the middle of the screen window (255 by 175) pixels. Line 590 defines the decrement of perspective scale factor, dk, as z is incremented by dz=70. This is necessary in order to work out the projected x and y decrements as a result of an increase in depth, dz. Line 600 contains the first DRAW statement which draws a line on the screen corresponding to the projection of the increment (vector), dz, through the application of dk. Line 610 resets the DRAW vector back to 580. Line 620 converts an increment in x (dx=20) to its projection, dxp. Line 640 contains the second DRAW statement and draws a projection corresponding to a dx=20 increment PLANE PLOT SUMMARY'Wire' cross sections in the 'floor' were obtained through a direct application of equations (1) and the PLOT statement. A DRAW statement is used to draw the projections of dz and dx increments, which are actually vectors since they not only have a length but also a direction in space. In fact, it wouldn't be difficult to plot a 'wireframe' of any plane. For example, the x=90 plane can be plotted by substituting y for x in the following program: 520 REM 'Right wall, x=90 plane'
 
Return the program to the beginning of the 'plotting' routine begun in lines 190 and 200. 
420 NEXT a
 
Returns the program to line 90 to collect more userdefined parameters to draw another object. 
440 GO TO 90
 
The routine called at line 40 to draw the screen window. 
450 PLOT 0,0
 
The routine called to plot the floor in perspective (wireframe plot of the y=62 plane). 
530 FOR z=d TO d+600 STEP 100
 
Sets the perspective projection of x on the screen. 
550 LET xp=x*d/z
 
Sets the perspective projection of y on the screen. 
560 LET yp=62*d/z
 
Sets the colour coded depth; ie. z=d, f=0 gives black. 
570 LET f=INT ((zd)/200)
 
Plots the projections xp and yp in pixels; 128 and 87 are pixel coordinates of the screen centre. 
580 PLOT xp*p+128,yp*p+87
 
Sets the perspective scale factor decrement as a function of dz=70. 
590 LET dk=d/(z+70)d/z
 
Draws perspective projections of a vector dz in pixels. 
600 DRAW INK f;x*dk*p,62*dk*p
 
Resets the vector to 580. 
610 PLOT xp*p+128,yp*p+87
 
Sets the perspective projection of an increment dx=20. 
620 LET dxp=20*d/z
 
Limits the draw vector to within the screen window. 
630 IF x+22.5>90 THEN LET dxp=0
 
Draws the dx projection in pixels. 
640 DRAW INK f;dxp*p,0
 
Returns the program for new values of x and y. 
650 NEXT x
 
Returns to the main program. 
670 RETURN
 

600 DRAW INK f;90*dk*p,y*dk*p Similarly, the the z=1100 plane could be plotted using the following program: 520 REM 'Back wall' Alternatively, all three planes could be combined into a 'bottomright corner of a room' by writing a main program with the three examples used as sub routines. A side view of a 'house with three floors' can easily be generated from the original floor, y=62, by adding the following lines: 517 REM 'Three floors' The analogy could be taken even further, eg. for plotting a plane under 
any orientation and, with a combination
of several planes, one could generate
'boxes' in space. It's obvious, though,
that the programs would become unmanageably complex. Based on experience so far, the 'plane plotting routine' is best recommended only for the following three cases: 1. Single 'floor' or 'wall' 2. Multiple parallel 'floors' or 'walls' 3. Single or multiple 'parallel' surfaces of which one example is given here (generated from the original 'floor' routine): 520 REM 'Sine surface 'roof', y=+40' IN PART TWOThe generation of 3D objects using spherical coordinates will explain the role of parameters in INPUT statements  some examples of which appear in Part 1.Suggestions for further reading 1. WM Newman, RF Sproull, Principles of Interactive Computer Graphics, McGrawHill, 1979 2. Nick Hampshire, Spectrum Graphics, Duckworth, 1982 3. 'Spectrum 3D Rotator', page 80, Your Computer, July 1983 
APPENDIXPERSPECTIVE TRANSFORMATIONPOINT PROJECTIONSxp/d = x/zxp = x * d/z..............(1a) x/z <= w/d x <= z * w/d..............(2a) yp/d = y/z yp = y * d/z..............(1a) y/z <= h/d y <= z * h/d..............(2a) Point transformation (Figure 1) is derived from similar triangles, Odxp and Ozx, for x; this can also be seen for y. This transformation is used to plot points using the PLOT statement. The viewing pyramid determines the 3D space in the front and back of the screen which can be used without clipping (see equations 2a). VECTOR PROJECTIONSdxp = dx * d/z + x * dkdyp = dy * d/z + y * dk...(3a) The combined (total) vector projection is shown in Figure 2. 'Vector transformation' is used with the Spectrum DRAW statement in order to draw projections of increments (vectors) dx, dy and dz. 1. Projections of dx and dy are derived in the same manner as projections of individual points (see Figure 3). dxp = dx * d/z dyp = dy * d/z............(4a) 2. The projection of dz is derived via dk. dk is defined as the decrement of the perspective scale factor (k= d/z) due to (only) an increase of z by dz: dk = (d/(z+dz))dz........(5a) Referring to Figure 4 and applying the standard point transformation (see equations 1a) for the points P1 (x1,y1,z) and P2 (x1,y1,z+dz), the following can be derived: xp1 = x1 * d/z, xp2 = x1 * d/(z+dz) yp1 = y1 * d/z, yp2 = y1 * d/(z+dz) ..........(6a) Since, dxp = xp2  xp1 = x1 * d/(z+dz)  x1*d/z = x1 * (d/(z+dz)d/z)) = x1 * dk ie. dxp (due to only dz) = x * dk dyp (due to only dz) = y * dk ..........(7a) The combined effect of all three increments, dx, dy and dz, is therefore a sum of all component projections (see equations 3a and Figure 2). The equations are now repeated for convenience: dxp(tot) = dx * d/z + x * dk dyp(tot) = dy * d/z + y * dk due to due to dx or dy dz only 
Using the 3D Plotting program and the tabulated parameter examples, this is what you should end up with on the screen. Why not have a go with some of your own parameters and see what you come up with ... 
Home  Contents  KwikPik 