mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
Patch from Chris Moore to implement an extra grid type, the 'floret'
pentagonal tiling. [originally from svn r9107]
This commit is contained in:
89
grid.c
89
grid.c
@ -1350,4 +1350,93 @@ grid *grid_new_kites(int width, int height)
|
|||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grid *grid_new_floret(int width, int height)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
/* Vectors for sides; weird numbers needed to keep puzzle aligned with window
|
||||||
|
* -py/px is close to tan(30 - atan(sqrt(3)/9))
|
||||||
|
* using py=26 makes everything lean to the left, rather than right
|
||||||
|
*/
|
||||||
|
int px = 75, py = -26; /* |( 75, -26)| = 79.43 */
|
||||||
|
int qx = 4*px/5, qy = -py*2; /* |( 60, 52)| = 79.40 */
|
||||||
|
int rx = qx-px, ry = qy-py; /* |(-15, 78)| = 79.38 */
|
||||||
|
|
||||||
|
/* Upper bounds - don't have to be exact */
|
||||||
|
int max_faces = 6 * width * height;
|
||||||
|
int max_dots = 9 * (width + 1) * (height + 1);
|
||||||
|
|
||||||
|
tree234 *points;
|
||||||
|
|
||||||
|
grid *g = grid_new();
|
||||||
|
g->tilesize = 2 * px;
|
||||||
|
g->faces = snewn(max_faces, grid_face);
|
||||||
|
g->dots = snewn(max_dots, grid_dot);
|
||||||
|
|
||||||
|
points = newtree234(grid_point_cmp_fn);
|
||||||
|
|
||||||
|
/* generate pentagonal faces */
|
||||||
|
for (y = 0; y < height; y++) {
|
||||||
|
for (x = 0; x < width; x++) {
|
||||||
|
grid_dot *d;
|
||||||
|
/* face centre */
|
||||||
|
int cx = (6*px+3*qx)/2 * x;
|
||||||
|
int cy = (4*py-5*qy) * y;
|
||||||
|
if (x % 2)
|
||||||
|
cy -= (4*py-5*qy)/2;
|
||||||
|
else if (y && y == height-1)
|
||||||
|
continue; /* make better looking grids? try 3x3 for instance */
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx+2*rx , cy+2*ry ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx+2*rx+qx, cy+2*ry+qy); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx+2*qx+rx, cy+2*qy+ry); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx+2*qx , cy+2*qy ); grid_face_set_dot(g, d, 4);
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx+2*qx , cy+2*qy ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx+2*qx+px, cy+2*qy+py); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx+2*px+qx, cy+2*py+qy); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx+2*px , cy+2*py ); grid_face_set_dot(g, d, 4);
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx+2*px , cy+2*py ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx+2*px-rx, cy+2*py-ry); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx-2*rx+px, cy-2*ry+py); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx-2*rx , cy-2*ry ); grid_face_set_dot(g, d, 4);
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx-2*rx , cy-2*ry ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx-2*rx-qx, cy-2*ry-qy); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx-2*qx-rx, cy-2*qy-ry); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx-2*qx , cy-2*qy ); grid_face_set_dot(g, d, 4);
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx-2*qx , cy-2*qy ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx-2*qx-px, cy-2*qy-py); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx-2*px-qx, cy-2*py-qy); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx-2*px , cy-2*py ); grid_face_set_dot(g, d, 4);
|
||||||
|
|
||||||
|
grid_face_add_new(g, 5);
|
||||||
|
d = grid_get_dot(g, points, cx , cy ); grid_face_set_dot(g, d, 0);
|
||||||
|
d = grid_get_dot(g, points, cx-2*px , cy-2*py ); grid_face_set_dot(g, d, 1);
|
||||||
|
d = grid_get_dot(g, points, cx-2*px+rx, cy-2*py+ry); grid_face_set_dot(g, d, 2);
|
||||||
|
d = grid_get_dot(g, points, cx+2*rx-px, cy+2*ry-py); grid_face_set_dot(g, d, 3);
|
||||||
|
d = grid_get_dot(g, points, cx+2*rx , cy+2*ry ); grid_face_set_dot(g, d, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
freetree234(points);
|
||||||
|
assert(g->num_faces <= max_faces);
|
||||||
|
assert(g->num_dots <= max_dots);
|
||||||
|
g->middle_face = g->faces + 6 * ((height/2) * width + (width/2));
|
||||||
|
|
||||||
|
grid_make_consistent(g);
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------- End of grid generators ------------- */
|
/* ----------- End of grid generators ------------- */
|
||||||
|
1
grid.h
1
grid.h
@ -85,6 +85,7 @@ grid *grid_new_snubsquare(int width, int height);
|
|||||||
grid *grid_new_cairo(int width, int height);
|
grid *grid_new_cairo(int width, int height);
|
||||||
grid *grid_new_greathexagonal(int width, int height);
|
grid *grid_new_greathexagonal(int width, int height);
|
||||||
grid *grid_new_octagonal(int width, int height);
|
grid *grid_new_octagonal(int width, int height);
|
||||||
|
grid *grid_new_floret(int width, int height);
|
||||||
grid *grid_new_kites(int width, int height);
|
grid *grid_new_kites(int width, int height);
|
||||||
|
|
||||||
void grid_free(grid *g);
|
void grid_free(grid *g);
|
||||||
|
5
loopy.c
5
loopy.c
@ -253,7 +253,8 @@ static void check_caches(const solver_state* sstate);
|
|||||||
A(Cairo,grid_new_cairo,3,4) \
|
A(Cairo,grid_new_cairo,3,4) \
|
||||||
A(Great-Hexagonal,grid_new_greathexagonal,3,3) \
|
A(Great-Hexagonal,grid_new_greathexagonal,3,3) \
|
||||||
A(Octagonal,grid_new_octagonal,3,3) \
|
A(Octagonal,grid_new_octagonal,3,3) \
|
||||||
A(Kites,grid_new_kites,3,3)
|
A(Kites,grid_new_kites,3,3) \
|
||||||
|
A(Floret,grid_new_floret,1,2)
|
||||||
|
|
||||||
#define GRID_NAME(title,fn,amin,omin) #title,
|
#define GRID_NAME(title,fn,amin,omin) #title,
|
||||||
#define GRID_CONFIG(title,fn,amin,omin) ":" #title
|
#define GRID_CONFIG(title,fn,amin,omin) ":" #title
|
||||||
@ -504,6 +505,7 @@ static const game_params presets[] = {
|
|||||||
{ 5, 4, DIFF_HARD, 5, NULL },
|
{ 5, 4, DIFF_HARD, 5, NULL },
|
||||||
{ 5, 5, DIFF_HARD, 6, NULL },
|
{ 5, 5, DIFF_HARD, 6, NULL },
|
||||||
{ 5, 5, DIFF_HARD, 7, NULL },
|
{ 5, 5, DIFF_HARD, 7, NULL },
|
||||||
|
{ 3, 3, DIFF_HARD, 8, NULL },
|
||||||
#else
|
#else
|
||||||
{ 7, 7, DIFF_EASY, 0, NULL },
|
{ 7, 7, DIFF_EASY, 0, NULL },
|
||||||
{ 10, 10, DIFF_EASY, 0, NULL },
|
{ 10, 10, DIFF_EASY, 0, NULL },
|
||||||
@ -518,6 +520,7 @@ static const game_params presets[] = {
|
|||||||
{ 5, 4, DIFF_HARD, 5, NULL },
|
{ 5, 4, DIFF_HARD, 5, NULL },
|
||||||
{ 7, 7, DIFF_HARD, 6, NULL },
|
{ 7, 7, DIFF_HARD, 6, NULL },
|
||||||
{ 5, 5, DIFF_HARD, 7, NULL },
|
{ 5, 5, DIFF_HARD, 7, NULL },
|
||||||
|
{ 5, 5, DIFF_HARD, 8, NULL },
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user