Wave function collapse: Difference between revisions
Content added Content deleted
m (→{{header|C}}) |
m (→{{header|C}}: hopefully easier to read now) |
||
Line 12: | Line 12: | ||
#include <string.h> |
#include <string.h> |
||
#include <time.h> |
#include <time.h> |
||
#define XY(row, col, width) ((col)+(row)*(width)) |
#define XY(row, col, width) ((col)+(row)*(width)) |
||
#define XYZ(page, row, col, height, width) XY(XY(page, row, height), col, width) |
#define XYZ(page, row, col, height, width) XY(XY(page, row, height), col, width) |
||
char blocks[5][3][3]= { |
char blocks[5][3][3]= { |
||
{ |
{ |
||
Line 39: | Line 39: | ||
} |
} |
||
}; |
}; |
||
/* avoid problems with slightly negative numbers and C's X%Y */ |
/* avoid problems with slightly negative numbers and C's X%Y */ |
||
#define MOD(X,Y) ((Y)+(X))%(Y) |
#define MOD(X,Y) ((Y)+(X))%(Y) |
||
char *wfc(char *blocks, int *bdim /* 5,3,3 */, int *tdim /* 8,8 */) { |
char *wfc(char *blocks, int *bdim /* 5,3,3 */, int *tdim /* 8,8 */) { |
||
int N= tdim[0]*tdim[1], td0= tdim[0], td1= tdim[1]; |
int N= tdim[0]*tdim[1], td0= tdim[0], td1= tdim[1]; |
||
int *adj= calloc(N*4, sizeof (int)); |
int *adj= calloc(N*4, sizeof (int)); |
||
for (int i= 0; i< |
for (int i= 0; i<td0; i++) { |
||
for (int j=0; j<td1; j++) { |
for (int j=0; j<td1; j++) { |
||
⚫ | |||
int k= j+td1*i; |
|||
⚫ | |||
int m= 4*k; |
|||
adj[ |
adj[XYZ(i,j,2,td1,4)]= XY(MOD(i, td0), MOD(j+1, td1), td1); /* right (index 5 in a 3x3 grid) */ |
||
adj[ |
adj[XYZ(i,j,3,td1,4)]= XY(MOD(i+1, td0), MOD(j, td1), td1); /* below (index 7 in a 3x3 grid) */ |
||
⚫ | |||
⚫ | |||
} |
} |
||
} |
} |
||
Line 71: | Line 69: | ||
for (int i= 0; i<bd0; i++) { |
for (int i= 0; i<bd0; i++) { |
||
for (int j= 0; j<bd0; j++) { |
for (int j= 0; j<bd0; j++) { |
||
vert[ |
vert[XY(i,j,bd0)]= 1; |
||
for (int k= 0; k<bd2; k++) { |
for (int k= 0; k<bd2; k++) { |
||
if (blocks[XYZ(i, 0, k, bd1, bd2)] != blocks[XYZ(j, bd1-1, k, bd1, bd2)]) { |
if (blocks[XYZ(i, 0, k, bd1, bd2)] != blocks[XYZ(j, bd1-1, k, bd1, bd2)]) { |
||
Line 80: | Line 78: | ||
} |
} |
||
} |
} |
||
char *allow= malloc(4*(bd0+1)*bd0); |
|||
memset(allow, 1, 4*(bd0+1)*bd0); |
|||
memset(allow, 1, 4*stride); |
|||
for (int i= 0; i<bd0; i++) { |
for (int i= 0; i<bd0; i++) { |
||
for (int j= 0; j<bd0; j++) { |
for (int j= 0; j<bd0; j++) { |
||
Line 156: | Line 153: | ||
return tile; |
return tile; |
||
} |
} |
||
int main() { |
int main() { |
||
int bdims[3]= {5,3,3}; |
int bdims[3]= {5,3,3}; |