#include #include #include #include int pos[8][8][6]; #define TM 0 #define TL 1 #define BL 2 #define BM 3 #define BR 4 #define TR 5 #define COLUMNS 450 void generate_SVG(const char *fn); int main(int argc, char *argv[]) { for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) for (int s = 0; s < 6; s++) pos[i][j][s] = -1; int nr = 128; for (int i = 0; i < 8; i++) for (int j = 0; j+1 < 8; j++) { pos[i ][j ][BM] = nr; pos[i ][j+1][TM] = nr; nr += 2; } for (int i = 0; i+1 < 8; i += 2) for (int j = 0; j < 8; j++) { pos[i ][j ][BR] = nr; pos[i+1][j ][TL] = nr; nr += 2; } for (int i = 1; i+1 < 8; i += 2) for (int j = 0; j+1 < 8; j++) { pos[i ][j ][BR] = nr; pos[i+1][j+1][TL] = nr; nr += 2; } for (int i = 0; i < 8; i += 2) for (int j = 1; j < 8; j++) { pos[i ][j ][TR] = nr; pos[i+1][j-1][BL] = nr; nr += 2; } for (int i = 1; i+1 < 8; i += 2) for (int j = 0; j < 8; j++) { pos[i ][j ][TR] = nr; pos[i+1][j ][BL] = nr; nr += 2; } if (nr != COLUMNS) { printf("ERROR %d != 444\n", nr); return -1; } if (argc > 1) { generate_SVG(argv[1]); return 0; } for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { int count = 0; for (int p = 0; p < 64; p++) { bool okay = true; for (int b = 0; b < 6; b++) if (pos[i][j][b] == -1 && ((p >> b) & 1) == 1) { okay = false; break; } if (okay) { count++; printf("%d,%d", i + 8*j, 64 + p); char line[444]; for (int k = 0; k < COLUMNS; k++) line[k] = 0; for (int b = 0; b < 6; b++) if (pos[i][j][b] != -1) { bool bit = ((p >> b) & 1) == (b < 3); line[pos[i][j][b] + bit] = 1; } for (int k = 0; k < COLUMNS; k++) if (line[k] == 1) printf(",%d", k); printf(" %d,%d,%d\n", i, j, p); } } // printf("A %03d\n", count); } return 0; } void generate_SVG(const char *fn) { FILE *f = fopen(fn, "r"); if (f == NULL) { fprintf(stderr, "Cannot open file %s\n", fn); return; } int matrix[8][8]; char buffer[501]; fgets(buffer, 500, f); for (char *s = buffer; *s > ' ';) { int x,y,p; sscanf(s, "%d,%d,%d", &x, &y, &p); while (('0' <= *s && *s <= '9') || *s == ',') s++; if (*s == '|') s++; if (0 <= x && x < 8 && 0 <= y && y < 8 && 0 <= p && p < 64) matrix[x][y] = p; else fprintf(stderr, "%d,%d,%d is incorrect\n", x, y, p); } int dd[6]; dd[0] = 1 << TL; dd[1] = 1 << TM; dd[2] = 1 << TR; dd[3] = 1 << BR; dd[4] = 1 << BM; dd[5] = 1 << BL; FILE *fout = stdout; fprintf(fout, "\n", 1000, 1000); int g = 30; int g02 = (int)round(g*0.2); int g05 = (int)round(g*0.5); int g12 = (int)round(g*1.2); int g14 = (int)round(g*1.4); int g16 = (int)round(g*1.6); int g18 = (int)round(g*1.8); double sqrt3 = sqrt(3); int h = (int)round(g*sqrt3); int h02 = (int)round(0.2*g*sqrt3); int h04 = (int)round(0.4*g*sqrt3); int h06 = (int)round(0.6*g*sqrt3); int h07 = (int)round(0.7*g*sqrt3); int h08 = (int)round(0.8*g*sqrt3); int h13 = (int)round(1.3*g*sqrt3); int h018 = (int)round(0.18*g*sqrt3); int h012 = (int)round(0.13*g*sqrt3); fprintf(stderr, "%d %d\n", h018, h012); int extra = 0; for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { int x = (g + extra) * (3*i + 2); int y = (h + extra) * (2*j + 1 + (i % 2 == 1 ? 1 : 0)); int d = matrix[i][j]; fprintf(fout, "\n"); int ys = y - 2*h018 - h012; for (int l = 0; l < 6; l++) { if (d & dd[l]) { fprintf(fout, "\n", x-g, ys, x-g02, ys); fprintf(fout, "\n", x+g02, ys, x+g, ys); } else fprintf(fout, "\n", x-g, ys, x+g, ys); ys += l == 2 ? 2*h012 : h018; } } fprintf(fout, "\n"); #define SIDE(S,V) ((matrix[x][y] >> V) & 1) ? S : ' ' for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) fprintf(stderr, " %c%c%c", SIDE('/', TL), SIDE('-', TM), SIDE('\\', TR)); fprintf(stderr, "\n"); for (int x = 0; x < 8; x++) fprintf(stderr, " %c%c%c", SIDE('\\', BL), SIDE('-', BM), SIDE('/', BR)); fprintf(stderr, "\n\n"); } fclose(f); }