aboutsummaryrefslogtreecommitdiff
path: root/grid.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2011-05-06 17:09:03 +0000
committerSimon Tatham <anakin@pobox.com>2011-05-06 17:09:03 +0000
commit4a172274f2abde1c2ad23ba46b183e1d767fb902 (patch)
treee8b39e62d938bb5a7e5a20fff144a88a42dea7a1 /grid.c
parent5619904bcc12427e88a05281872231f69f06180d (diff)
downloadpuzzles-4a172274f2abde1c2ad23ba46b183e1d767fb902.zip
puzzles-4a172274f2abde1c2ad23ba46b183e1d767fb902.tar.gz
puzzles-4a172274f2abde1c2ad23ba46b183e1d767fb902.tar.bz2
puzzles-4a172274f2abde1c2ad23ba46b183e1d767fb902.tar.xz
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.) [originally from svn r9168]
Diffstat (limited to 'grid.c')
-rw-r--r--grid.c13
1 files changed, 5 insertions, 8 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);