blob: 10a934e75fe3ff95de406be6a62bdd69135a2db7 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#include <stdlib.h>
#include <string.h>
#include "grids.h"
/*
* Creates a grid for storing the results of the escape algorithm
*/
grid_t* create_grid(const size_t x, const size_t y){
if(x <= 0 || y <= 0) return NULL;
const size_t size = x * y;
size_t* data = malloc(size * sizeof(size_t));
if(!data) return NULL;
grid_t* grid = malloc(sizeof(grid_t));
if(!grid){
free(data);
return NULL;
}
grid->x = x;
grid->y = y;
grid->size = size;
grid->data = data;
return grid;
}
/*
* Sets all entries of a grid to the value val
*/
void set_grid(grid_t* grid, const double val){
if(!grid || !grid->data) return;
memset(grid->data, val, grid->size);
}
/*
* Creates a copy of a grid
*/
grid_t* copy_grid(const grid_t* grid){
if(!grid || !grid->data) return NULL;
grid_t* grid_copy = create_grid(grid->x, grid->y);
if(!grid_copy) return NULL;
memcpy(grid_copy->data, grid->data, grid->size);
return grid_copy;
}
/*
* Frees a grid and its members
*/
void free_grid(grid_t* grid){
if(!grid) return;
free(grid->data);
free(grid);
}
/*
* Checks if two grids are exactly equal
* This may return incorrect values due to floating point arrithmetic errors
* that occur while the grid is being filled
*/
bool grid_equal(const grid_t* grid1, const grid_t* grid2){
return grid1->x == grid2->x && grid1->y == grid2->y &&
memcmp(grid1->data, grid2->data, grid1->size) == 0;
}
/*
* Checks if two grids have a given maximum difference
*/
bool grid_allclose(const grid_t *grid1, const grid_t *grid2, const size_t max_error){
if(grid1->x != grid2->x || grid1->y != grid2->y) return false;
const size_t size = grid1->size;
for(size_t i = 0; i < size; i++){
if(abs(grid1->data[i] - grid2->data[i]) >= max_error) return false;
}
return true;
}
|