int main()
{
	const char* string = (char *)malloc(50);
	const char* sub = (char *)malloc(19);
	int a = 8; float b = 9.4444; int c = 2;
	int d;
	printf("Before swapping: a = %d c = %d\n", a , c);
	a = a + c;
	c = a - c;
	a = a - c;
	printf("After swapping: a = %d c = %d\n", a , c);
	string = "This is the company namded apple inc";
	sub = "is";
	printf("Substring: %d\n", isSubstring(string, sub));
	printf("Position of the MSB is: %d\n", msbPos(3));
	printf("Is bit set: %d\n", isBitset(8,4));
	printf("%x to little endian %x\n", a, BigToLittle(a));
	printf("%d is a power of 2: %d\n", a ,isPowerof2(a));
	printf("%s after reversed: %s\n", string, reverse(string));
	printf("%s is palindrome: %d\n", string, isPalindrome(string));
	printf("%d is a prime number: %d\n",a, isPrimeNumber(a));
	primeNumber(20);
	printf("\nFibonacci Series: ");
	fibonacci(15);
	printf("\n");
	printf("Factorial of %d: %d\n", a, factorial(a));
	printf("%s after reversing: %s\n", string, reverseString(string));
	printf("Nearest int of %f is: %d\n", b, nearestInt(b));
	printf("%d", (-1%8));
	return 0;
}
static void displayCharts(double npoints)
{

	for (int y = 0; y < 511; y++)
		for (int x = 0; x < 511; x++) {
			float f = int_buff[y][x] * 0.2f;
			vfb[y][x] = Color(f, f, f);
	}
	for (int y = 0; y < 511; y++)
		for (int x = 0; x < 512; x++) {
			float f = float_buff[y][x] * 0.2f;
			vfb[y][x+512] = Color(f, f, f);
		}
	for (int y = 0; y < 512; y++)
		for (int x = 0; x < 511; x++) {
			float f = circle_buff[y][x] * 0.2f;
			vfb[y+512][x] = Color(f, f, f);
		}
	const int BORDERS = 16;
	const int NLINES = 8;
	const int SPACING = (512 - 2 * BORDERS) / NLINES;
	double mult = (512 - 2 * BORDERS) * 512 * 0.4 / (npoints);
	for (int x = 0; x < 512; x++) {
		Color base = Color(0, 0, 0);
		if ((int) fabs(x - 256) % ((int) (256.0/3.0)) == 0)
			base = Color(0.2f, 0.2f, 0.2f);
		int ey = nearestInt(512 - BORDERS - norm_buff[x] * mult);
		int sy = 512 - BORDERS;
		for (int y = 0; y < 512; y++) {
			Color f = base;
			if (sy - y >= 0 && (sy - y) % SPACING == 0) f += Color(0.1f, 0.1f, 0.1f);
			if (y == ey) f = Color(0.4f, 0.4f, 1.0f);
			else if (y == sy) f = Color(0.9f, 0.9f, 0.9f);
			else if (y > sy) f.makeZero();
			else if (y > ey) f += Color(0.2f, 0.2f, 0.5f);
			vfb[y+512][x+512] = f;
		}
	}
	for (int i = 0; i < 1024; i++)
		vfb[i][511] = vfb[511][i] = Color(1, 1, 1);
}
void Heightfield::fillProperties(ParsedBlock& pb)
{
    Bitmap* bmp = NULL;
    if (!pb.getBitmapFileProp("file", &bmp, filename)) pb.requiredProp("file");
    W = bmp->getWidth();
    H = bmp->getHeight();
    blur = 0;
    pb.getDoubleProp("blur", &blur);
    heights = new float[W * H];
    float minY = LARGE_FLOAT, maxY = -LARGE_FLOAT;
    // do we have blur? if no, just fetch the source image and store it:
    if (blur <= 0) {
        for (int y = 0; y < H; y++)
            for (int x = 0; x < W; x++) {
                float h = bmp->getPixel(x, y).intensity();
                heights[y * W + x] = h;
                minY = min(minY, h);
                maxY = max(maxY, h);
            }
    } else {
        // We have blur...
        // 1) convert image to greyscale (if not already):
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
                float f = bmp->getPixel(x, y).intensity();
                bmp->setPixel(x, y, Color(f, f, f));
            }
        }
        // 2) calculate the gaussian coefficients, see http://en.wikipedia.org/wiki/Gaussian_blur
        static float gauss[128][128];
        int R = min(128, nearestInt(float(3 * blur)));
        for (int y = 0; y < R; y++)
            for (int x = 0; x < R; x++)
                gauss[y][x] = float(exp(-(sqr(x) + sqr(y))/(2 * sqr(blur))) / (2 * PI * sqr(blur)));
        // 3) apply gaussian blur with the specified number of blur units:
        // (this is potentially slow for large blur radii)
        for (int y = 0; y < H; y++) {
            for (int x = 0; x < W; x++) {
                float sum = 0;
                for (int dy = -R + 1; dy < R; dy++)
                    for (int dx = -R + 1; dx < R; dx++)
                        sum += gauss[abs(dy)][abs(dx)] * bmp->getPixel(x + dx, y + dy).r;
                heights[y * W + x] = sum;
                minY = min(minY, sum);
                maxY = max(maxY, sum);
            }
        }
    }
    // set the bounding box. minY and maxY are the bbox extents along Y and are calculated
    // from the heights[] array.
    bbox.vmin = Vector(0, minY, 0);
    bbox.vmax = Vector(W, maxY, H);

    // calculate the maxH array. maxH(x, y) = max(H(x, y), H(x + 1, y), H(x, y + 1), H(x + 1, y+1))
    maxH = new float[W*H];
    for (int y = 0; y < H; y++)
        for (int x = 0; x < W; x++) {
            float& maxH = this->maxH[y * W + x];
            maxH = heights[y * W + x];
            if (x < W - 1) maxH = max(maxH, heights[y * W + x + 1]);
            if (y < H - 1) {
                maxH = max(maxH, heights[(y + 1) * W + x]);
                if (x < W - 1)
                    maxH = max(maxH, heights[(y + 1) * W + x + 1]);
            }
        }
    // precalculate the normals at each integer point. We create normals by doing two forward differences
    // on the height along x and y at each point and using the cross product of these differences to
    // obtain the normal vector
    normals = new Vector[W * H];
    for (int y = 0; y < H; y++)
        for (int x = 0; x < W; x++) {
            float h0 = heights[y * W + x];
            float hdx = heights[y * W + min(W - 1, x + 1)];
            float hdy = heights[min(H - 1, y + 1) * W + x];
            Vector vdx = Vector(1, hdx - h0, 0); // forward difference along X
            Vector vdy = Vector(0, hdy - h0, 1); // forward difference along Z
            Vector norm = vdy ^ vdx;
            norm.normalize();
            normals[y * W + x] = norm;
        }
    useOptimization = false;
    pb.getBoolProp("useOptimization", &useOptimization);
    if (!disableAcceleratedStructures && useOptimization) {
        Uint32 clk = SDL_GetTicks();
        buildStruct();
        clk = SDL_GetTicks() - clk;
        printf("Heightfield acceleration struct built in %.3lfs\n", clk / 1000.0);
    }
}