Code Snippets from KeenFractals

Box Counting Approximation Algorithm

//counts the number of boxes of size size*size that contain black pixels
int boxCount(int size, CClientDC* aDC) {
     int x,y,posx,posy,offx,offy;
     bool boxHere;
     int numBoxes = 0;
     for (x=0;x<850;x+=size) {
          for (y=0;y<525;y+=size) {
              boxHere = false;
              for (offx=0;offx<size;offx++) {
                  for (offy=0;offy<size;offy++) {
                         posx = x+offx;
                         posy = y+offy;
                         if (aDC->GetPixel(posx,posy) == 0 && posx<850 && posy<525) {
                              boxHere = true;
                         }
                   }
               }
               if (boxHere)
                    numBoxes++;
          }
     }
     return numBoxes;
}

void CKeenFractalsView::OnRButtonUp(UINT nFlags, CPoint point)
{
     float boxDim3,boxDim2;
     CClientDC aDC(this);
     //calculate the box-counting capacity of the figure
     //by counting boxes that have one or more black pixels
     //do this for size 3*3 boxes & 2*2 boxes, then size 1*1 boxes
     float box3 = boxCount(3,&aDC);
     float box2 = boxCount(2,&aDC);
     float box1 = boxCount(1,&aDC);
     boxDim3 = log(box1/box3)/log(3);
     boxDim2 = log(box1/box2)/log(2);
     char buffer[50];
     sprintf(buffer,"3*3 Box counting capacity:%f\n2*2 Box counting capacity:%f",boxDim3,boxDim2);
     AfxMessageBox(buffer,MB_ICONINFORMATION | MB_OK);
}

Back to Top
 

1-D Cellular Automata Algorithm

if (pDoc->m_FracType == "1-D A-Life") {
   int x,y,sumPrev;
   //all cells defaulted to empty
   for (x=0;x<850;x++) {
    aDC.SetPixel(x,0,0);
    dcMem.SetPixel(x,0,0);
   }
   //initial conditions - 2 life-cells side by side
   dcMem.SetPixel(424,0,1);aDC.SetPixel(424,0,1);
   dcMem.SetPixel(425,0,1);aDC.SetPixel(425,0,1);
   //each y is a different generation, looks at prev y
   for (y=1;y<525;y++) { //256
        dcMem.SetPixel(0,y,256*256*256-1);
        aDC.SetPixel(0,y,256*256*256-1);
        for (x=1;x<850;x++) {
            //look at 3 previous pixels
            sumPrev = dcMem.GetPixel(x-1,y-1)%2+
            dcMem.GetPixel(x,y-1)%2+
            dcMem.GetPixel(x+1,y-1)%2;
            //if no overcrowding or isolation, then keep
             if (sumPrev == 1 || sumPrev == 2 || y == 0 ) {
                  aDC.SetPixelV(x,y,0);
                  dcMem.SetPixelV(x,y,0);
             } else { //else empty
                  aDC.SetPixelV(x,y,256*256*256-1);
                  dcMem.SetPixelV(x,y,256*256*256-1);
             }
        }
        dcMem.SetPixel(850,y,256*256*256-1);
        aDC.SetPixel(850,y,256*256*256-1);
   }
}
 
Back to Top

IFS - Sierpinski Carpet

for (int n=0;n<525000;n++) {
    p = 8*rand()/(RAND_MAX);
    switch (p) {
    case 1:
         temp=x;
         x = x/3.0;
         y = y/3.0;
         break;
    case 2:
         temp=x;
         x = x/3.0+1/3.0;
         y = y/3.0;
         break;
    case 3:
         temp=x;
         x = x/3.0+2/3.0;
         y = y/3.0;
         break;
    case 4:
         temp=x;
         x = x/3.0;
         y = y/3.0+1/3.0;
         break;
    case 5:
         temp=x;
         x = x/3.0+2/3.0;
         y = y/3.0+1/3.0;
         break;
    case 6:
         temp=x;
         x = x/3.0;
         y = y/3.0+2/3.0;
         break;
    case 7:
         temp=x;
         x = x/3.0+1/3.0;
         y = y/3.0+2/3.0;
         break;
    default:
         temp=x;
         x = x/3.0+2/3.0;
         y = y/3.0+2/3.0;
    }
    if (n>100) {
     x1 = (x-startX)*incX;
     y1 = (y-startY)*incY;
     dcMem.SetPixelV(x1,y1,0);
     aDC.SetPixelV(x1,y1,0);
    }
}
 
 Back to Top
 

Mandelbrot Set (zooming automatic: just change start & end x,y positions)

//THIS IS WHERE I START DRAWING FRACTAL IN MEMORY BUFFER
   double incX,incY,s,t,v,x,y,xsq,ysq;
   incX = pDoc->width/850.0;
   incY = pDoc->height/525.0;
   t = pDoc->startY;
   for (int i=0;i<525;i++) {
        t += incY;
        s = pDoc->startX;
        for (int j=0;j<850;j++) {
             s += incX;
             x = s;
             y = t;
             xsq = 0;
             ysq = 0;
             v = 0;
             for (int k=0;k<512 & v<4;k++) {
                  xsq = x*x;
                  ysq = y*y;
                  y = 2*x*y + t;
                  x = xsq - ysq + s;
                  v = xsq+ysq;
             }
             if ( k!=512 ) {  //v<=4
                  dcMem.SetPixelV(j,i,(k*8)%256*256*256);
                  aDC.SetPixelV(j,i,(k*8)%256*256*256);
            } else {
              dcMem.SetPixelV(j,i,0);
              aDC.SetPixelV(j,i,0);
            }
      }
  }

  Back to Top