Warning
This page is located in archive.

12 - Práce se soubory + dynamická správa paměti

Pro učitele: 12

Na tomto cvičení spojíme několik předcházejících témat (dynamická alokace paměti, práce se soubory, pointerová aritmetika, ukazatele na funkce, atd.) v jednom komplexním programu.

Úkol

Vytvořte knihovnu pro práci s bitmapami (bitmap_utils.c, bitmap_utils.h). Tato knihovna umožní vytvořit bitmapu o zadané velikosti v paměti, kreslit do ní jednotlivé pixely a čáry zadanou barvou a exportovat tuto bitmapu ve formátu BMP.

Toto jsou povinné funkce knihovny “bitmap_utils”:

    t_bitmap *create_bitmap(uint16_t width, uint16_t height);
    void delete_bitmap(t_bitmap *bitmap);
 
    void set_color(uint8_t r, uint8_t g, uint8_t b);
 
    void draw_pixel(t_bitmap *bitmap, uint16_t x, uint16_t y);
    void draw_line(t_bitmap *bitmap, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);
 
    int export_bitmap_to_bmp(char *filename, t_bitmap *bitmap);

Typy unit16_t, uint8_t najdete v inttypes.h. Datový typ t_bitmap navrhněte dle vlastního uvážení.

Dále vytvořte funkci plot, která do zadané bitmapy vykreslí graf funkce (tuto funkci předávejte jako ukazatel) v zadaných mezích (rozsah osy x a y).

Testovací hlavní program:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#include "bitmap_utils.h"
 
#define WIDTH  320
#define HEIGHT 200
 
double function1(double x) {
    return sin(x);
}
 
double function2(double x) {
    return sin(x) * sin(x);
}
 
void plot(t_bitmap *bitmap, /* DOPLŇTE */,
        double x_min, double x_max, double y_min, double y_max) {
 
/* DOPLŇTE VLASTNÍ KÓD */
 
}
 
int main(int argc, char** argv) {
 
    t_bitmap* bitmap;
    int x, y;
 
    bitmap = create_bitmap(WIDTH, HEIGHT);
 
    set_color(255, 255, 255); // White color
    for (x = 0; x < WIDTH; x++) {
        for (y = 0; y < HEIGHT; y++) {
            draw_pixel(bitmap, x, y);
        }
    }
 
    set_color(0, 0, 0); // White color
    plot(bitmap, &function1, 0, 2 * M_PI, -1, 1);
    export_bitmap_to_bmp("out1.bmp", bitmap);
 
    set_color(255, 0, 0); // Red color
    plot(bitmap, &function2, 0, 2 * M_PI, -1, 1);
    export_bitmap_to_bmp("out2.bmp", bitmap);
 
    set_color(0, 255, 0); // Green color
    plot(bitmap, &function2, 0, 10 * M_PI, -1, 1);
    export_bitmap_to_bmp("out3.bmp", bitmap);
 
    set_color(0, 0, 255); // Blue color
    plot(bitmap, &function2, 0, 10 * M_PI, 0, 1);
    export_bitmap_to_bmp("out4.bmp", bitmap);
 
    delete_bitmap(bitmap);
 
    return (EXIT_SUCCESS);
}

Tento program by měl vygenerovat následující obrázky:

  • out1.bmp :
  • out2.bmp :
  • out3.bmp :
  • out4.bmp :
Důsledně ošetřujte chyby. Např. předání nulového ukazatele, chyba při alokaci paměti, chyba při otevírání souboru, horní a dolní meze souřadnic při kreslení, atd.
Existuje velké množství variant BMP formátu - doporučujeme zvolit RGB formát bez komprese s velikostí DIB hlavičky 40 bytů. Můžete ale implementovat libovolnou variantu - např. verzi s paletou.

Užitečné odkazy

courses/a0b36pr2/labs/lab12.txt · Last modified: 2015/05/04 21:10 by faiglj