static int grid_clone_lua(lua_State *L) { check_userdata_type(L, 1, "grid"); grid *g0 = lua_touserdata(L, 1); grid *g = lua_newuserdata(L, sizeof(grid)); *g = grid_clone(g0); grid_create_metatable_lua(L); return 1; }
void grid_dilate(grid *g1) { grid tmp = grid_clone(g1); int x0 = g1->x0; int y0 = g1->y0; int x1 = g1->x0 + g1->width; int y1 = g1->y0 + g1->height; for(int x = x0;x<x1;++x) { for(int y = y0;y<y1;++y) { double value = 0.0; for(int xoffset = -1;xoffset<=1;++xoffset) { for(int yoffset = -1;yoffset<=1;++yoffset) { int xn = x + xoffset; int yn = y + yoffset; if(grid_contains(&tmp, xn, yn) && grid_get(&tmp, xn, yn) != 0) value = 1.0; } } grid_set(g1, x, y, value); } } grid_destroy(tmp); }
void golutil_cycle(Grid *grid) { Grid *prev = grid_clone(grid); for (int i = 0; i < grid->rows; ++i) { for (int j = 0; j < grid->cols; j++) { int neighbours = 0; neighbours += grid_get_at(prev, i-1, j-1); neighbours += grid_get_at(prev, i, j-1); neighbours += grid_get_at(prev, i+1, j-1); neighbours += grid_get_at(prev, i-1, j); neighbours += grid_get_at(prev, i+1, j); neighbours += grid_get_at(prev, i-1, j+1); neighbours += grid_get_at(prev, i, j+1); neighbours += grid_get_at(prev, i+1, j+1); if (grid_get_at(prev, i, j) && (neighbours < 2 || neighbours > 3)) { grid_set_at(grid, i, j, 0); } else if (!grid_get_at(prev, i, j) && neighbours == 3) { grid_set_at(grid, i, j, 1); } } } grid_delete(prev); }