This is the source code for a fractal program for the HP48G/GX handheld calculator. Obviously version 1.0 is not perfect and contains some bugs, but nevertheless it shows that the wonderfull world of fractals can be accessible even through the smallest of machines. / HPFRACT...DOCUMENTATION ORIGINALLY a word perfect 6.1 / document (.WPG) / to obtain files or add to program contact... / Email: edunn@wam.umd.edu Source Codes: Some of the codes listed below were originally written in BASIC or pseudo-code. I had to convert them all to HP's language. To some programming experts, the code may appear choppy and inefficient. It was purposely left that way so that it would resemble the original code and still be easy for a beginner to work through. If you are unfamiliar with HP language RPN (Reverse Polish Notation), then you may have problems understanding the code. Many excellent sources on RPN are available from EduCalc that explain HP language. The actually library was assembled using the program USRLIB (available through EduCalc GD1). All programs were compressed/decompressed with RFP/RFU (available through EduCalc GD9). The menu launcher was made by TBR (Title Browser). DIR HPFRACT { "SPSKI" "KOCH" "DUST" "WHIRL" "PYTHT3" "ORBIT" "JULIA" "MANDEL" "TREEE" "IFS" } { "PRINT" "SAVE" "NULLKEY" "NULLKEY" "NULLKEY" "QUIT" } { 1 1 " SELECT FRACTAL: " } TBR ch CASE 'ch==0 OR ch==-6' THEN CLEAR "THANK YOU!" KILL END 'ch==-1' THEN PICT RCL PR1 KILL END 'ch==-2' THEN PICT RCL 'IMAGE' STO CLEAR "PICT STORED AS 'IMAGE'" 1 DISP 1 FREEZE KILL END 'ch==1' THEN SWAP DROP typ CASE 'typ==1' THEN SPSKI END 'typ==2' THEN KOCH END 'typ==3' THEN DUST END 'typ==4' THEN WHIRL END 'typ==5' THEN PYTHT3 END 'typ==6' THEN ORBIT END 'typ==7' THEN JULIA END 'typ==8' THEN MANDEL END 'typ==9' THEN TREEE END 'typ==10' THEN IFS END END END END SPSKI ERASE 10 TRASH STO (0,0) ONE STO (10,0) TWO STO (5,8.66) THREE STO 0 10 XRNG 0 9 YRNG "CARPET PARAMETERS" { { "SEED" "ENTER START POINT." 1 } { "ITERATIONS" "ENTER # OF ITERATIONS." 0 } } { } { } { } IF INFORM NOT THEN { PPAR THREE TWO ONE TRASH} PURGE CLEAR HPFRACT KILL END { PT MITR} STO CLLCD { # 0h # 0h } PVIEW 0 MITR FOR j COIN3 vertex PT CASE 'vertex==1' THEN ONE MIDPOINT END 'vertex==2' THEN TWO MIDPOINT END 'vertex==3' THEN THREE MIDPOINT END END IF TRASH j THEN PT PIXON END NEXT { PPAR TRASH ONE TWO THREE PT MITR } PURGE 0 WAIT DROP HPFRACT COIN3 RAND 3 * 1 +IP MIDPOINT OBJ 'Y1' STO 'X1' STO OBJ 'Y2' STO 'X2' STO X1 X2 + 2 / Y1 Y2 + 2 / R C 'PT' STO { X1 X2 Y1 Y2 } PURGE KOCH RAD ERASE "SNOWFLAKE PARAMETERS" { { "ORDER" "ENTER LEVEL OF APPROXIMATION ( 1)" 0 } } { } { } { } IF INFORM NOT THEN CLEAR HPFRACT KILL END { P } STO 0 3 P 1 - ^ 4.4 * XRNG 0 3 P 2 - ^ 4.4 * YRNG P 3 INV ^ 'H' STO (0,0) 'PT' STO 0 'X' STO 0 'Y' STO 0 P FOR x 0 NEXT P LIST 'LIST' STO CLLCD {# 0h # 0h } PVIEW 0 P 4 ^ 1 - FOR n n 'M' STO 1 'LL' STO P 1- 0 FOR l M 4 l ^ / IP DUP LIST SWAP LL SWAP PUT 'LIST' STO 4 l ^ *M SWAP - 'M' STO 'LL' INCR DROP -1 STEP 0 'S' STO LIST OBJ 1 SWAP FOR x y CASE 'y==0' THEN 0 END 'y==1' THEN 1 END 'y==2' THEN-1 END 'y 3' THEN 0 END END 'S' STO+ NEXT X H S 3 / 3.14159265359 * COS * + 'X' STO Y H S 3 / 3.14159265359 * SIN * + 'Y' STO PT X Y R C DUP 'PT' STO LINE NEXT { M H LL T LIST PT S X Y } PURGE PICT RCL {# 5Fh # 5h } "KOCH" 1 GROB REPL {# 5Fh # Ch } "ORDER = " P + 1 GROB REPL PICT STO 'P' PURGE 0 WAIT CLEAR HPFRACT DUST ERASE "CANTOR SET" { {"ORDER" "ENTER LEVEL OF APPROXIMATION ( 1)" 0 } { "THICKNESS" "ENTER BOX WIDTH" 0 } } { } { } { } IF INFORM NOT THEN CLEAR HPFRACT KILL END { P B } STO { 0 1 } ARRY2 'AA' STO { 0 0 } ARRY2 'BB' STO -.3 1.3 XRNG -.3 B P * .3 + YRNG { # 0h # 0h } PVIEW (0,0) (1,0) LINE (1,0) 1 B NEG R C DUP 'PT' STO LINE PT 0 B NEG R C DUP 'PT' STO LINE PT (0,0) LINE 1 P FOR p 1 2 p ^ FOR I AA I GET 3 / BB SWAP I SWAP PUT 'BB' STO 1 1 AA I GET - 3 / - BB SWAP 2 p ^ I + SWAP PUT 'BB' STO NEXT 2 2 p 1 + ^ FOR J BB J GET AA SWAP J SWAP PUT 'AA' STO NEXT 1 2 p 1 + ^ FOR K AA K GET B p * R C AA K 1 + GET B p * R C LINE AA K GET B p * R C AA K GET B p * B - R C LINE AA K 1 + GET B p * R C AA K 1 + GET B p * B - R C LINE 2 STEP NEXT { PT PPAR BB AA B P } PURGE 0 WAIT CLEAR HPFRACT ARRY2 1 2 P 1 + ^ 2 - FOR x 0 + NEXT WHIRL RAD ERASE "ROTATING AND REDUCING POLYGON" { { "ORDER" "SELECT NUMBER OF SIDES" 0 } {"DISPLACEMENT" "ENTER ROTATION ANGLE (RADIANS)" 0 } { "ITERATIONS" "ENTER # OF ITERATIONS" 0 } } { } { } { } IF INFORM NOT THEN CLEAR HPFRACT KILL END 4 3 / NEG 4 3 / XRNG -1 1 YRNG { P B MITR }STO { } 1 P 1 + FOR x 0 + NEXT DUP 'X' STO 'Y' STO 1 2 P / - 3.14159265359 * 'A' STO A SIN A B + SIN B SIN + / 'C' STO 0 P FOR K 2 K * 1 + 3.14159265359 * P / 'T' STO X K 1 + T SIN PUT 'X' STO Y K 1 + T COS PUT 'Y' STO NEXT { # 0h # 0h } PVIEW 1 MITR FOR N X 1 GET Y 1 GET R C 'PT' STO 2 P 1 + FOR L PT X L GET Y L GET R C DUP 'PT' STO LINE NEXT 1 P 1 + FOR M X M GET 'Z' STO X Z B COS * Y M GET B SIN * - C * M SWAP PUT 'X' STO Y Z B SIN *Y M GET B COS * + C * M SWAP PUT 'Y' STO NEXT NEXT { PPAR P B A C X Y T PT Z MITR } PURGE 0 WAIT CLEAR HPFRACT PYTHT3 RAD ERASE -2.5 5.5 XRNG -2 4 YRNG "PYTHAGORAS TREE" { { "REFERENCE " "ENTER ANGLE (IN RADIANS)" 0 } } { } { } { } IF INFORM NOT THEN CLEAR HPFRACT KILL END { F } STO 32 'P' STO { } 1 P FOR x 0 + NEXT DUP DUP DUP DUP 'X2' STO 'Y2' STO 'U2' STO 'V2' STO 'S' STO F COS 'C' STO F SIN 'SS' STO .005 'EPS' STO C SS * NEG 'A1' STO C 2 ^ 'A2' STO A1 A2 + 'B1' STO A2 A1 - 'B2' STO B2 'C1' STO 1 B1 - 'C2' STO 1 A1 - 'D1' STO 1 A2 - 'D2' STO { 0 0 1 0 1 2 } { X1 Y1 U1 V1Q J } STO S 1 1 PUT 'S' STO { # 0h # 0h } PVIEW (0,0) (1,0) LINE (1,0) (1,-1) LINE (1,-1) (0,-1) LINE (0,-1) (0,0) LINE SUB130 SUB130 Q J + 'M' STO U1 X1 - 'X' STO V1 Y1 - 'Y' STO A1 X * X1 + A2 Y * - 'XA' STO Y1 A2 X * + A1 Y * + 'YA' STO X1 B1 X * + B2 Y * - 'XB' STO Y1 B2 X * + B1 Y * + 'YB' STO X2 M X1 C1 X * + C2 Y * - PUT 'X2' STO Y2 M Y1 C2 X * + C1 Y * + PUT 'Y2' STO U2 M X1 D1 X * + D2 Y * - PUT 'U2' STO V2 M Y1 D2 X * + D1 Y * + PUT 'V2' STO X X * Y Y * + 'SS' STO S M 1 PUT 'S' STO X1 Y1 R C XA YA R C DUP 'PT' STO LINE PT XB YB R C DUP 'PT' STO LINE PT U1 V1 R C DUP 'PT' STO LINE PT U2 M GET V2 M GET R C DUP 'PT' STO LINE PT X2 M GET Y2 M GET R C DUP 'PT' STO LINE PT X1 Y1 R C LINE XA 'X1' STO YA 'Y1' STO XB 'U1' STO YB 'V1' STO IF P M == SS EPS < OR THEN SUB250 END J 1 + 'J' STO SUB130 SUB250 2 'K' STO WHILE IFERR S M K - GET THEN 1 END 0 == REPEAT K 1 + 'K' STO END IF M K == THEN PICT RCL { # 5Ch # 2h } " = " F 2 FIX + STD 1 GROB REPL PICT STO { PT YB XB YA XA Y X M J Q V1 U1 Y1 X1 D2 D1 C2 C1 B2 B1 A2 A1 EPS SS C F S V2 U2 Y2 X2 P PPAR K } PURGE 0 WAIT CLEAR HPFRACT KILL END M K - 'Q' STO X2 Q GET 'X1' STO Y2 Q GET 'Y1' STO U2 Q GET 'U1' STO V2 Q GET 'V1' STO S S Q GET 1 - Q SWAP PUT 'S' STO 1 'J' STO IFS ERASE "SELECT IFS TYPE" { FERN BINARY CORAL CRYSTAL DRAGON FLOORR KOCH3 SPIRAL SWIRL5 TREE TRIANGLE ZIGZIG2} 1 CHOOSE x IF x NOT THEN HPFRACT KILL END DUP STEQ STRI "ENTER PARAMETERS" { { "SEED" "ENTER START POINT" 1 } { "ITERATIONS" "ENTER # OF ITERATIONS" 0 } } { } { } { } IF INFORM NOT THEN CLEAR { EQ PPAR } PURGE IFS KILL END { PT MITR} STO 20 'TRASH' STO CLLCD { # 0h # 0h } PVIEW 0 MITR FOR j EQ COIN GET FUNCT IF TRASH j THEN PT PIXON END PICT RCL { # 0h # 0h } j 1 GROB REPL PICT STO NEXT { TRASH EQ PT MITR PPAR } PURGE 0 WAIT DROP IFS FUNCT { A B C D E F} STO PT OBJ 'Y1' STO 'X1' STO X1 A * Y1 B * + E + 'X2' STO X1 C * Y1 D * + F + 'Y2' STO X2 Y2 R C 'PT' STO { A B C D E F X1 X2 Y1 Y2 } PURGE STRI STR TAIL 'STRING' STO STRING SIZE 1 - 'SZ' STO 1 SZ FOR x STRING HEAD STRING TAIL 'STRING' STO NEXT ".P" 1 SZ FOR x + NEXT OBJ OBJ DROP PMAX PMIN DEPTH LIST 'ARRY' STO { STRING SZ } PURGE COIN RAND 'R' STO ARRY 1 GET 'SUM' STO 1 'K' STO WHILE SUM R < REPEAT 'K' INCR ARRY SWAP GET 'SUM' STO+ END K { R SUM K } PURGE ARRY { } FERN { { 0 0 0 .16 0 0 } { .85 .04 -.04 .85 0 1.6 } {.2 -.26 .26 .22 0 1.6 } { -.15 .28 .26 .24 0 .44 } } FERN.P { .01 .85 .07 .07 (-5.29,0) (5.51,10) } BINARY { { .5 0 0 .5 -2.563477 -.000003 } { .5 0 0 .5 2.436544 -.000003 } { 0 -.5 .5 0 4.873085 7.563492 } } BINARY.P { .33333333 .333333333 .3333333333 (-8,-1) (8,11) } CORAL { { .307692 -.531469 -.461538 -.293706 5.401953 8.655175 } { .307692 -.076923 .153846 -.447552 -1.295248 4.15299 } { 0 .545455 .692308 -.195804 -4.893637 7.269794 } } CORAL.P { .4 .15 .45 (-8,-1) (8,11) } CRYSTAL { { .69697 -.481061 -.393939 -.662879 2.147003 10.310288 } { .090909 -.443182 .515152 -.094697 4.286558 2.925762 } } CRYSTAL.P { .747826 .252174 (-8,-1) (8,11) } DRAGON { { .824074 .281482 -.212346 .864198 -1.88229 -.110607 } { .088272 .520988 -.463889 -.377778 .78536 8.095795 } } DRAGON.P { .787473 .212527 (-8,-1) (8,11) } FLOORR { { 0 -.5 .5 0 -1.732366 3.366182 } { .5 0 0 .5 -.027891 5.014877 } { 0 .5 -.5 0 1.620804 3.310401 } } FLOORR.P { .3333333333 .3333333333 .3333333333 (-8,-1) (8,11) } KOCH3 {{ .307692 0 0 .294118 4.119164 1.604278 } { .192308 -.25882 .653864 .088235 -.068884 5.978916 } { .192308 .205882 -.653864 .088235 .66858 5.962514 } { .307692 0 0 .294118 -4.13653 1.604278 } { .384615 0 0 -.294118 -.007718 2.941176 }} KOCH3.P { .151515 .253788 .253788 .151515 .189394 (-8,-1) (8,11)} SPIRAL { {.787879 -.424242 .242424 .859848 1.758647 1.408065 } { -.121212 .257576 .151515 .05303 -6.721654 1.377236 } { .181818 -.136364 .090909 .181818 6.086107 1.568035 } } SPIRAL.P {.895652 .052174 .052174 (-8,-1) (8,11)} SWIRL5 { { .745455 -.459091 .406061 .887121 1.460279 .691072 } { -.424242 -.065152 -.175758 -.218182 3.809567 6.741476 }} SWIRL5.P { .912675 .087325 (-8,-1) (8,11) } TREE { { 0 0 0 .5 0 0 } { .42 -.42 .42 .42 0 .2 } { .42 .42 -.42 .42 0 .2 } { .1 0 0 .1 0 .2 } } TREE.P { .05 .4 .4 .15 (0,1) (0,1) } TRIANGLE { { .5 0 0 .5 0 0 } { .5 0 0 .5 0 1 } { .5 0 0 .5 1 1 } } TRIANGLE.P {.3333333333 .333333333 .3333333333 (-1,47,1.21) (2.49,1.77) } ZIGZIG2 { { -.632407 -.614815 -.54537 .659259 3.840822 1.282321 } { -.036111 .444444 .210185 .037037 2.071081 8.330552 } } ZIGZIG2.P { .888128 .111872 (-8,-1) (8,11) } MANDEL PICT PURGE (-3,-1.2) (1,1.23) PDIM { # 0h # 0h } PVIEW 1 CF 0 .96 FOR y y 1.0655 - .5464 / .6 FOR x x y R C DUP ABS 4 * 1 + SQ + 2 / (0,0) 1 15 FOR n IF DUP ABS 3 PICK > THEN 1 SF 99 'n' STO ELSE SQ 3 PICK + END NEXT DROP2 IF 1 FC?C THEN DUP PIXON CONJ PIXON ELSE DROP END .03053 STEP .03796 STEP { } PVIEW HPFRACT JULIA "JULIA PARAMETERS" { { "ITERATIONS" "ENTER NUMBER OF ITERATIONS" 0 } { "SEED" "ENTER INITIAL POINT" 1 } { "PMIN" "" 1 } { "PMAX" "" 1 } } { } { 400 (.11,.66) (-3.5,-1.25) (3.5,1.25) } DUP IF INFORM NOT THEN CLEAR HPFRACT KILL END OBJ DROP PICT PURGE { # 0h # 0h } PVIEW PMAX PMIN n c 1 c 4 * - SQ 1 + DUP IF ABS 1 THEN 2 - NEG END 2 / 1 n START c - SQ IF RAND .5 < THEN NEG END DUP DUP PIXON NEG PIXON NEXT DROP { } PVIEW HPFRACT ORBIT "ORBIT PARAMETERS" { "ITERATES:" { } "A:" "B:" "X:" "Y:" "PMIN:" "PMAX:" } { 2 0 } { 900 -.48 .935 4.1 0 (-11,-10) (14,7) } DUP IF INFORM THEN OBJ DROP PICT PURGE { # 0h # 0h } PVIEW PMAX PMIN 2 5 PICK 2 * - 3 PICK SQ DUP 3 PICK * 7 PICK 6 PICK * + SWAP 1 + / 0 a b x y c w z 0 SWAP FOR n x IF n 10 > THEN DUP y R C PIXON END 'z' STO b y * w + DUP 'x' STO a OVER * SWAP SQ DUP c * SWAP 1 + / + DUP 'w' STO z - 'y' STO NEXT { } PVIEW END HPFRACT TREEE CLLCD { 2 2.2 24 26 12 6 } WHILE "FRACTAL TREE" { {"LEFT à:" "ENTER LEFT à" 0 } { "RIGHT à:" "ENTER RIGHT à" 0 } { "LEFT :" "ENTER LEFT " 0 } { "RIGHT :" "ENTER RIGHT " 0 } { "HEIGHT:" "ENTER TRUNK HEIGHT" 0 } { "LEVELS:" "ENTER RECURSION LEVELS" 0 } } { 2 2 } 4 ROLL DUP INFORM REPEAT DUP OBJ DROP 65 ROT + R B 32 ROT - R B 2 LIST ROT 65 + R B 32 4 ROLL - R B 2 LIST LINE x1 y1 x2 y2 IF 'x2-x1==0' THEN IF 'y2>y1' THEN 90 ELSE 270 END ELSE y2 y1 - x2 x1 - / ATAN 57.2957795131 * END IF 'x1>x2' THEN 180 + END 0 0 x y height angle level x1 y1 x 'turtx' STO y 'turty' STO height 'turtr' STO 'turtx' turtt 1.74532925199E-2 * COS turtr * STO+ 'turty' turtt 1.74532925199E-2 * SIN turtr * STO+ turtx 'x1' STO turty 'y1' STO 'level' 1 STO- x y x1 y1 Dline EVAL IF 'level > 0' THEN x y x1 y1 Point EVAL 'turtt' STO 'turtt' lfang STO+ turtx turty lhf height * lfang level Generate EVAL x y x1 y1 Point EVAL 'turtt' STO 'turtt' rtang NEG STO+ x1 y1 lhf height * rtang level Generate EVAL END 0 0 0 0 0 0 0 -30 0 0 RCLF lfalp rtalp lfang rtang height level Dline Point Generate turtt turtr turtx turty lhf rhf x y x1 y1 flags -3 SF RAD # 83h # 40h BLANK PICT STO CLLCD { # 0h # 0h } PVIEW 'lhf=2^(-2/(3*lfalp))' DEFINE 'rhf=2^(-2/(3*rtalp))' DEFINE x y x1 y height + Dline EVAL x y x1 y height + Point EVAL 'turtt' STO 'turtt' lfang STO+ x1 y height + lhf height * lfang level Generate EVAL x y x1 y height + Point EVAL 'turtt' STO 'turtt' rtang NEG STO+ x1 y height + rhf height * rtang level Generate EVAL { } PVIEW flags STOF EVAL END HPFRACT END