From: Karryanna Date: Wed, 10 Jun 2015 12:09:26 +0000 (+0200) Subject: Labelling: Segments: A bunch of improvements X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=63549401134446b1ffedc1e128ba9e4e045451fd;p=leo.git Labelling: Segments: A bunch of improvements • Missing prototypes for create/delete map links • Removed debug print (committed accidentaly) • Hiding/unhiding segment labels after crossover • Better way to choose variant for segment labels • Distance penalty for segment labels • Hopefully more reasonable placement init for segments --- diff --git a/labeller.c b/labeller.c index a747552..5340aed 100644 --- a/labeller.c +++ b/labeller.c @@ -161,6 +161,8 @@ void gen_coords_area(struct placement *p); struct map_part **get_map_parts(struct placement *p); void update_map_parts(struct placement *p); +void update_map_parts_delete(struct placement *p); +void update_map_parts_create(struct placement *p); struct placement **get_closure(struct placement *placement); void copy_symbols(struct placement **closure, struct individual *parent, struct individual *child, bool **processed_ptr); struct placement **get_overlapping(struct placement *p); @@ -871,7 +873,6 @@ void make_segments(void) rs->slope = (rs->y2 - rs->y1) / (rs->x2 - rs->x1); ((struct sym_text *) rs->label)->rotate = atan(rs->slope) * (-180 / M_PI); struct variant *v = GARY_PUSH(rs->request.variants); - printf("Request %d\n", rs->request.ind); make_bitmap(v, rs->label); rs->zindex = e->zindex; @@ -1350,7 +1351,10 @@ struct individual **perform_crossover(struct individual *parent1, struct individ if (conf_mutate_children) { if (randdouble() < conf_mutate_children_prob) perform_mutation(child1); + else hide_segment_labels(child1); + if (randdouble() < conf_mutate_children_prob) perform_mutation(child2); + else hide_segment_labels(child2); } buffer[0] = child1; @@ -1405,11 +1409,13 @@ void perform_mutation(struct individual *individual) switch (p->request->type) { case REQUEST_POINT: - case REQUEST_SEGMENT: case REQUEST_AREA: // Does nothing when there are 0 variants... does it mind? p->variant_used = randint(-1, GARY_SIZE(p->request->variants)); break; + case REQUEST_SEGMENT: + p->variant_used = randint(0, GARY_SIZE(p->request->variants)); + break; case REQUEST_SECTION: p->variant_used = randint(0, GARY_SIZE(((struct request_section *) p->request)->segments)); break; @@ -1553,6 +1559,51 @@ double get_distance(struct placement *p) if (dbg_rank >= VERBOSITY_PLACEMENT) printf("Point placed at [%.2f; %.2f], expected at [%.2f; %.2f]\n", p->x, p->y, rp->x, rp->y); break; + case REQUEST_SEGMENT: ; + struct request_segment *rs = (struct request_segment *) p->request; + struct sym_text *st = (struct sym_text *) rs->label; + + double width = p->request->variants[p->variant_used].width; + double rotated_x = p->x + width * sin(st->rotate / (-180 / M_PI)); + double rotated_y = p->y + width * cos(st->rotate / (-180 / M_PI)); + + if (rs->x1 < rs->x2) + { + if (p->x < rs->x1) + { + dx = rs->x1 - p->x; + dy = rs->y1 - p->y; + } + else if (rotated_x > rs->x2) + { + dx = rotated_x - rs->x2; + dy = rotated_y - rs->y2; + } + else + { + dx = dy = 0; + } + } + else + { + if (p->x < rs->x2) + { + dx = rs->x2 - p->x; + dy = rs->y2 - p->y; + } + else if (rotated_x > rs->x1) + { + dx = rotated_x - rs->x1; + dy = rotated_y - rs->y1; + } + else + { + dx = dy = 0; + } + } + + distance = sqrt(dx*dx + dy*dy); + break; case REQUEST_AREA: ; struct request_area *ra = (struct request_area *) p->request; dx = ra->cx + v->offset_x - p->x; @@ -1791,9 +1842,8 @@ void gen_coords_point(struct placement *p) void gen_coords_segment(struct placement *p) { struct request_segment *rs = (struct request_segment *) p->request; - int a = flip(1, 2); - p->x = (a == 1 ? rs->x1 : rs->x2); - p->y = (a == 1 ? rs->y1 : rs->y2); + p->x = (rs->x1 + rs->x2) / 2; + p->y = (rs->y1 + rs->y2) / 2; } void gen_coords_area(struct placement *p)