Index: work/gpstroke/cap.c =================================================================== --- work/gpstroke/cap.c (revision 7394) +++ work/gpstroke/cap.c (revision 7395) @@ -12,6 +12,10 @@ #define DUMPDIR "/tmp/gpstroke/" +#define STROKE_PENALTY 150 +#define MAX_TH 12 +#define MIN_TH 8 + #define MAX_STROKES 64 int max_strokes = 16; image_t *ref, *canvas; @@ -28,6 +32,7 @@ long *black; long black_len; +double stroke_penalty; /* Random value between from and to, inclusive */ int myrand(int from, int to) @@ -41,7 +46,7 @@ s->x2 = myrand(0, ref->sx-1); s->y1 = myrand(0, ref->sy-1); s->y2 = myrand(0, ref->sy-1); - s->th = myrand(1, 20); + s->th = myrand(1, MAX_TH); } pcb_t *default_new = NULL; @@ -143,6 +148,8 @@ return cnt; } +#define clamp(v, min, max) ((v) < (min) ? (min) : ((v) > (max) ? (max) : (v))) + static inline void pcb_draw(image_t *img, pcb_t *p) { int n; @@ -149,7 +156,7 @@ draw_color(pixel_black); for(n = 0; n < p->len; n++) - draw_pcb_line(img, p->str[n].x1, p->str[n].y1, p->str[n].x2, p->str[n].y2, p->str[n].th); + draw_pcb_line(img, p->str[n].x1, p->str[n].y1, p->str[n].x2, p->str[n].y2, clamp(p->str[n].th, MIN_TH, MAX_TH)); } double pcb_score(void *data) @@ -160,7 +167,7 @@ pcb_clear(canvas); pcb_draw(canvas, data); scr = pcb_diff(canvas, ref); - return scr + (p->len+1)*50.0; + return scr + (p->len+1) * stroke_penalty; } static inline void pcb_mutate_add(pcb_t *p) @@ -283,6 +290,8 @@ black = malloc(sizeof(long) * black_len); black_len = pcb_list_black(ref, black); + stroke_penalty = ref->sx * ref->sy / STROKE_PENALTY; + canvas = image_new(ref->sx, ref->sy); gp_setup(&pop);