10 PI = 3.1415926535# 20 XC = 160: YC = 100: RC = 95 25 SCREEN 0: WIDTH 80 30 SCREEN 1 31 LINE (40, 1)-(270, 85), 3, B 32 LINE (40, 1)-(50, 10) 33 LINE (270, 1)-(260, 10) 34 LINE (155, 50)-(50, 10) 35 LINE (155, 50)-(260, 10) 36 LINE (40, 80)-(120, 38) 37 LINE (270, 80)-(190, 38) 38 LINE (40, 95)-(270, 180), 3, B 39 LINE (265, 100)-(243, 127), 1, B, 21845 40 LINE (264, 101)-(244, 126), 1, B 41 LINE (262, 103)-(246, 124), 2, B 42 LOCATE 8, 16: PRINT "ENVELOPES" 43 LOCATE 14, 7: PRINT "By:" 44 LOCATE 17, 11: PRINT "Steve Dutch" 45 LOCATE 18, 11: PRINT "Natural and Applied" 46 LOCATE 19, 11: PRINT " Sciences" 47 LOCATE 20, 11: PRINT "University of Wisconsin" 48 LOCATE 21, 11: PRINT " - Green Bay" 49 LOCATE 25, 1: PRINT "Press any key to continue"; 50 U$ = INPUT$(1) 100 SCREEN 0: WIDTH 80 101 PRINT "Envelopes are families of curves that define other, usually more" 102 PRINT "complex, curves. Most students at some time or other have taken a" 103 PRINT "sheet of graph paper, connected pairs of points like x=5,y=1; x=4,y=2" 104 PRINT "and so on, with the total of x and y constant. The lines outline a curve." 105 PRINT "This is a simple example of an envelope. (The curve is actually a" 106 PRINT "parabola, and is one of the envelopes in this program.)" 107 PRINT : PRINT "The performance of machinery like aircraft is usually bounded by" 108 PRINT "limits that can be shown by curves on a graph. The area within all the limit" 109 PRINT "curves is the region of possible performance. The boundary is an envelope." 110 PRINT "When people speak of 'pushing the envelope', they are using the term" 111 PRINT "'envelope' in the mathematical sense." 112 PRINT : PRINT "To find the envelope of a family of curves, represent the curves as" 113 PRINT "parametric functions x=f(t,c), y=g(t,c). For example, our simple envelope above" 114 PRINT "is: x/a + y/c =1 (a+c=k; k constant), or x/(k-c)+y/c =1. We can write" 115 PRINT "x=t(k-c), y=c(1-t). Find the formula (df/dt)(dg/dc)-(df/dc)(dg/dt)=0." 116 PRINT "Using these formulas, eliminate c to find the envelope curve. We have" 117 PRINT "df/dc=-t, df/dt=k-c, dg/dc=1-t, dg/dt=-c, hence (k-c)(1-t)+tc =0 and" 118 PRINT "c=k(1-t)/(1+t-k). Hence x=tk(2-k)/(1+t-k) and y=k(1-t)^2/(1+t-k). After some" 119 PRINT "unexpectedly complex algebra, we get:" 120 COLOR 12 121 PRINT " 1/2 1/2" 122 PRINT " x + y = k" 123 COLOR 7 124 LOCATE 24, 1: PRINT "Press any key to continue"; 125 U$ = INPUT$(1) 200 CLS : REM MENU 201 PRINT "1 - POLYGON" 202 PRINT "2 - POLYGON WITH DIAGONALS" 203 PRINT "3 - POLYGON PINWHEEL" 204 PRINT "4 - POLYGON SPIRAL" 205 PRINT "5 - PARABOLA I (WITH DURER'S CONCHOID" 206 PRINT "6 - PARABOLA II (NEGATIVE PEDAL OF A LINE)" 207 PRINT "7 - ELLIPSE" 208 PRINT "8 - HYPERBOLA" 209 PRINT "9 - ASTEROID I" 210 PRINT "10 - ASTEROID II" 211 PRINT "11 - LIMACONS AND CARDIOIDS" 212 PRINT "12 - NEPHROID I" 213 PRINT "13 - NEPHROID II" 214 PRINT "14 - EPICYCLOID" 215 PRINT "15 - HYPOCYCLOID" 216 PRINT "16 - CYCLOID" 217 PRINT "17 - LEMNISCATE OF BERNOULLI" 218 PRINT "18 - RIGHT STROPHOID AND RELATED CURVES" 225 COLOR 3: PRINT : PRINT "NOTE - IF NOT OTHERWISE INSTRUCTED, PRESS ANY KEY AFTER DISPLAY IS" 226 PRINT "FINISHED TO RETURN TO PROGRAM" 228 COLOR 7: LOCATE 25, 1: INPUT "DESIRED OPTION "; OP$ 285 OP = INT(VAL(OP$)): IF OP < 1 OR OP > 18 THEN 9080 290 ON OP GOTO 300, 400, 500, 600, 700, 1000, 1200, 1490, 2010, 2160, 2300, 2440, 2590, 2730, 3000, 3500, 4000, 4300 300 REM POLYGON 301 CLS : PRINT "More for fun than anything else. Star polygons are the interesting" 302 PRINT "part. The meaning of a 5-sided polygon is clear, but what is a 5/2-sided" 303 PRINT "polygon? A pentagon has vertices 360/5 degrees apart, and vertex angles of" 304 PRINT "180(5-2)/5 or 108 degrees. Logically, a 5/2-sided polygon should have vertices" 305 PRINT "360/(5/2) or 144 degrees apart, and vertex angles 180(5/2-2)/(5/2) or " 306 PRINT "36 degrees. Thus, stars fit all the definitions of regular polygons." 307 PRINT : PRINT "To draw star polygons, you have two choices. Input an integer for the number" 308 PRINT "of sides, and a value > 1 for the offset interval (i.e. join faces more than one" 309 PRINT "vertex apart) or enter a non-integer value for the number of faces." 310 PRINT : PRINT "Cases where the number of sides and the offset have common factors result" 311 PRINT "in somewhat degenerate cases. 6,2 results in the familiar Star of David, which" 312 PRINT "is two overlapping equilateral triangles. Case 4,2 results in an eight-" 313 PRINT "pointed star that is a common motif in the Middle East. It consists of" 314 PRINT "two overlapping squares." 315 PRINT : INPUT "NUMBER OF SIDES (DEFAULT = 3)"; NS$ 316 NS = VAL(NS$): IF NS = 0 THEN NS = 3 317 INPUT "OFFSET INTERVAL (DEFAULT = 1) "; OS$ 318 OS = VAL(OS$): IF OS = 0 THEN OS = 1 330 SCREEN 1 332 drawpoly = -1: I = 0 334 XA = XC + RC 336 YA = YC 338 XB = XC + RC * COS(2 * OS * PI / NS) 340 YB = YC + RC * SIN(2 * OS * PI / NS) 342 WHILE drawpoly 344 drawpoly = 0 346 I = I + 1 348 X0 = XC + RC * COS(2 * I * PI / NS) 350 Y0 = YC + RC * SIN(2 * I * PI / NS) 352 X1 = XC + RC * COS(2 * (I + OS) * PI / NS) 354 Y1 = YC + RC * SIN(2 * (I + OS) * PI / NS) 356 LINE (X0, Y0)-(X1, Y1) 358 IF ABS(X0 - XA) > 1 THEN drawpoly = -1 360 IF ABS(Y0 - YA) > 1 THEN drawpoly = -1 362 IF ABS(X1 - XB) > 1 THEN drawpoly = -1 364 IF ABS(Y1 - YB) > 1 THEN drawpoly = -1 366 IF I > 1000 THEN drawpoly = 0 368 WEND 390 a$ = INPUT$(1): GOTO 9080 400 REM POLYGON WITH DIAGONALS 405 CLS : PRINT "Mostly for fun. Draws a polygon with all diagonals" 410 PRINT : INPUT "NUMBER OF SIDES (DEFAULT = 4) "; NS$ 415 NS = INT(VAL(NS$)): IF NS < 3 THEN NS = 4 420 SCREEN 1 425 FOR I = 1 TO NS: FOR J = 1 TO NS - I 430 X0 = XC + RC * COS(2 * I * PI / NS) 435 Y0 = YC + RC * SIN(2 * I * PI / NS) 440 X1 = XC + RC * COS(2 * (I + J) * PI / NS) 445 Y1 = YC + RC * SIN(2 * (I + J) * PI / NS) 450 LINE (X0, Y0)-(X1, Y1) 455 NEXT J 460 NEXT I 490 a$ = INPUT$(1): GOTO 9080 500 REM POLYGON PINWHEEL 501 CLS : PRINT "Mostly for fun. Draws regular polygons that spiral outward" 502 PRINT : INPUT "NUMBER OF SIDES (DEFAULT = 3) "; NS$ 503 NS = INT(VAL(NS$)): IF NS < 3 THEN NS = 3 504 INPUT "RADIUS INCREASE FACTOR PER REVOLUTION (DEFAULT =1.1) "; df$ 505 df = VAL(df$): IF df < 1 THEN df = 1.1 506 INPUT "ANGLE OFFSET PER REVOLUTION (DEFAULT = 0) "; AO$ 507 AO = VAL(AO$): AO = PI * AO / 180 508 R0 = 10: DA = 2 * PI / NS: DAO = 0 520 SCREEN 1 525 WHILE R0 <= RC 530 FOR I = 1 TO NS 535 X0 = XC + R0 * COS(I * DA + DAO) 540 Y0 = YC + R0 * SIN(I * DA + DAO) 545 X1 = XC + R0 * COS((I + 1) * DA + DAO) 550 Y1 = YC + R0 * SIN((I + 1) * DA + DAO) 555 LINE (X0, Y0)-(X1, Y1) 560 NEXT I 565 R0 = R0 * df: DAO = DAO + AO 570 WEND 590 a$ = INPUT$(1): GOTO 9080 600 REM 4 - POLYGON SPIRAL 605 CLS : PRINT "Mostly for fun. Draws a continuous polygon spiral. If the number of" 606 PRINT "sides is not an integer, star patterns result." 607 PRINT : INPUT "NUMBER OF SIDES (DEFAULT = 3) "; NS$ 608 NS = VAL(NS$): IF NS = 0 THEN NS = 3 609 INPUT "RADIUS INCREASE FACTOR PER REVOLUTION (DEFAULT =1.1) "; df$ 610 df = VAL(df$): IF df < 1 THEN df = 1.1 611 INPUT "ANGLE OFFSET PER REVOLUTION (DEFAULT = 0) "; AO$ 612 DF1 = df ^ (1 / NS): AO = VAL(AO$): AO = (AO * PI / 180) / NS 613 R0 = 10: R1 = R0 * DF1 620 SCREEN 1 625 DA = 2 * PI / NS + AO: I = 0 630 WHILE RC > R1 635 X0 = XC + R0 * COS(I * DA) 640 Y0 = YC + R0 * SIN(I * DA) 645 X1 = XC + R1 * COS((I + 1) * DA) 650 Y1 = YC + R1 * SIN((I + 1) * DA) 655 LINE (X0, Y0)-(X1, Y1) 660 R0 = R1: R1 = R1 * DF1: I = I + 1 665 WEND 690 a$ = INPUT$(1): GOTO 9080 700 REM"5 - PARABOLA I" 710 CLS : PRINT "IF A SERIES OF LINES IS DRAWN SUCH THAT THE SUM OF THEIR X- AND Y-" 715 PRINT "INTERCEPTS IS CONSTANT, THE ENVELOPE OF THE LINES IS A PARABOLA." 720 PRINT : PRINT "ITS EQUATION IS: 1/2 1/2": PRINT " X + Y = CONSTANT" 730 PRINT : INPUT "SUM OF INTERCEPTS (DEFAULT = 50) "; XY$ 735 XY = VAL(XY$): IF XY = 0 THEN XY = 50 740 INPUT "INCREMENT (DEFAULT = 10) "; DX$ 745 DX = VAL(DX$): IF DX = 0 THEN DX = 10 750 PRINT : PRINT " DURER'S CONCHOID" 755 PRINT "DURER'S CONCHOID IS DRAWN BY MARKING OFF POINTS ON EACH" 760 PRINT "LINE OF THE ENVELOPE AN EQUAL DISTANCE FROM THE X-AXIS. " 765 PRINT "DESPITE THIS SIMPLE DEFINITION, THE EQUATION OF THE CURVE IS" 770 PRINT "VERY COMPLEX:": PRINT 775 PRINT " 2 2 2 2 2 2 2 2 2 2 2 2 2" 780 PRINT "2Y (X + Y )-2BY (X + Y)+Y (B -3A )-A X +2A B(X + Y)+A (A -B ) = 0" 785 PRINT : PRINT "A IS THE DISTANCE FROM THE X-AXIS; B IS THE SUM OF THE INTERCEPTS" 800 PRINT : INPUT "SHOW DURER'S CONCHOID - Y/N (DEFAULT = NO) "; DC$ 805 IF DC$ <> "Y" THEN DC$ = "N" 810 IF DC$ = "N" THEN 830 815 PRINT "INPUT DISTANCE FROM X-AXIS" 820 INPUT " (DEFAULT = SUM OF INTERCEPTS) "; D0$ 825 D0 = VAL(D0$): IF D0 = 0 THEN D0 = XY 830 REM 840 CC = 3: IF DC$ = "Y" THEN CC = 1 900 SCREEN 1 910 LINE (0, 3 * YC / 2)-(320, 3 * YC / 2), 2 920 LINE (XC / 2, 0)-(XC / 2, 200), 2 925 DCX1A = 0: DCY1A = 3 * YC / 2 - D0 * .707: DCX2A = 0: DCY2A = 3 * YC / 2 + D0 * .707 930 FOR X = -XC / 2 TO 320 - XC / 2 STEP DX: Y = XY - X 940 IF Y = 0 OR X = 0 THEN 970 950 X1 = XC / 2 + (X * Y - X * 3 * YC / 2) / Y: Y1 = 0 960 X2 = XC / 2 + (X * Y + X * YC / 2) / Y: Y2 = 200 970 LINE (X1, Y1)-(X2, Y2), CC 972 IF DC$ = "N" THEN 980 973 L = SQR(X * X + Y * Y): DX0 = X * D0 / L: DY0 = Y * D0 / L 974 DCX1B = XC / 2 + X - DX0: DCY1B = 3 * YC / 2 - DY0: DCX2B = XC / 2 + X + DX0: DCY2B = 3 * YC / 2 + DY0 975 LINE (DCX1A, DCY1A)-(DCX1B, DCY1B), 3 976 LINE (DCX2A, DCY2A)-(DCX2B, DCY2B), 3 977 DCX1A = DCX1B: DCY1A = DCY1B: DCX2A = DCX2B: DCY2A = DCY2B 980 NEXT X 990 a$ = INPUT$(1): GOTO 9080 1000 REM"6 - PARABOLA II" 1010 CLS : PRINT "THE PARABOLA IS THE NEGATIVE PEDAL OF A LINE WITH RESPECT TO A POINT" 1020 PRINT "NOT ON THE LINE. THAT IS, IF A RADIUS IS DRAWN FROM THE POINT TO THE LINE," 1030 PRINT "AND THEN PERPENDICULAR LINES DRAWN AT THE POINT OF INTERSECTION, THE" 1040 PRINT "ENVELOPE OF THE PERPENDICULAR LINES IS A PARABOLA." 1050 PRINT : INPUT "DISTANCE FROM FOCUS TO DIRECTRIX (DEFAULT = 40) "; HF$: HF = VAL(HF$) 1060 IF HF <= 0 THEN HF = 40 1070 INPUT "ANGLE INTERVAL (DEFAULT = 10) "; DA$: DA = VAL(DA$) 1080 IF DA = 0 THEN DA = 10 1090 SCREEN 1: CLS 1100 LINE (0, 195)-(319, 195), 2 1110 FOR T = 0 TO ATN(160 / HF) * 180 / PI STEP DA 1120 T0 = T * PI / 180 1130 LINE (XC, 195 - HF)-(XC + HF * TAN(T0), 195), 1 1140 LINE (XC, 195 - HF)-(XC - HF * TAN(T0), 195), 1 1150 IF T = 0 THEN 1160 1160 LINE (XC + HF * TAN(T0), 195)-(319, 195 - (160 - HF * TAN(T0)) * TAN(T0)) 1170 LINE (XC - HF * TAN(T0), 195)-(0, 195 - (160 - HF * TAN(T0)) * TAN(T0)) 1180 NEXT T 1190 a$ = INPUT$(1): GOTO 9080 1200 REM"7 - ELLIPSE" 1205 CLS : PRINT "THE ELLIPSE IS THE NEGATIVE PEDAL OF A CIRCLE WITH RESPECT TO" 1210 PRINT "AN INTERIOR POINT. IF RADII ARE DRAWN FROM THE POINT TO THE CIRCLE," 1215 PRINT "PERPENDICULARS TO THE RADII FORM THE ENVELOPE OF THE ELLIPSE." 1220 PRINT "THE INTERIOR POINT IS THE FOCUS OF THE ELLIPSE" 1230 PRINT : INPUT "INPUT ECCENTRICITY (DEFAULT =0.7) "; E$: E = VAL(E$) 1235 IF E <= 0 OR E >= 1 THEN E = .7 1240 AE = E * RC: XF = XC + AE: YF = YC 1245 INPUT "INPUT ANGLE INCREMENT (DEFAULT = 10) "; DA$: DA = VAL(DA$) 1250 IF DA <= 0 THEN DA = 10 1260 INPUT "SHOW RADII - Y/N (DEFAULT = YES) "; YN$ 1270 IF YN$ <> "N" THEN YN$ = "Y" 1280 SCREEN 1: CLS 1290 CX = XC: CY = YC: RAD = RC: CC = 3: GOSUB 19000 1300 FOR T = 0 TO 180 STEP DA 1310 a = T * PI / 180 1320 SB = AE * SIN(a) / RC: B = ATN(SB / SQR(1 - SB * SB)): C = PI - a - B 1330 X0 = XC + RC * COS(C): Y0 = YC + RC * SIN(C) 1340 X2 = XC + RC * COS(C + 2 * B): Y2 = YC + RC * SIN(C + 2 * B) 1350 LINE (X0, Y0)-(X2, Y2), 3 1360 IF YN$ = "Y" THEN LINE (X0, Y0)-(XF, YF), 1 1370 NEXT T 1380 FOR T = 0 TO -180 STEP -DA 1390 a = T * PI / 180 1400 SB = AE * SIN(a) / RC: B = ATN(SB / SQR(1 - SB * SB)): C = PI - a - B 1410 X0 = XC + RC * COS(C): Y0 = YC + RC * SIN(C) 1420 X2 = XC + RC * COS(C + 2 * B): Y2 = YC + RC * SIN(C + 2 * B) 1430 LINE (X0, Y0)-(X2, Y2), 3 1440 IF YN$ = "Y" THEN LINE (X0, Y0)-(XF, YF), 1 1450 NEXT T 1460 LINE (XF - 2, YF - 2)-(XF + 2, YF + 2), 2, BF 1470 LINE (XF - 1, YF - 1)-(XF + 1, YF + 1), 0, B 1480 a$ = INPUT$(1): GOTO 9080 1490 REM"8 - HYPERBOLA" 1495 CLS : PRINT "THE HYPERBOLA IS THE NEGATIVE PEDAL OF A CIRCLE WITH RESPECT TO" 1500 PRINT "AN EXTERIOR POINT. IF RADII ARE DRAWN FROM THE POINT TO THE CIRCLE," 1505 PRINT "PERPENDICULARS TO THE RADII FORM THE ENVELOPE OF THE HYPERBOLA." 1510 PRINT "THE EXTERIOR POINT IS THE FOCUS OF THE HYPERBOLA." 1525 PRINT : INPUT "INPUT ECCENTRICITY (DEFAULT = SQR(2) "; E$ 1530 E = VAL(E$): IF E < 1 THEN E = SQR(2) 1535 INPUT "INPUT GENERATOR CIRCLE RADIUS (DEFAULT = 40) "; GR$ 1540 GR = VAL(GR$): IF GR <= 0 THEN GR = 40 1545 AE = E * GR: XF1 = XC + AE: XF2 = XC - AE: YF = YC 1550 IF AE > 150 THEN AE = 150: GR = AE / E 1560 XF1 = XC + AE: XF2 = XC - AE: YF = YC 1570 INPUT "INPUT ANGLE INCREMENT (DEFAULT = 10) "; DA$ 1580 DA = VAL(DA$): IF DA <= 0 THEN DA = 10 1590 INPUT "SHOW RADII - Y/N (DEFAULT = NO) "; YN$ 1600 IF YN$ <> "Y" THEN YN$ = "N" 1610 INPUT "SHOW BRANCHES - LEFT/RIGHT/BOTH (DEFAULT = BOTH) "; BR$ 1620 IF BR$ <> "L" AND BR$ <> "R" THEN BR$ = "B" 1630 SCREEN 1: CLS 1640 CX = XC: CY = YC: RAD = GR: CC = 3: GOSUB 19000 1650 REM LEFT BRANCH 1660 IF BR$ = "R" THEN 1780 1670 REM SET ANGLE LIMITS 1680 LA = ATN(SQR(AE * AE - GR * GR) / GR) * 180 / PI 1690 FOR T = LA TO 360 - LA STEP DA 1700 a = T * PI / 180 1710 B = ATN(GR * SIN(a) / (AE - GR * COS(a))) 1720 X0 = XC + GR * COS(a): Y0 = YC + GR * SIN(a) 1730 X1 = X0 + 200 * SIN(B): Y1 = Y0 + 200 * COS(B) 1740 IF T < 180 THEN X1 = X0 - 200 * SIN(B): Y1 = Y0 - 200 * COS(B) 1750 LINE (X0, Y0)-(X1, Y1), 3 1760 IF YN$ = "Y" THEN LINE (X0, Y0)-(XF1, YF), 1 1770 NEXT T 1780 REM RIGHT BRANCH 1790 IF BR$ = "L" THEN 1910 1800 REM SET ANGLE LIMITS 1810 LA = ATN(SQR(AE * AE - GR * GR) / GR) * 180 / PI 1820 FOR T = LA - 180 TO 180 - LA STEP DA 1830 a = T * PI / 180 1840 B = ATN(GR * SIN(a) / (AE + GR * COS(a))) 1850 X0 = XC + GR * COS(a): Y0 = YC + GR * SIN(a) 1860 X1 = X0 + 200 * SIN(B): Y1 = Y0 - 200 * COS(B) 1870 IF T < 0 THEN X1 = X0 - 200 * SIN(B): Y1 = Y0 + 200 * COS(B) 1880 LINE (X0, Y0)-(X1, Y1), 3 1890 IF YN$ = "Y" THEN LINE (X0, Y0)-(XF2, YF), 1 1900 NEXT T 1910 REM DRAW FOCI 1920 LINE (XF2 - 2, YF - 2)-(XF2 + 2, YF + 2), 2, BF 1930 LINE (XF2 - 1, YF - 1)-(XF2 + 1, YF + 1), 0, B 1940 LINE (XF1 - 2, YF - 2)-(XF1 + 2, YF + 2), 2, BF 1950 LINE (XF1 - 1, YF - 1)-(XF1 + 1, YF + 1), 0, B 1960 REM DRAW ASYMPTOTES 1970 LX = 100 * GR / SQR(AE * AE - GR * GR) 1980 LINE (XC - LX, YC - 100)-(XC + LX, YC + 100), 2 1990 LINE (XC + LX, YC - 100)-(XC - LX, YC + 100), 2 2000 a$ = INPUT$(1): GOTO 9080 2010 REM"9 - ASTEROID I" 2020 CLS : SCREEN 0: WIDTH 80: PRINT "ASTEROID IS THE ENVELOPE OF ELLIPSES WHOSE MAJOR AND MINOR": PRINT "AXES HAVE A CONSTANT SUM" 2030 PRINT : PRINT "ITS EQUATION IS: 2/3 2/3": PRINT " X + Y = 1" 2040 PRINT : INPUT "AXIS LENGTH INCREMENT (DEFAULT =10) "; DL$ 2050 DL = VAL(DL$): IF DL <= 0 OR DL > RC THEN DL = 10 2060 SCREEN 1: CLS : LINE (XC, YC - RC)-(XC, YC + RC): LINE (XC - RC, YC)-(XC + RC, YC) 2070 FOR a = 0 TO RC STEP DL: B = RC - a: X0 = a: Y0 = 0 2080 FOR T = 0 TO .52 * PI STEP .02 * PI 2090 X1 = a * COS(T): Y1 = B * SIN(T) 2100 LINE (XC + X0, YC + Y0)-(XC + X1, YC + Y1): LINE (XC - X0, YC + Y0)-(XC - X1, YC + Y1) 2110 LINE (XC + X0, YC - Y0)-(XC + X1, YC - Y1): LINE (XC - X0, YC - Y0)-(XC - X1, YC - Y1) 2120 X0 = X1: Y0 = Y1 2130 NEXT T 2140 NEXT a 2150 a$ = INPUT$(1): GOTO 9080 2160 REM"10 - ASTEROID II" 2170 CLS : PRINT "ASTEROID AS THE ENVELOPE OF A LINE OF CONSTANT LENGTH" 2180 PRINT "SLIDING ALONG TWO PERPENDICULAR LINES (GLISSETTE)" 2190 PRINT : PRINT "ITS EQUATION IS: 2/3 2/3": PRINT " X + Y = 1" 2200 PRINT : INPUT "INPUT ANGLE INCREMENT IN DEGREES (DEFAULT = 10) "; a$ 2210 a = VAL(a$): IF a <= 0 THEN a = 10 2220 SCREEN 1: CLS : LINE (XC, YC - RC)-(XC, YC + RC): LINE (XC - RC, YC)-(XC + RC, YC) 2230 FOR I = 0 TO 90 STEP a 2240 LINE (XC + RC * COS(I * PI / 180), YC)-(XC, YC - RC * SIN(I * PI / 180)) 2250 LINE (XC + RC * COS(I * PI / 180), YC)-(XC, YC + RC * SIN(I * PI / 180)) 2260 LINE (XC - RC * COS(I * PI / 180), YC)-(XC, YC - RC * SIN(I * PI / 180)) 2270 LINE (XC - RC * COS(I * PI / 180), YC)-(XC, YC + RC * SIN(I * PI / 180)) 2280 NEXT I 2290 a$ = INPUT$(1): GOTO 9080 2300 REM"11 - LIMACONS AND CARDIOIDS" 2305 CLS : PRINT "LIMACONS AND CARDIOIDS ARE FORMED BY ROLLING A CIRCLE AROUND A FIXED" 2310 PRINT "CIRCLE OF EQUAL RADIUS. A POINT ATTACHED TO THE ROLLING CIRCLE" 2315 PRINT "TRACES OUT THE CURVE. THE CURVE CAN ALSO BE TRACED OUT AS AN" 2320 PRINT "ENVELOPE OF CIRCLES CENTERED ON A FIXED CIRCLE AND PASSING THROUGH A" 2325 PRINT "FIXED POINT." 2335 PRINT : INPUT "INPUT RADIUS RATIO (DEFAULT = 1) "; RR$: RR = VAL(RR$) 2340 IF RR <= 0 THEN RR = 1 2345 INPUT "INTERVAL (DEFAULT = 10) "; DA$: DA = VAL(DA$) 2350 IF DA = 0 THEN DA = 10 2355 SCREEN 1: CLS 2360 CX = XC: CY = YC: CC = 2: RAD = RC / (1.5 + RR): IF RR < 1 THEN RAD = RC / (2 + RR / 2) 2370 GOSUB 19000 2380 XP = XC - RAD * RR: YP = YC: R1 = RAD 2390 FOR T1 = 0 TO 360 STEP DA: T0 = T1 * PI / 180 2400 CX = XC + R1 * COS(T0): CY = YC + R1 * SIN(T0) 2410 RAD = SQR((CX - XP) ^ 2 + (CY - YP) ^ 2): CC = 3: GOSUB 19000 2420 NEXT T1 2430 a$ = INPUT$(1): GOTO 9080 2440 REM"12 - NEPHROID I" 2445 CLS : PRINT "A NEPHROID IS THE CURVE TRACED OUT BY A POINT ON THE CIRCUMFERENCE" 2450 PRINT "OF A ROLLING CIRCLE AS IT ROLLS AROUND A FIXED CIRCLE WITH A RADIUS" 2455 PRINT "TWICE AS LARGE.": PRINT : PRINT "IT CAN ALSO BE CONSTRUCTED BY DRAWING A SERIES OF" 2460 PRINT "CIRCLES CENTERED ON THE FIXED CIRCLE, AND TANGENT TO A DIAMETER OF IT." 2475 PRINT : INPUT "ANGLE INTERVAL (DEFAULT = 10) "; DA$: DA = VAL(DA$) 2480 IF DA = 0 THEN DA = 10 2485 SCREEN 1: CLS 2490 CC = 2: CX = XC: CY = YC: RAD = 2 * RC / 3: GOSUB 19000 2495 LINE (CX, CY - RAD)-(CX, CY + RAD), CC 2500 R1 = RAD: CC = 3 2510 FOR T1 = 0 TO 90 STEP DA: T0 = T1 * PI / 180 2520 CX = XC + R1 * COS(T0): CY = YC + R1 * SIN(T0): RAD = R1 * COS(T0): GOSUB 19000 2530 CX = XC + R1 * COS(T0): CY = YC - R1 * SIN(T0): RAD = R1 * COS(T0): GOSUB 19000 2540 CX = XC - R1 * COS(T0): CY = YC - R1 * SIN(T0): RAD = R1 * COS(T0): GOSUB 19000 2550 CX = XC - R1 * COS(T0): CY = YC + R1 * SIN(T0): RAD = R1 * COS(T0): GOSUB 19000 2560 NEXT T1 2570 LINE (CX, CY - RAD)-(CX, CY + RAD), CC 2580 a$ = INPUT$(1): GOTO 9080 2590 REM"13 - NEPHROID II" 2595 CLS : PRINT "A NEPHROID IS THE CURVE TRACED OUT BY A POINT ON THE CIRCUMFERENCE" 2600 PRINT "OF A ROLLING CIRCLE AS IT ROLLS AROUND A FIXED CIRCLE WITH A RADIUS" 2605 PRINT "TWICE AS LARGE.": PRINT : PRINT "IT CAN ALSO BE CONSTRUCTED BY LOCATING POINTS ON A" 2610 PRINT "DIAMETER OF THE FIXED CIRCLE, MEASURING THE DISTANCE TO THE CENTER" 2615 PRINT "OF THE CIRCLE, AND DRAWING A LINE OF THE SAME LENGTH TO THE" 2620 PRINT "EDGE OF THE CIRCLE." 2625 PRINT : INPUT "ANGLE INTERVAL (DEFAULT = 5) "; DA$: DA = VAL(DA$) 2630 IF DA = 0 THEN DA = 5 2635 SCREEN 1: CLS 2640 LINE (0, YC)-(319, YC), 2: LINE (XC, YC - 3)-(XC, YC + 3), 2 2645 CX = XC: CY = YC: RAD = 80: CC = 2: GOSUB 19000 2650 FOR T = 0 TO ATN(SQR(320 ^ 2 - RAD ^ 2) / RAD) STEP DA * PI / 180 2660 R = RAD / (2 * COS(T)) 2670 LINE (XC + R, YC)-(XC + RAD * COS(T), YC + RAD * SIN(T)) 2680 LINE (XC + R, YC)-(XC + RAD * COS(T), YC - RAD * SIN(T)) 2690 LINE (XC - R, YC)-(XC - RAD * COS(T), YC + RAD * SIN(T)) 2700 LINE (XC - R, YC)-(XC - RAD * COS(T), YC - RAD * SIN(T)) 2710 NEXT T 2720 a$ = INPUT$(1): GOTO 9080 2730 REM"14 - EPICYCLOID" 2735 CLS : PRINT "AN EPICYCLOID IS THE CURVE TRACED OUT BY A POINT ON A ROLLING CIRCLE AS IT": PRINT "ROLLS AROUND ANOTHER FIXED CIRCLE. IF THE FIXED CIRCLE HAS A RADIUS" 2740 PRINT "N TIMES THAT OF THE ROLLING CIRCLE, THE CURVE WILL HAVE N LOBES.": PRINT "IF N = 1 THE CURVE IS A CARDIOID, IF N = 2 IT IS A NEPHROID." 2745 PRINT : PRINT "IT IS ALSO POSSIBLE TO CONSTRUCT AN EPICYCLOID AS AN ENVELOPE. DRAW A LINE": PRINT "FROM A POINT AT AZIMUTH A ON A CIRCLE TO AZIMUTH (N+1)A. THE ENVELOPE" 2750 PRINT "OF LINES IS AN EPICYCLOID OF N LOBES." 2755 PRINT : PRINT "IF N IS LARGE, THE CONSTRUCTION CAN BE MESSY. THUS, IT IS ADVISABLE TO SHOW": PRINT "ONLY THE NECESSARY PART OF EACH LINE FOR LARGE N." 2770 PRINT : INPUT "ANGLE INTERVAL (DEFAULT = 10) "; DA$: DA = VAL(DA$) 2775 IF DA = 0 THEN DA = 10 2780 INPUT "NUMBER OF LOBES (DEFAULT = 1) "; NL$: NL = VAL(NL$) + 1 2785 IF NL < 2 THEN NL = 2 2790 PRINT "SHOW ALL LINES - Y/N? (DEFAULT = NO) ": SH$ = INPUT$(1) 2795 IF SH$ <> "Y" THEN SH$ = "N" 2800 SCREEN 1: CLS 2810 CX = XC: CY = YC: RAD = RC: CC = 3: GOSUB 19000 2820 FOR T = 0 TO 360 STEP DA 2830 X0 = XC + RC * COS(T * PI / 180): Y0 = YC + RC * SIN(T * PI / 180) 2840 X1 = XC + RC * COS(T * NL * PI / 180): Y1 = YC + RC * SIN(T * NL * PI / 180) 2850 LINE (X0, Y0)-(X0 + (X1 - X0) / (NL + 1), Y0 + (Y1 - Y0) / (NL + 1)) 2860 IF SH$ = "Y" THEN LINE (X0 + (X1 - X0) / (NL + 1), Y0 + (Y1 - Y0) / (NL + 1))-(X1, Y1), 1 2870 NEXT T 2880 a$ = INPUT$(1): GOTO 9080 3000 REM HYPOCYCLOIDS 3005 CLS : PRINT "A HYPOCYCLOID IS THE CURVE TRACED OUT BY A POINT ON A ROLLING CIRCLE AS IT" 3007 PRINT "ROLLS AROUND THE INSIDE OF ANOTHER FIXED CIRCLE. IF THE FIXED CIRCLE HAS A" 3010 PRINT "RADIUS N TIMES THAT OF THE ROLLING CIRCLE, THE CURVE WILL HAVE N CUSPS." 3015 PRINT : PRINT "IT IS ALSO POSSIBLE TO CONSTRUCT A HYPOCYCLOID AS THE ENVELOPE SWEPT OUT" 3020 PRINT "BY THE DIAMETER OF A CIRCLE ROLLING INSIDE THE FIXED CIRCLE. IN THIS CASE THE" 3025 PRINT "ROLLING CIRCLE HAS RADIUS 2/N TIMES THAT OF THE FIXED CIRCLE." 3100 XO = 160: YO = 90: RO = 80 3140 PRINT : INPUT "INPUT NUMBER OF CUSPS "; N$ 3145 N = VAL(N$) 3147 IF N <= 0 THEN 3140 3150 RI = RO * 2 / N 3160 SCREEN 1: CLS 3170 X0 = XO + RO: Y0 = YO 3180 FOR T = 0 TO 2 * PI STEP .01 3190 X1 = XO + RO * COS(T): Y1 = YO - RO * SIN(T) 3200 LINE (X0, Y0)-(X1, Y1), 3 3210 X0 = X1: Y0 = Y1 3220 NEXT T 3230 REM NOW DRAW HYPOCYCLOID AS ENVELOPE OF DIAMETER OF ROLLING CIRCLE 3240 DR = RO - RI: T = 0: XD1 = 0: XD2 = 0 3250 TSTEP = PI / (10 * N) 3260 STOPDRAW = 0 3270 WHILE NOT STOPDRAW 3280 XI = XO + DR * COS(T): YI = YO - DR * SIN(T) 3290 TI = T - T * RO / RI 3300 IF T > 0 AND T < 50 * PI THEN STOPDRAW = -1 3310 IF ABS(SIN(T)) > .005 THEN STOPDRAW = 0 3320 IF COS(T) < .995 THEN STOPDRAW = 0 3330 IF ABS(SIN(TI)) > .01 THEN STOPDRAW = 0 3340 IF ABS(COS(TI)) < .995 THEN STOPDRAW = 0 3350 XD1 = XI + RI * COS(TI): YD1 = YI - RI * SIN(TI) 3360 XD2 = XI - RI * COS(TI): YD2 = YI + RI * SIN(TI) 3370 LINE (XD1, YD1)-(XD2, YD2), 3 3380 T = T + TSTEP 3390 WEND 3400 a$ = INPUT$(1): GOTO 9080 3500 REM CYCLOIDS 3505 CLS : PRINT "A CYCLOID IS THE CURVE TRACED OUT BY A POINT ON A ROLLING CIRCLE AS IT" 3507 PRINT "ROLLS ALONG A STRAIGHT LINE." 3515 PRINT : PRINT "IT IS ALSO POSSIBLE TO CONSTRUCT A CYCLOID AS THE ENVELOPE SWEPT OUT" 3520 PRINT "BY THE DIAMETER OF A CIRCLE ROLLING ALONG A STRAIGHT LINE." 3525 PRINT : PRINT "PRESS ANY KEY TO CONTINUE" 3530 U$ = INPUT$(1) 3600 Y = 120: R = 30 3605 SCREEN 1 3610 LINE (0, Y)-(320, Y) 3630 FOR T = 0 TO 4 * PI STEP PI / 20 3640 X = R * T 3650 X1 = X + R * SIN(T): Y1 = Y - R - R * COS(T) 3660 X2 = X - R * SIN(T): Y2 = Y - R + R * COS(T) 3670 REM SIN & COS SWITCHED TO GIVE PI/2 PHASE SHIFT 3680 LINE (X1, Y1)-(X2, Y2) 3690 NEXT T 3700 U$ = INPUT$(1): GOTO 9080 4000 REM LEMNISCATE OF BERNOULLI 4005 CLS : PRINT "Construct a rectangular hyperbola (e ="; CHR$(251); "2). From each point on" 4010 PRINT "the hyperbola, construct a circle passing through the center of the" 4015 PRINT "hyperbola. The circles outline the Lemniscate of Bernoulli." 4020 PRINT : PRINT "PRESS ANY KEY TO CONTINUE" 4025 U$ = INPUT$(1) 4030 SCREEN 1 4035 XC = 160: YC = 95: R0 = 50 4040 X0 = R0: Y0 = 0 4045 FOR X = R0 TO SQR(YC * YC + R0 * R0) 4050 Y = SQR(X * X - R0 * R0) 4055 LINE (XC + X0, YC + Y0)-(XC + X, YC + Y), 2 4060 LINE (XC + X0, YC - Y0)-(XC + X, YC - Y), 2 4065 LINE (XC - X0, YC + Y0)-(XC - X, YC + Y), 2 4070 LINE (XC - X0, YC - Y0)-(XC - X, YC - Y), 2 4075 X0 = X: Y0 = Y 4080 NEXT X 4084 X0 = R0: Y0 = 0 4090 FOR Y = 0 TO YC STEP 5 4095 X = SQR(Y * Y + R0 * R0) 4100 RAD = SQR(X * X + Y * Y) 4105 CX = XC + X: CY = YC + Y: CC = 3 4110 GOSUB 19000 4115 CX = XC - X: CY = YC + Y 4120 GOSUB 19000 4125 CX = XC - X: CY = YC - Y 4130 GOSUB 19000 4135 CX = XC + X: CY = YC - Y 4140 GOSUB 19000 4145 NEXT Y 4150 U$ = INPUT$(1): GOTO 9080 4300 REM RIGHT STROPHOID, ETC. 4305 CLS : PRINT "A variety of interesting curves result from circles centered on a parabola." 4310 PRINT "If the circles pass through the focus, the curve is a straight line. Recall" 4315 PRINT "that a parabola is the locus of points equidistant from a point and a line." 4320 PRINT "The line is called the DIRECTRIX" 4325 PRINT : PRINT "If the circles pass through the vertex, the curve is the CISSOID OF DIOCLES." 4330 PRINT : PRINT "If the circles pass through the intersection of the axis and the directrix," 4335 PRINT "the curve is the RIGHT STROPHOID." 4340 PRINT : PRINT "If the circles pass through a point on the axis, the same distance beyond" 4345 PRINT "the directrix as the focus, the curve is the TRISECTRIX OF MACLAURIN." 4350 selectcurve: 4355 LOCATE 14, 1: PRINT "Type in the curve you want to display:" 4360 PRINT " 1 - DIRECTRIX" 4365 PRINT " 2 - CISSOID OF DIOCLES" 4370 PRINT " 3 - RIGHT STROPHOID" 4375 PRINT " 4 - TRISECTRIX OF MACLAURIN" 4380 PRINT : INPUT "Select Curve "; C$ 4385 C = INT(VAL(C$)): IF C < 1 OR C > 4 THEN GOTO selectcurve 4390 CLS : SCREEN 1 4395 XC = 140: YC = 95: RF = 25 4400 X0 = XC - RF: Y0 = 0 4405 FOR Y = 0 TO YC 4410 X = RF * (Y / RF) * (Y / RF) / 4 + XC - RF 4415 LINE (X0, YC + Y0)-(X, YC + Y), 2 4420 LINE (X0, YC - Y0)-(X, YC - Y), 2 4425 X0 = X: Y0 = Y 4430 NEXT Y 4435 LINE (XC - 2 * RF, 0)-(XC - 2 * RF, 190), 1 4440 IF C = 1 THEN XP = XC 4445 IF C = 2 THEN XP = XC - RF 4450 IF C = 3 THEN XP = XC - 2 * RF 4455 IF C = 4 THEN XP = XC - 4 * RF 4460 FOR Y = 0 TO YC STEP 3 4465 X = RF * (Y / RF) * (Y / RF) / 4 + XC - RF 4470 RAD = SQR((X - XP) * (X - XP) + Y * Y) 4475 CX = X: CY = YC + Y: CC = 3 4480 GOSUB 19000 4485 CX = X: CY = YC - Y: CC = 3 4490 GOSUB 19000 4495 NEXT Y 4500 U$ = INPUT$(1): GOTO 9080 9080 REM END 9090 SCREEN 0: WIDTH 80: CLS 9900 PRINT "DO SOME MORE - Y/N ": YN$ = INPUT$(1) 9910 IF YN$ = "Y" THEN 200 9920 IF YN$ = "y" THEN 200 9930 SCREEN 0: WIDTH 80: KEY ON 9990 END 19000 REM DRAW CIRCLES 19005 IF ABS(RAD) > .5 THEN 19015 19010 PSET (CX, CY), CC: GOTO 19070 19015 STP = 1 / RAD: IF STP < .02 * PI THEN STP = .02 * PI 19020 X0 = RAD: Y0 = 0: FOR T = 0 TO .52 * PI STEP STP 19030 X1 = RAD * COS(T): Y1 = RAD * SIN(T) 19040 LINE (CX + X0, CY + Y0)-(CX + X1, CY + Y1), CC: LINE (CX - X0, CY + Y0)-(CX - X1, CY + Y1), CC 19050 LINE (CX + X0, CY - Y0)-(CX + X1, CY - Y1), CC: LINE (CX - X0, CY - Y0)-(CX - X1, CY - Y1), CC 19060 X0 = X1: Y0 = Y1: NEXT T 19070 RETURN