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