]> mj.ucw.cz Git - leo.git/commitdiff
Labelling: Segments: A bunch of improvements
authorKarryanna <karry@karryanna.cz>
Wed, 10 Jun 2015 12:09:26 +0000 (14:09 +0200)
committerKarryanna <karry@karryanna.cz>
Wed, 10 Jun 2015 12:09:26 +0000 (14:09 +0200)
• 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

labeller.c

index a747552c0b6004ac82123dfa25a52ae01d4ba137..5340aed67052c65030d8c1f5aff9a99c6a5a0746 100644 (file)
@@ -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)