spectre_adjacent: optionally report dst_edge.

Previously, you'd ask this function 'What lies on the other side of
edge #i of this Spectre tile?' and it would tell you the identity of
another Spectre. Now it will also tell you which _edge_ of that
Spectre adjoins the specified edge of the input one. This will be used
in the extra spectre-test mode I'm about to add.
This commit is contained in:
Simon Tatham
2023-06-18 13:33:28 +01:00
parent 68a1e8413c
commit 14db5e0145
2 changed files with 5 additions and 3 deletions

View File

@ -243,7 +243,7 @@ void spectrectx_step_hex(SpectreContext *ctx, SpectreCoords *sc,
* delivering both plane and combinatorial coordinates as they go */ * delivering both plane and combinatorial coordinates as they go */
Spectre *spectre_initial(SpectreContext *ctx); Spectre *spectre_initial(SpectreContext *ctx);
Spectre *spectre_adjacent(SpectreContext *ctx, const Spectre *src_spec, Spectre *spectre_adjacent(SpectreContext *ctx, const Spectre *src_spec,
unsigned src_edge); unsigned src_edge, unsigned *dst_edge);
/* For extracting the point coordinates */ /* For extracting the point coordinates */
typedef struct Coord { typedef struct Coord {

View File

@ -154,7 +154,7 @@ Spectre *spectre_initial(SpectreContext *ctx)
} }
Spectre *spectre_adjacent(SpectreContext *ctx, const Spectre *src_spec, Spectre *spectre_adjacent(SpectreContext *ctx, const Spectre *src_spec,
unsigned src_edge) unsigned src_edge, unsigned *dst_edge_out)
{ {
unsigned dst_edge; unsigned dst_edge;
Spectre *dst_spec = snew(Spectre); Spectre *dst_spec = snew(Spectre);
@ -162,6 +162,8 @@ Spectre *spectre_adjacent(SpectreContext *ctx, const Spectre *src_spec,
spectrectx_step(ctx, dst_spec->sc, src_edge, &dst_edge); spectrectx_step(ctx, dst_spec->sc, src_edge, &dst_edge);
spectre_place(dst_spec, src_spec->vertices[(src_edge+1) % 14], spectre_place(dst_spec, src_spec->vertices[(src_edge+1) % 14],
src_spec->vertices[src_edge], dst_edge); src_spec->vertices[src_edge], dst_edge);
if (dst_edge_out)
*dst_edge_out = dst_edge;
return dst_spec; return dst_spec;
} }
@ -454,7 +456,7 @@ void spectrectx_generate(SpectreContext *ctx,
for (edge = 0; edge < 14; edge++) { for (edge = 0; edge < 14; edge++) {
Spectre *new_spec; Spectre *new_spec;
new_spec = spectre_adjacent(ctx, spec, edge); new_spec = spectre_adjacent(ctx, spec, edge, NULL);
if (find234(placed, new_spec, NULL)) { if (find234(placed, new_spec, NULL)) {
spectre_free(new_spec); spectre_free(new_spec);