From a15e5ee340857b4763cede846a3fa52915f278cb Mon Sep 17 00:00:00 2001 From: simon Date: Fri, 6 May 2011 17:09:03 +0000 Subject: [PATCH] Apply the rotation in Penrose grid descriptions by rotating in the 4-vector representation, rather than mucking about with sines and cosines after grid generation. _Should_ make no difference in the generated grids (there's a theoretical risk of an unlucky rounding error just about managing to push some point in or out of bounds, but I think it's vanishingly small), but simplifies the coordinate- flattening procedure, and in particular increases its chance of getting vertical lines actually vertical. (Prior to this change, the game ID 10x10t12:G2554,-31,108_a3b12h0a212a3d102b2a23a2e3b01b0a2c2a0c0 was generating a not-quite-vertical edge at top left, in the Java port but not on Linux; I suspect differences in sin and cos as the cause of the discrepancy. With the rotation done like this, the points' x-coordinates are now computed without reference to their y-coordinates.) git-svn-id: svn://svn.tartarus.org/sgt/puzzles@9168 cda61777-01e9-0310-a592-d414129be87e --- grid.c | 13 +++++-------- penrose.c | 5 ++++- penrose.h | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/grid.c b/grid.c index 4ad8c30..658fd4d 100644 --- a/grid.c +++ b/grid.c @@ -2472,7 +2472,6 @@ static grid *grid_new_greatdodecagonal(int width, int height, char *desc) typedef struct setface_ctx { int xmin, xmax, ymin, ymax; - int aoff; grid *g; tree234 *points; @@ -2488,8 +2487,6 @@ static int set_faces(penrose_state *state, vector *vs, int n, int depth) setface_ctx *sf_ctx = (setface_ctx *)state->ctx; int i; int xs[4], ys[4]; - double cosa = cos(sf_ctx->aoff * PI / 180.0); - double sina = sin(sf_ctx->aoff * PI / 180.0); if (depth < state->max_depth) return 0; #ifdef DEBUG_PENROSE @@ -2499,8 +2496,8 @@ static int set_faces(penrose_state *state, vector *vs, int n, int depth) for (i = 0; i < n; i++) { double tx = v_x(vs, i), ty = v_y(vs, i); - xs[i] = (int)round_int_nearest_away( tx*cosa + ty*sina); - ys[i] = (int)round_int_nearest_away(-tx*sina + ty*cosa); + xs[i] = (int)round_int_nearest_away(tx); + ys[i] = (int)round_int_nearest_away(ty); if (xs[i] < sf_ctx->xmin || xs[i] > sf_ctx->xmax) return 0; if (ys[i] < sf_ctx->ymin || ys[i] > sf_ctx->ymax) return 0; @@ -2602,7 +2599,7 @@ static char *grid_validate_desc_penrose(grid_type type, int width, int height, c static grid *grid_new_penrose(int width, int height, int which, char *desc) { int max_faces, max_dots, tilesize = PENROSE_TILESIZE; - int xsz, ysz, xoff, yoff; + int xsz, ysz, xoff, yoff, aoff; double rradius; tree234 *points; @@ -2635,7 +2632,7 @@ static grid *grid_new_penrose(int width, int height, int which, char *desc) sf_ctx.points = points; if (desc != NULL) { - if (sscanf(desc, "G%d,%d,%d", &xoff, &yoff, &sf_ctx.aoff) != 3) + if (sscanf(desc, "G%d,%d,%d", &xoff, &yoff, &aoff) != 3) assert(!"Invalid grid description."); } else { xoff = yoff = 0; @@ -2654,7 +2651,7 @@ static grid *grid_new_penrose(int width, int height, int which, char *desc) debug(("penrose: x range (%f --> %f), y range (%f --> %f)", sf_ctx.xmin, sf_ctx.xmax, sf_ctx.ymin, sf_ctx.ymax)); - penrose(&ps, which); + penrose(&ps, which, aoff); freetree234(points); assert(g->num_faces <= max_faces); diff --git a/penrose.c b/penrose.c index 7adab03..ccde30d 100644 --- a/penrose.c +++ b/penrose.c @@ -434,7 +434,7 @@ void penrose_count_tiles(int depth, int *nlarge, int *nsmall) * (later mail: this is an overestimate by about 5%) */ -int penrose(penrose_state *state, int which) +int penrose(penrose_state *state, int which, int angle) { vector vo = v_origin(); vector vb = v_origin(); @@ -444,6 +444,9 @@ int penrose(penrose_state *state, int which) vb.b = state->start_size; + vo = v_rotate(vo, angle); + vb = v_rotate(vb, angle); + if (which == PENROSE_P2) return penrose_p2_large(state, 0, 1, vo, vb); else diff --git a/penrose.h b/penrose.h index f7b23e2..ba5ae16 100644 --- a/penrose.h +++ b/penrose.h @@ -42,7 +42,7 @@ struct penrose_state { enum { PENROSE_P2, PENROSE_P3 }; -extern int penrose(penrose_state *state, int which); +extern int penrose(penrose_state *state, int which, int angle); /* Returns the side-length of a penrose tile at recursion level * gen, given a starting side length. */ -- 2.11.0