\Fractals
BANNER.C
Path: unixg.ubc.ca!vanbc.wimsey.com!scipio.cyberstore.ca!math.ohio-state.edu!howland.reston.ans.net!torn!hermes.acs.ryerson.ca!jupiter!aaab From: aaab@jupiter.scs.Ryerson.CA (Al Aab - CNED/W94) Newsgroups: bit.listserv.frac-l Subject: A fractal banner listing in Borland C Date: 7 Dec 1994 12:20:37 GMT Organization: School of Computer Science, Ryerson Polytechnic University Lines: 395 Message-ID: <3c49al$1eae@hermes.acs.ryerson.ca> NNTP-Posting-Host: jupiter.scs.ryerson.ca Summary: a frctal banner in C Keywords: listing, C X-Newsreader: TIN [version 1.2 PL2] /* barnsley 15 june 94 4p20 ========= (c)copyright 1994 al aab ============= Program : A banner gnerator. A peano curve as modified by, probabley, professor Barnsley. A surface filler. One contiuous nonselftouching curve per line. Wrote this version after its predecessor, which is based on Hilbert curve. N.B. Compile w Borland C. ========================================================================== */ #include#include #include #include #include #include // --------------------------------------------------------------------------- #define maxNAMElen 11 // characters PER line if basic VGA resolution of 640 pixels across. #define char_bios 0xffa6 #define MAX_NUM_OF_LYNES 7 #define INTERLINE_GAP 19 #define Y out_ltr_Y_position-INTERLINE_GAP #define UP ( linerel( 0,-VV ) ) #define DN ( linerel( 0,+VV ) ) #define RT ( linerel( +HH,0 ) ) #define LT ( linerel( -HH,0 ) ) // --------------------------------------------------------------------------- int xmax, ymax, NAMElen, l=2, HH=l,VV=l, o=3, x1=0, x2=l*2, x3=100, y1=0, y2=x2, y3=100, yy, YY, mini_width=3*l, letter_times_8, letter_times_8_times_y, width=26*l, biggestNAMElen=0, out_ltr_X_position=mini_width, out_ltr_Y_position=width + INTERLINE_GAP , parity_index ; unsigned size; unsigned char *U,*D,*two_units,*U_unit,*D_unit, bios_buf[128*8], letter ; char NAME[MAX_NUM_OF_LYNES][1 + maxNAMElen]; // maxNAMElen being 10 characters for a basic VGA screen of 640 picels across. // ------------------------ declare sub prototypes ----------------------------------------- void select_parity(); void stamp( unsigned char letter); void stamp_prepare(); void draw_bx(int); void barn_RU(); void barn_LD(); void barn_LU(); void barn_RD(); int even(int n); void stamp_upper_row(); void stamp_leftthand_cols(); void stamp_prepare(); void prepare_two_units(); void tile_screen_w_background(); void tile_screen_w_foreground(); // ======================================================== sub defs ========= int bit_value( unsigned char byte, int bit_pos ) { switch( bit_pos ) { case 0: return 128 & byte; case 1: return 64 & byte; case 2: return 32 & byte; case 3: return 16 & byte; case 4: return 8 & byte; case 5: return 4 & byte; case 6: return 2 & byte; case 7: return 1 & byte; default : puts( " xxxx bit_value function: "\ " bit_pos not 0 to 7. ABORTING. XXXXXXX" ); exit ( 1 ); } return 5555; } // ----------------------------- stamp() --------------------------------------- void stamp( unsigned char letter,int ltr_num) { if ( letter>127 ) { puts( "HIL banner xxxxxxxxxxx BUG xxxxxxxxxxxxxxxxxxx "\ "letter ASCII value is greater than 127.\n A B O R T I N G." ) ; exit (1); } letter_times_8=letter*8; //printf("\n\t\t\t\t\t\tline 104in stamp x=%i",getx()); YY=gety(); int pixel_byte; for (pixel_byte=0;pixel_byte<8;pixel_byte++) { yy = YY + pixel_byte*mini_width+mini_width; // YY added 10 july 94 ??????????? int letter_times_8_plus_pixel_byte; letter_times_8_plus_pixel_byte=letter_times_8+pixel_byte; int bit; for ( bit=0; bit<8; bit++) { if ( ! bit_value( bios_buf[letter_times_8_plus_pixel_byte], bit ) ) { moveto(out_ltr_X_position + mini_width*bit,yy); if (even(ltr_num)) if(even(pixel_byte)!=even(bit)) putimage(getx(),gety(),U,COPY_PUT); else putimage(getx(),gety(),D,COPY_PUT); else if(even(pixel_byte)!=even(bit)) putimage(getx(),gety(),D,COPY_PUT); else putimage(getx(),gety(),U,COPY_PUT); } } } out_ltr_X_position+=width + l; } // --------------------------------------------------------------------------- void barn_RU() { if ( o<1) return; o--; barn_RU(); RT; barn_RD(); RT; barn_RU(); UP; barn_LU(); LT; barn_LD(); LT; barn_LU(); UP; barn_RU(); RT; barn_RD(); RT; barn_RU(); o++; } // --------------------------------------------------------------------------- void barn_LU() { HH=-HH; barn_RU(); HH=-HH; } // --------------------------------------------------------------------------- void barn_RD() { VV=-VV; barn_RU(); VV=-VV; } // --------------------------------------------------------------------------- void barn_LD() { VV=-VV;HH=-HH; barn_RU(); VV=-VV;HH=-HH; } // ------------------------------- setgrafics() ------------------------------ void setgrafics() { clrscr(); //XXXXXX tish te ghelsh XXXXXXXXXXXXXXXXXXXXXXXXXXX int gmode, errorcode, gdriver = DETECT; /* request auto detection */ initgraph( &gdriver, &gmode, ""); /* initialize graphics and local variables */ errorcode = graphresult(); /* read result of initialization */ if ( errorcode != grOk ) /* an error occurred */ { printf( "\nGraphics error: %s\n", grapherrormsg( errorcode ) ); printf( "Press any key to halt:" ); getch(); exit( 1 ); } setcolor( getmaxcolor() ); xmax = getmaxx(); ymax = getmaxy(); } // --------------------------------------------------------------------------- void get_input_string() { clrscr(); printf( "\n(c) Copyright Al Aab 1994.\n\n"\ "This program asks you for 7 lines, each is a string of( 7-bit ) ASCII\n" "characters. The output is a banner. The original contribution\n"\ "is that each line of the banner is one continous non selftouching "\ "curve, based on the Peano/Barnsley curve.\n\n\n"); printf( "Please type %i lines of strings (A carriage return by itself" " is an empty line.\nEvery line longer than %i characters will be truncated to %i characters.):\n", MAX_NUM_OF_LYNES, maxNAMElen, maxNAMElen); printf( "\n\n\n 12345678901\n"); int lyn; for (lyn=1;lyn<= MAX_NUM_OF_LYNES;lyn++) { printf("%i\t",lyn); gets( NAME[lyn] ); NAMElen = strlen( NAME[lyn] ); if ( NAMElen > maxNAMElen ) NAMElen=maxNAMElen; if(biggestNAMElen < NAMElen) biggestNAMElen=NAMElen; } } // --------------------------------------------------------------------------- void save_char_bios ( char near *buffer ) { movedata( char_bios , 14, _DS, (unsigned)buffer, 128*8 ); } // ........................ start main ........................ void main() { save_char_bios( bios_buf ); get_input_string(); setgrafics(); stamp_prepare(); prepare_two_units(); tile_screen_w_background(); tile_screen_w_foreground(); getch(); closegraph(); } //--------------------------------------------------------------- sub void stamp_prepare() { size=imagesize( x1, y1, x2, y2 ); D = (char *) malloc(size); cleardevice(); line( x1, y1, x2, y2 ); getimage( x1, y1, x2, y2, D ); U = (char *) malloc(size); cleardevice(); line(x1,y2,x2,y1); getimage( x1, y1, x2, y2, U ); cleardevice(); } //--------------------------------- int even(int n) { int r=n/2; return (r+r==n); } //--------------------------------- void stamp_upper_row() { moveto(0,0); int sub_unit; for ( sub_unit=0; sub_unit<9; sub_unit++ ) { putimage(getx(),gety(),D,COPY_PUT); moverel(mini_width,0); putimage(getx(),gety(),U,COPY_PUT); moverel(mini_width,0); } } //------------------------ void stamp_leftthand_cols() { moveto(0,mini_width); int sub_unit; for ( sub_unit=0; sub_unit<4; sub_unit++ ) { putimage(getx(),gety(),U,COPY_PUT); moverel(0,mini_width); putimage(getx(),gety(),D,COPY_PUT); moverel(0,mini_width); } //------ moveto(l+width,mini_width); for ( sub_unit=0; sub_unit<4; sub_unit++ ) { putimage(getx(),gety(),D,COPY_PUT); moverel(0,mini_width); putimage(getx(),gety(),U,COPY_PUT); moverel(0,mini_width); } } //-------------------------- void prepare_two_units() { cleardevice(); setcolor(getmaxcolor()); moveto(0,00); barn_RD(); RT; barn_RU(); RT; //--------------- get 2 units int two_widths; two_widths= 2*(width+l); int size=imagesize(0,0,two_widths,width); two_units=(char *) malloc(size); //getimage(0,0,two_widths,width,two_units); //--------------- clear top & lefthandside stamp_upper_row(); stamp_leftthand_cols(); //--------------- getimage of two_units in their final glory getimage(0,0,two_widths ,width,two_units); //--------------- allocate mem for U_unit & D_unit size=imagesize(0,0,width+l,width); U_unit=(char *) malloc(size); D_unit=(char *) malloc(size); //--------------- get U_unit & D_unit getimage(0,0,width+l-1,width,U_unit); getimage(l+width,0,two_widths-1,width,D_unit); putimage(0,10+width,U_unit,COPY_PUT); putimage(20+width,10+width,D_unit,COPY_PUT); cleardevice(); } //-------------------------------------- --------------------------- void tile_screen_w_background() { cleardevice(); int two_widths=2*(width+l); int width_plus_l=width+l; int row; for (row=0;row