ref: eeec6b867af104a93a615a285a29fab91d8709d4
parent: 899c7c41efb2bcc8da8121cc7a8f4fccf5eb9b1e
author: Ben Harris <bjh21@bjh21.me.uk>
date: Mon Aug 14 13:13:01 EDT 2023
Untangle: make snapping grid invariant under window resize In grid-snapping mode, Untangle was still recording vertex positions in increments of one pixel. This meant that if you positioned vertices on a small window, then enlarged the window and positioned more vertices, the two sets of vertices generally wouldn't line up with one another. This was annoying, and obviously silly when Untangle has a resolution-independent co-ordinate system. So now the snapped positions are recorded in a form that doesn't depend on the tilesize.
--- a/untangle.c
+++ b/untangle.c
@@ -1159,18 +1159,18 @@
*/
int d = state->params.n - 1;
+ /* Calculate position in terms of the snapping grid. */
x = d * x / (state->w * ds->tilesize);
- x *= (state->w * ds->tilesize) / d;
- x += (state->w * ds->tilesize) / (2*d);
-
y = d * y / (state->h * ds->tilesize);
- y *= (state->h * ds->tilesize) / d;
- y += (state->h * ds->tilesize) / (2*d);
+ /* Convert to standard co-ordinates, applying a half-square offset. */
+ ui->newpoint.x = (x * 2 + 1) * state->w;
+ ui->newpoint.y = (y * 2 + 1) * state->h;
+ ui->newpoint.d = d * 2;
+ } else {
+ ui->newpoint.x = x;
+ ui->newpoint.y = y;
+ ui->newpoint.d = ds->tilesize;
}
-
- ui->newpoint.x = x;
- ui->newpoint.y = y;
- ui->newpoint.d = ds->tilesize;
}
static char *interpret_move(const game_state *state, game_ui *ui,