#include <stdio.h>
#include <math.h>
#define DOSWidth 80
#define DOSHeight 25
int iterations = 1024;
float escapeValue = 3.0f;
struct ivar {
ivar(float _x, float _i) {
x = _x;
i = _i;
}
void log() {printf("(%g%c%gi)", x, (i<0)?'-':'+', fabs(i));}
float magnitude() {return sqrtf(x*x+i*i);}
ivar square() {return ivar(x, i)*ivar(x, i);}
ivar operator + (ivar v) {return ivar(x+v.x, i+v.i);};
ivar operator - (ivar v) {return ivar(x-v.x, i-v.i);};
ivar operator * (ivar v) {return ivar(x*v.x-(i*v.i), x*v.i+i*v.x);};
float x, i;
};
struct rect {
rect(float _x, float _y, float _width, float _height) {
x = _x;y = _y;width = _width;height = _height;
}
void setCenter(float cx, float cy) {
x = cx-width/2.0f;
y = cy-width/2.0f;
}
void log() {printf("(%f, %f, %f, %f)", x, y, width, height);}
float x, y;
float width, height;
};
int main() {
rect region = rect(0, 0, 2.5f, 2.0f);
region.setCenter(0, 0);
float xSize = region.width / (float)DOSWidth;
float ySize = region.height / (float)DOSHeight;
for(int y=0;y<DOSHeight;y++) {
for(int x=0;x<DOSWidth;x++) {
ivar pos0 = ivar(x*xSize+region.x, y*ySize+region.y);
ivar pos = pos0;
bool escapes = false;
for(int i=0;i<iterations;i++) {
if(pos.magnitude() > escapeValue) {
escapes = true;
break;
}
pos = pos.square() + pos0;
}
if(escapes)printf(" ");
else printf("X");
}
printf( "\n" );
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIERPU1dpZHRoIDgwCiNkZWZpbmUgRE9TSGVpZ2h0IDI1CgppbnQgaXRlcmF0aW9ucyA9IDEwMjQ7CmZsb2F0IGVzY2FwZVZhbHVlID0gMy4wZjsKCnN0cnVjdCBpdmFyIHsKICAgIGl2YXIoZmxvYXQgX3gsIGZsb2F0IF9pKSB7CiAgICAgICAgeCA9IF94OwogICAgICAgIGkgPSBfaTsKICAgIH0KICAgIHZvaWQgbG9nKCkge3ByaW50ZigiKCVnJWMlZ2kpIiwgeCwgKGk8MCk/Jy0nOicrJywgZmFicyhpKSk7fQogICAgZmxvYXQgbWFnbml0dWRlKCkge3JldHVybiBzcXJ0Zih4KngraSppKTt9CiAgICBpdmFyIHNxdWFyZSgpIHtyZXR1cm4gaXZhcih4LCBpKSppdmFyKHgsIGkpO30KCiAgICBpdmFyIG9wZXJhdG9yICsgKGl2YXIgdikge3JldHVybiBpdmFyKHgrdi54LCBpK3YuaSk7fTsKICAgIGl2YXIgb3BlcmF0b3IgLSAoaXZhciB2KSB7cmV0dXJuIGl2YXIoeC12LngsIGktdi5pKTt9OwogICAgaXZhciBvcGVyYXRvciAqIChpdmFyIHYpIHtyZXR1cm4gaXZhcih4KnYueC0oaSp2LmkpLCB4KnYuaStpKnYueCk7fTsKCiAgICBmbG9hdCB4LCBpOwp9OwoKc3RydWN0IHJlY3QgewogICAgcmVjdChmbG9hdCBfeCwgZmxvYXQgX3ksIGZsb2F0IF93aWR0aCwgZmxvYXQgX2hlaWdodCkgewogICAgICAgIHggPSBfeDt5ID0gX3k7d2lkdGggPSBfd2lkdGg7aGVpZ2h0ID0gX2hlaWdodDsKICAgIH0KCiAgICB2b2lkIHNldENlbnRlcihmbG9hdCBjeCwgZmxvYXQgY3kpIHsKICAgICAgICB4ID0gY3gtd2lkdGgvMi4wZjsKICAgICAgICB5ID0gY3ktd2lkdGgvMi4wZjsKICAgIH0KCiAgICB2b2lkIGxvZygpIHtwcmludGYoIiglZiwgJWYsICVmLCAlZikiLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTt9CgogICAgZmxvYXQgeCwgeTsKICAgIGZsb2F0IHdpZHRoLCBoZWlnaHQ7Cn07CgppbnQgbWFpbigpIHsKICAgIHJlY3QgcmVnaW9uID0gcmVjdCgwLCAwLCAyLjVmLCAyLjBmKTsKICAgIHJlZ2lvbi5zZXRDZW50ZXIoMCwgMCk7CiAgICBmbG9hdCB4U2l6ZSA9IHJlZ2lvbi53aWR0aCAvIChmbG9hdClET1NXaWR0aDsKICAgIGZsb2F0IHlTaXplID0gcmVnaW9uLmhlaWdodCAvIChmbG9hdClET1NIZWlnaHQ7CiAgICBmb3IoaW50IHk9MDt5PERPU0hlaWdodDt5KyspIHsKICAgICAgICBmb3IoaW50IHg9MDt4PERPU1dpZHRoO3grKykgewogICAgICAgICAgICBpdmFyIHBvczAgPSBpdmFyKHgqeFNpemUrcmVnaW9uLngsIHkqeVNpemUrcmVnaW9uLnkpOwogICAgICAgICAgICBpdmFyIHBvcyA9IHBvczA7CiAgICAgICAgICAgIGJvb2wgZXNjYXBlcyA9IGZhbHNlOwogICAgICAgICAgICBmb3IoaW50IGk9MDtpPGl0ZXJhdGlvbnM7aSsrKSB7CiAgICAgICAgICAgICAgICBpZihwb3MubWFnbml0dWRlKCkgPiBlc2NhcGVWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGVzY2FwZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zID0gcG9zLnNxdWFyZSgpICsgcG9zMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihlc2NhcGVzKXByaW50ZigiICIpOwogICAgICAgICAgICBlbHNlIHByaW50ZigiWCIpOwogICAgICAgIH0KICAgICAgICBwcmludGYoICJcbiIgKTsKICAgIH0KfQ==