//#define OLDDIR 1 /* last 2 bits are used for the fold type * next 2 bits for direction * * MAXFOLDS must be 4 * FOLDMASK must be 3 * DIROVER must be 16 * DIRMASK must be 12 */ #define FOLDBITS 2 #define DIRBITS 2 #define MAXFOLDS (1 << FOLDBITS) #define DIRSHIFT FOLDBITS #define FOLDMASK (MAXFOLDS - 1) #define DIROVER (MAXFOLDS << DIRBITS) #define MAXDIRS (1 << DIRBITS) #define DIRMASK ((MAXDIRS - 1) << DIRSHIFT) #define DX 0 #define ALTO (1 << DIRSHIFT) #define SX (2 << DIRSHIFT) #define BASSO (3 << DIRSHIFT) //#define E 0 //#define N (1 << DIRSHIFT) //#define W (2 << DIRSHIFT) //#define S (3 << DIRSHIFT) /* fold types: * NF: no fold (go straight) * MF: mountain fold * VF: valley fold */ #define FIRSTFOLD 0 #define NF 0 #define MF 1 #define VF 2 #define LASTFOLD 2 #define ISSLASH 1 #define ISBSLASH 2 #define SEQDIM 20 #define MAXDIMBOX 9 #define ERR_WRONGLEN 101 #define ERR_INVCHAR 102 #define ERR_SUPERPOSEDTILES 201 #define ERR_SELFINTERSECTION 202 #define ERR_NOTCLOSED 203 #define ERR_NOTORIENTABLE 204 /* stucts */ struct seqstruct { int type; short int seq[SEQDIM]; }; typedef struct seqstruct sequence; /* variabili globali */ static char chardir[MAXDIRS]; static char charfold[MAXFOLDS]; static int rotright[DIROVER]; static int rotleft[DIROVER]; static int verbose = 0; static int quiet = 0; static int debug = 0; static int nocanon = 0; static int seqlen = 8; static int filtermetric = 0; static int filterlinking = 0; static int checkorientable = 1; static int checkerrno = 0; static int cycle = 0; static int outwarpcode = 0; static int outbox = 1; static int outpolyo = 1; static int ribbontouchings = 0; static int ribboncrossings = 0; static int minribboncrossings = -1; static int verify = 0; static int off = 0; /* prototipi */ void action (sequence *seq, sequence *dseq, int revert, int rotate, int mirror, int inout, int spin); void init_data (void); void printseq (sequence *seq); void readseq (sequence *seq, char *stringa); void printseqinfo (sequence *seq); void computewarpcode (sequence *seq, int code[SEQDIM]); void printwarpcode (int code[SEQDIM]); void canonify (sequence *seq); void canonifywarpcode (int code[SEQDIM]); void firstsequence (sequence *seq); int nextsequence (sequence *seq); int nextsequencerec (sequence *seq, int start); int checkvalid (sequence *seq, int uptohere); int cannotbecanon (sequence *seq); int seqcmp (sequence *seq1, sequence *seq2); void seqcpy (sequence *seq1, sequence *seq2); void newposition (int dir, int fold, int *posizione, int *freccia, int *normale, int *nposizione, int *nfreccia, int *nnormale, int *hinge); void veccpy (int *res, int *v); void vecneg (int *res); void vecsum (int *res, int *v1, int *v2); void vecdiff (int *res, int *v1, int *v2); void vecprod (int *res, int *v1, int *v2); int veceq (int *v1, int *v2); void vecprint (int *v); int countsymmetries (sequence *seq); int countflaps (sequence *seq); int computebox (sequence *seq, int box[3]); int isstraight (int in, int out); int iscurving (int in, int out); int iscurvingleft (int in, int out); int iscurvingright (int in, int out); int isflap (int in, int out); int isascending (int in, int out); int isdescending (int in, int out); int ishorizontal (int in); int isvertical (int in); int deltatile (int in, int out, int type); int computedelta (sequence *seq); int istypeinvariant (sequence *seq); int computelinking (sequence *seq); int computelt (sequence *seq); int computelf (sequence *seq); int computelc (sequence *seq); int ribbonpath (sequence *seq, int *xpt, int *ypt, int *zpt, int bufdim); void printribbonpath (int *x, int *y, int *z, int rl); void printoff (sequence *seq, FILE *out); void checkribbonpath (int *x, int *y, int *z, int rl); int ribboncrossing (int a[3], int b[3], int c[3], int d[3]); int polyominoid (sequence *seq, int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); void printpolyominoid (int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); void traslatepolyominoid (int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int maxpos[3]); int optimalpolyominoid (int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int maxpos[3]); void polyominoidzero (int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); void polyocpy (int polyores[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); void polyominoidsym (int polyores[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int perm, int xneg, int yneg, int zneg, int boxdim[3]); int polyominoidcmp (int polyo1[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX], int polyo2[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); void readpolyominoid (char *s, int polyo[MAXDIMBOX][MAXDIMBOX][MAXDIMBOX]); int verifyinvariance (sequence *seq);