diff options
Diffstat (limited to 'src/pattern/pattern.h')
-rw-r--r-- | src/pattern/pattern.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/pattern/pattern.h b/src/pattern/pattern.h new file mode 100644 index 0000000..d53576e --- /dev/null +++ b/src/pattern/pattern.h @@ -0,0 +1,93 @@ +#ifndef PLOC_GEN_PATTERN_PATTERN_H +#define PLOC_GEN_PATTERN_PATTERN_H + +#include <stdbool.h> + +struct coord +{ + int x; + int y; +}; + +struct pattern_type +{ + int width; + int height; + int min_length; + int max_length; +}; + +struct pattern +{ + struct pattern_type type; + struct coord *path; + int length; +}; + +/* + * Creates a pattern_type. + * If max has an invalid value the max_length is set to the + * maximum possible length. + */ +struct pattern_type gen_pattern_type(int side_len, int min, int max); + +/* + * Returns 0 if a equals b. + */ +int coord_cmp(const void *a, const void *b); + +/* + * If the point happend to be on the line that connects start and end, + * the result is true, otherwise is false. + */ +bool is_in_line(struct coord a, struct coord c, struct coord b); + +/* + * Returns the index of coord in pattern->path. + * The return value is negative if coord not found in pattern->path. + */ +int find_in_pattern(struct pattern *pattern, struct coord *coord); + +/* + * Gives back the points in arr, that are between from and to. + */ +int inbetween(int width, int height, struct coord *from, struct coord *to, struct coord *arr); + +/* + * Returns true if there's no unvisited point between + * the last point of path and next. + */ +bool nothing_inbetween(struct pattern *pattern, struct coord *next); + +/* + * Inline functions. + */ +inline bool len_is_max(struct pattern *pattern) +{ + return pattern->length >= pattern->type.max_length; +} + +inline bool len_is_min(struct pattern *pattern) +{ + return pattern->length <= pattern->type.min_length; +} + +inline int coord_to_index(int width, struct coord point) +{ + return (point.y * width) + point.x; +} + +inline struct coord index_to_coord(int width, int index) +{ + struct coord result; + result.y = index / width; + result.x = index % width; + return result; +} + +inline int pattern_point_to_index(struct pattern *pattern, int index) +{ + return coord_to_index(pattern->type.width, pattern->path[index]); +} + +#endif
\ No newline at end of file |