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);
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;
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;
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;
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;
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)