Back to the roots - back to the jungle!
Written on June 29th 1999 by Shadow Bandit^3

Onga Bonga.. Höhlenmalerei von groß-Mungo Gorilla gefunden... Mungo gekriegt dafür viiiel Koknüsse... mit Affenmädchen dafür in Höhle gegangen.. mungo mungo gemacht - Höhle waarm - viel Fell drin... ooops... uuuhh baby... again in my world... "knot" is the key to open my cellar.. hähä... genug knüpfen lassen...

Jo Kids..... der heutige Effekt, den ich euch vorstelle, stammt noch aus der Scene in einer Zeit, wo Leute gebraucht wurden, die fette Finger hatten, damit die Dinger nicht beim Tippen abmagerten, ist also schon verdammt lange her... Die Überschrift wäre mit "als wir noch jung waren" irgendwie besser gewählt, aber meine Addresse ist schon bekannt und n' EntschädigungsFonds für EX-GaleerenCoder einrichten zu müssen wäre ziemlich stressig.. :] .. fasel.... blah.... blag... sülz..... raspel....

Hmmm... da das Remaken aber in den letzten 2 Jahren in Mode gekommen ist, könnt' ihr deswegen ruhig eure alten Source-CD's rauskramen und fleißig loslegen, dann gibt's vielleicht mal offiziell n' neuen Code-Stil... R's'S (rob some sources) könnte sich das dann nennen wie R'n'B (der Scheiß ist aber undefinierbar!).

Mein Redepult hab' ich wie immer nicht dabei, aber ne' Anleitung, wie wir uns n' gemixten Effekt zusammenbasteln.... weich und knitterfest, wie die Kinder aus Budapest sollte er sein... [jo kids!] Der Effekt sieht AUFgepeppt ganz geil aus, und ist total einfach zu coden.... genau ihr habt richtig gelesen! Die Herren Adok und Konsorten können sich allerdings noch das Beispiel für neue Teppich-Muster ansehen [haha].

1. Grundmaterial

Es kann ja mal vorkommen, dass der Spruch "Geld spielt keine Rolle" auf euch nicht zutrifft, wir arbeiten ja auch mit Jüngeren [......], deswegen gibt's heut' ne' Ausnahme und wir lassen das Silicon-Rechner Niveau mal weg und bereiten uns was vor. Wie n' Kreis ungefähr aussieht, könnt ihr aus dem ASCII entnehmen, allerdings kommen Designerkreise nur auf Töpfervasen und Teppichen gut, nicht so bei dem Effekt hier. Also brauchen wir den guten alten Sinus bzw. dem Cosinus..

Als erstes brauchen wir ne' (Co-)Sinus-Tabelle, die groß genug ist, auch Kreise mit viel Winkeln zu erfassen, aber jeweils nur für EINE Amplitude.

    ==========================================================
    ---coded code  - - source -- - zeichnung --.-steintafel---
    ==========================================================

    #include <stdio.h>
    #include <math.h>

    char virt[64000];   // Virt. Bildschirm für Kreise
    char dst[64000];    // Papier...

    int sin_arr[19000]; // Hmmm.....
    int cos_arr[19000];
    int a,i,j,p,q=0;    // die üblichen Zähl-Sklaven

    void setpal(int c,int r,int g,int b) {
      outp(0x3c8,c);
      outp(0x3c9,r);
      outp(0x3c9,g);
      outp(0x3c9,b);
    }

    void main(void) {
    a=0;   // Amplitude;
    j=1;   // Winkelfaktor
    p=0;   // Breite des Ringes
    c=255; // Aktuelle Farbe
    ff=0;  // Flip-Flop zum Farbwechsel

    for (i=0;i<=255;i++)
      setpal(i,i/4,i/4,i/4); // Farbpalette berechnen

    while (!kbhit()) {
      a++;             // Amplitude erhöhen
      p++;
      if (p>=25) {     // Wenn 25 Amplituden berechnet wurden,
        j++;           // Anzahl der Winkel um 255 erhöhen, um
        p=0;           // Genauigkeit zu bewahren.
      for (i=0;i<=(255*j);i++) {
        sin_arr[i]=sin(i*pi/((255*j)/2))*a;
        cos_arr[i]=cos(i*pi/((255*j)/2))*a;
      }
      // Berechneten Kreis mit akt. Farbe auf VIRT[] zeichen
    }
    =========================================
    -- bonga! steintafel viiEEl zu kurz -_ --
    =========================================

2. Schablonenanfertigung

Mit dem tollen Grundprinzip können wir eigentlich schon unser Muster knüpfen.. äähh.. berechnen natürlich... [...] Nach jedem Durchlauf wird der Kreis z.B. auf einen virtuellen 320*200 Bildschirm von der Mitte aus [Pm(160,100)] gezeichnet.

3. Wir zeichnen [wir wollen Schwielen sehen Mädels...]

Um den Interferenz-Effekt zu bekommen, muß man in Prinzip nur eine Sprite-Prozedur coden und die Kreise [aLso 2] verschoben übereinander legen. Hierbei gibt es eine Besonderheit:

Die Kreise haben z.B. entweder die Farbe grau oder weiß, also zwei Farben. Der Interferenzeffekt entsteht nur dann am besten, wenn man vorher eine bestimmte Definition vorgibt, wenn z.B ein grauer Ring einen weißen kreuzt. In diesem Fall sind es die Farbnummern 120=grau, 255=weiß und 0=schwarz.

    ======================================
     Circle-Map:  Ziel-Map:  Neuer Pixel:
    --------------------------------------
    120         255           0
    255         120           0
    255         255         255
    120         120         120
    ======================================

4. Le Informationas [bevor ihr sonst keine Radiergummis mehr habt...]

Wenn ihr die Map zum ersten Mal zeichnet, muß die Abfrage übersprungen werden, d.h. beim ersten Zeichnen braucht ihr nur einen Pinsel... Dazu sollte man sich ein(e) Flag zu Hilfe ziehen. Anschließend noch n' Eimer Wasser drüberkippen, damit das Teil auch richtig schön verblurrt aussieht und da die Kinder im Kosovo momentan auch Hilfe bekommen, wird ne' Runde Code spendiert:

    ======================================================
    -- - ??? ? blrr? ------- --- brrr ?? bbbluurr??? -----
    ======================================================

    void init_circlemap(char *dest) {  // Komplette Vorberechnungs-
    char c,oc,f1,f2=0;                 // prozedur [HASS!]
    int xp,yp,p,o,q,col,ff=0;

    f1=255; f2=120;                    // Die benutzen Farben

    for (j=0;j<=100;j++) {
      for (i=0;i<=255;i++) {
        x_arr[i][j]=cos(i*pi/128)*j;
        y_arr[i][j]=sin(i*pi/128)*j;
      }
    }

    p=0; o=1; c=f2; oc=c;

    for (j=0;j<=187;j++) {
      p++;
      if (p>=6) {
        p=0; o++;
        if (col) {
          col=!col; c=f2; oc=c; ff=1;
        }
        if ((!col) && (!ff)) {
          col=!col; c=f1; oc=c;
        }
        ff=0;
      }
      q=255*o;
      for (i=0;i<=q;i++) {
        cos_arr[i]=cos(i*pi/(q/2))*j; // das Altbekannte...
        sin_arr[i]=sin(i*pi/(q/2))*j;
      }
      for (i=0;i<=q;i++) {
        yp=(100+yy_arr[i]);
        xp=(160+xx_arr[i]);
        if (yp>=199) { yp=199; oc=c; c=0; }
        if (yp<=1)   { yp=1;   oc=c; c=0; }
        if (xp>=319) { xp=319; oc=c; c=0; }
        if (xp<=1)   { xp=1;   oc=c; c=0; }
        dest[yp*320+xp]=c;
        c=oc;
      }
      for (i=0;i<=q;i++) {   // Tabellen resetten
        xx_arr[i]=0; yy_arr[i]=0;
      }
    }
    }

    void map_map(int xm,int ym,char *source, char *dest) {
    int c1,c2,cg,x,y,xp,yp=0;
    for (y=ymin;y<=ymax;y++) {
      for (x=xmin;x<=xmax;x++) {
        xp=xm+x;
        yp=ym+y;
         if (xp>=319) xp=319;
         if (xp<=1)   xp=1;
         if (yp>=199) yp=199;
         if (yp<=1)   yp=1;
         if (flag) dest[y*320+x]=source[yp*320+x];
         if (!flag) {
           if ((source[yp*320+xp]==120) &&
             (dest[y*320+x]==255)) dest[y*320+x]=0;
           if ((source[yp*320+xp]==255) &&
             (dest[y*320+x]==120)) dest[y*320+x]=0;
           if ((source[yp*320+xp]==255) &&
             (dest[y*320+x]==255)) dest[y*320+x]=255;
           if ((source[yp*320+xp]==120) &&
             (dest[y*320+x]==120)) dest[y*320+x]=120;
          }
        }
      }
    }

    void blur(char *dest);
    #pragma aux blur=\
      "inc edi"\
      "add edi,320"\
      "mov esi,edi"\
      "mov cx,63359"\
      "fl1:"\
      "xor bx,bx"\
      "mov bl,[edi-320]"\
      "mov ax,bx"\
      "mov bl,[edi-1]"\
      "add ax,bx"\
      "mov bl,[edi+1]"\
      "add ax,bx"\
      "mov bl,[edi+320]"\
      "add ax,bx"\
      "shr ax,2"\
      "jz fl2"\
      "dec al"\
      "fl2:"\
      "stosb"\
      "dec cx"\
      "jnz fl1"\
     parm [edi]\
    modify [eax ebx esi];

    =========================================
    _________- ! WELTHERRSCHAFT! ! -_________
    =========================================

Suppa whizzo kewl aNsi done by shadowtos banditos. Neue Teppich-Muster, Hugendubel- Ausgaben, Klaustrophobiepatienten an: Michael Horstmann, Masteweg 14, 58640 Iserlohn, Telefon: 02371/438363.

Shadow Bandit^3