diff --git a/vaja3/Makefile b/vaja3/Makefile new file mode 100644 index 0000000..713f9d1 --- /dev/null +++ b/vaja3/Makefile @@ -0,0 +1,3 @@ +julia: + cc -lm julia.c cplxlib.c knjiznica/bitmap.c -o julia + diff --git a/vaja3/cplxlib.c b/vaja3/cplxlib.c new file mode 100644 index 0000000..1b857f5 --- /dev/null +++ b/vaja3/cplxlib.c @@ -0,0 +1,36 @@ +#include + +typedef struct {double re, im;} cplx; + +cplx csum (cplx a, cplx b) // Complex sum +{ + cplx sum; + sum.re = a.re + b.re; + sum.im = a.im + b.im; + return sum; +} + +cplx cdif (cplx a, cplx b) // Complex difference +{ + cplx difference; + difference.re = a.re - b.re; + difference.im = a.im - b.im; + return difference; +} + +cplx cprod (cplx a, cplx b) // Complex product +{ + cplx product; + product.re = (a.re * b.re) - (a.im * b.im); + product.im = (a.im * b.re) + (a.re * b.im); + return product; +} + +cplx cquo (cplx a, cplx b) // Complex quotient +{ + cplx quotient; + quotient.re = ((a.re * b.re)+(a.im * b.im)) / ((b.re*b.re)+(b.im*b.im)); + quotient.im = ((a.im * b.re)-(a.re * b.im)) / ((b.re*b.re)+(b.im*b.im)); + return quotient; +} + diff --git a/vaja3/cplxlib.h b/vaja3/cplxlib.h new file mode 100644 index 0000000..320743c --- /dev/null +++ b/vaja3/cplxlib.h @@ -0,0 +1,5 @@ +typedef struct {double re, im;} cplx; +cplx csum (cplx a, cplx b); // Complex sum +cplx cdif (cplx a, cplx b); // Complex difference +cplx cprod (cplx a, cplx b); // Complex product +cplx cquo (cplx a, cplx b); // Complex quotient diff --git a/vaja3/julia b/vaja3/julia new file mode 100755 index 0000000..f9062ad Binary files /dev/null and b/vaja3/julia differ diff --git a/vaja3/julia.bmp b/vaja3/julia.bmp new file mode 100644 index 0000000..3aab61e Binary files /dev/null and b/vaja3/julia.bmp differ diff --git a/vaja3/julia.c b/vaja3/julia.c new file mode 100644 index 0000000..d2c7e5b --- /dev/null +++ b/vaja3/julia.c @@ -0,0 +1,47 @@ +#include "knjiznica/bitmap.h" +#include "cplxlib.h" +#include "stdio.h" +#include "math.h" + +#define resolution 3400 +const double dimension = 1.7; +const double orbit = 2.0; + +unsigned char canvas[resolution][resolution]; // platno za risanje + +unsigned char iteratePolynomial(cplx z0, cplx c) +{ + cplx z = z0; + for (unsigned i = 0; i<255; i++) + { + z = cprod(z, z); + z = csum(z, c); + if (sqrt((z.re*z.re)+(z.im*z.im)) > orbit) return i+1; + } + return 255; +} + +int main(void) +{ + cplx c; + double a,b; + printf("Vnesi adicijsko konstanto polinoma: "); + scanf("%lf%lfi", &a, &b); + puts("Iteriram:"); + c.re = a; + c.im = b; + for(unsigned p = 0; p < resolution; p++) + { + printf("."); + for(unsigned q = 0; q < resolution; q++) + { + cplx z0; + z0.re = ((dimension/resolution) * p * 2) - dimension; + z0.im = -(((dimension/resolution) * q * 2) - dimension); + canvas[p][q] = iteratePolynomial(z0, c); + } + } + shraniBMP(canvas, resolution, resolution, "julia.bmp"); + printf("\n\n Končano. Slika shranjena\n"); +} + diff --git a/vaja3/knjiznica/README.txt b/vaja3/knjiznica/README.txt new file mode 100755 index 0000000..2b17fe8 --- /dev/null +++ b/vaja3/knjiznica/README.txt @@ -0,0 +1,12 @@ +Knjižnica za pretvorbo 2D arraya v BMP datoteko (slika). +Deluje na platformah Windows, Linux, Mac. + +CodeBlocks: +1. Knjižnico bitmap.c in header datoteko bitmap.h skopiraj v mapo svojega projekta. +2. bitmap.cpp vključi v svoj projekt. (desni klik na ime projekta -> Add files -> izberete datoteke -> Open files -> v oknu Multiple Decision izberete OK) +3. Na vrhu svojega projekta to knjižnico tudi vključi z vrstico #include "bitmap.h" +4. Uporabljaj funkcijo na način: + +shraniBMP(ime_dvodimenzionalnega_arraya_s_podatki_tipa_unsigned_char, DIMx, DIMy, "imeslike.bmp"); + +Datoteka .bmp se shrani v mapo projekta. Če je ni, poglejte še pod mapo Debug. \ No newline at end of file diff --git a/vaja3/knjiznica/bitmap.c b/vaja3/knjiznica/bitmap.c new file mode 100755 index 0000000..4e00256 --- /dev/null +++ b/vaja3/knjiznica/bitmap.c @@ -0,0 +1,122 @@ +#include "bitmap.h" +#include +#include +//#include + +//#ifndef WIN32 +#pragma pack(push, bmp_packing, 1) + +typedef uint8_t BYTE; // 8 nit unsigned +typedef int32_t LONG; // 32 bit signed +typedef uint16_t WORD; // 16 bit unsigned +typedef char* LPCTSTR; +typedef uint32_t DWORD; // 32 bit unsigned +typedef uint16_t WCHAR; // 16 bit unicode char + +typedef struct tagRGBQUAD { + BYTE rgbBlue; + BYTE rgbGreen; + BYTE rgbRed; + BYTE rgbReserved; +} RGBQUAD; + +typedef struct tagBITMAPINFOHEADER { + DWORD biSize; + LONG biWidth; + LONG biHeight; + WORD biPlanes; + WORD biBitCount; + DWORD biCompression; + DWORD biSizeImage; + LONG biXPelsPerMeter; + LONG biYPelsPerMeter; + DWORD biClrUsed; + DWORD biClrImportant; +} BITMAPINFOHEADER, *PBITMAPINFOHEADER; + +typedef struct tagBITMAPFILEHEADER { + WORD bfType; + DWORD bfSize; + WORD bfReserved1; + WORD bfReserved2; + DWORD bfOffBits; +} BITMAPFILEHEADER, *PBITMAPFILEHEADER; + +#pragma pack(pop, bmp_packing) +//#endif + +// Return 0 on failure +int SaveBitmapToFile(void* data, unsigned int lWidth, unsigned int lHeight, unsigned int wBitsPerPixel, const char *fileName) { + RGBQUAD palette[256]; + FILE *f; + BITMAPINFOHEADER bmpInfoHeader = {0}; + BITMAPFILEHEADER bfh = {0}; + unsigned char *pBitmapBits=(unsigned char *)data; + unsigned int i; + char emptySpace[] = {0, 0, 0, 0}; + + for(i = 0; i < 256; ++i) + { + palette[i].rgbBlue = i; + palette[i].rgbGreen = (i * 2) % 256; + palette[i].rgbRed = (i * 3) % 256; + } + + // Set the size + bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); + // Bit count + bmpInfoHeader.biBitCount = wBitsPerPixel; + // Use all colors + bmpInfoHeader.biClrImportant = 0; + // Use as many colors according to bits per pixel + bmpInfoHeader.biClrUsed = 0; + // Store as un Compressed + bmpInfoHeader.biCompression = 0; // BI_RGB; + // Set the height in pixels + bmpInfoHeader.biHeight = lHeight; + // Width of the Image in pixels + bmpInfoHeader.biWidth = lWidth; + // Default number of planes + bmpInfoHeader.biPlanes = 1; + // Calculate the image size in bytes + bmpInfoHeader.biSizeImage = lWidth* lHeight * (wBitsPerPixel/8); + + // This value should be values of BM letters i.e 0x4D42 + // 0x4D = M 0×42 = B storing in reverse order to match with endian + bfh.bfType = 'B'+('M' << 8); + // <<8 used to shift ‘M’ to end + // Offset to the RGBQUAD + bfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + sizeof(RGBQUAD) * 256; + // Total size of image including size of headers + bfh.bfSize = bfh.bfOffBits + bmpInfoHeader.biSizeImage; + + // Create the file in disk to write + f=fopen(fileName, "wb"); + if (!f) { + return 0; + } + + // Write the File header + fwrite(&bfh, sizeof(bfh), 1, f); + // Write the bitmap info header + fwrite(&bmpInfoHeader, sizeof(bmpInfoHeader), 1, f); + // Write the palette + fwrite(&palette[0], sizeof(RGBQUAD), 256, f); + // Write the RGB Data + if(lWidth%4 == 0) { + fwrite(pBitmapBits, bmpInfoHeader.biSizeImage, 1, f); + } else { + for(i = 0; i < lHeight; ++i) { + fwrite(&pBitmapBits[i * lWidth], lWidth, 1, f); + fwrite(emptySpace, 4 - lWidth % 4, 1, f); + } + } + // Close the file handle + fclose(f); + + return 1; +} + +int shraniBMP(void *slika, unsigned int w, unsigned int l, const char *f) { + return SaveBitmapToFile(slika, w, l, 8, f); +} diff --git a/vaja3/knjiznica/bitmap.h b/vaja3/knjiznica/bitmap.h new file mode 100755 index 0000000..e888ebc --- /dev/null +++ b/vaja3/knjiznica/bitmap.h @@ -0,0 +1,7 @@ +#ifndef BITMAP_H +#define BITMAP_H + +int SaveBitmapToFile(void* data, unsigned int lWidth, unsigned int lHeight, unsigned int wBitsPerPixel, const char *fileName); +int shraniBMP(void *slika, unsigned int w, unsigned int l, const char *f); + +#endif //BITMAP_H