Wave function collapse: Difference between revisions

Content added Content deleted
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<tdim[0]; i++) {
for (int i= 0; i<td0; i++) {
for (int j=0; j<td1; j++) {
for (int j=0; j<td1; j++) {
adj[XYZ(i,j,0,td1,4)]= XY(MOD(i-1, td0), MOD(j, td1), td1); /* above (index 1 in a 3x3 grid) */
int k= j+td1*i;
adj[XYZ(i,j,1,td1,4)]= XY(MOD(i, td0), MOD(j-1, td1), td1); /* left (index 3 in a 3x3 grid) */
int m= 4*k;
adj[XY(k,0,4)]= XY(MOD(i-1, td0), MOD(j, td1), td1); /* above (index 1 in a 3x3 grid) */
adj[XYZ(i,j,2,td1,4)]= XY(MOD(i, td0), MOD(j+1, td1), td1); /* right (index 5 in a 3x3 grid) */
adj[XY(k,1,4)]= XY(MOD(i, td0), MOD(j-1, td1), td1); /* left (index 3 in a 3x3 grid) */
adj[XYZ(i,j,3,td1,4)]= XY(MOD(i+1, td0), MOD(j, td1), td1); /* below (index 7 in a 3x3 grid) */
adj[XY(k,2,4)]= XY(MOD(i, td0), MOD(j+1, td1), td1); /* right (index 5 in a 3x3 grid) */
adj[XY(k,3,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[j+i*bd0]= 1;
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:
}
}
}
}
int stride= (bd0+1)*bd0;
char *allow= malloc(4*(bd0+1)*bd0);
char *allow= malloc(4*stride);
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};