void aadldata_project_point_on_nearest_border(Aadlbox *aadlbox,Point *p,real *angle) { Rectangle rectangle; rectangle.left = aadlbox->element.corner.x; rectangle.top = aadlbox->element.corner.y; rectangle.right = aadlbox->element.corner.x + aadlbox->element.width; rectangle.bottom = aadlbox->element.corner.y + aadlbox->element.height; aadlbox_project_point_on_rectangle(&rectangle, p, angle); }
void aadlbox_inclined_project_point_on_nearest_border(Aadlbox *aadlbox,Point *p, real *angle) { /* ++++++B------------+ +----------++++++++ + /000000000000/+ |0000000000| + + /000000000000/ + |0000000000| + + /000000000000/ + ----------> |0000000000| + + /000000000000/ + |0000000000| + +/000000000000/ + |0000000000| + A------------ ++++++ +----------++++++++ */ Rectangle rectangle; real w, h, delta_y, delta_x; w = aadlbox->element.width; h = aadlbox->element.height; rectangle.top = aadlbox->element.corner.y; rectangle.left = aadlbox->element.corner.x; rectangle.bottom = aadlbox->element.corner.y + h; rectangle.right = aadlbox->element.corner.x + w - w * AADLBOX_INCLINE_FACTOR; delta_y = h - (p->y - aadlbox->element.corner.y); delta_x = delta_y * (w * AADLBOX_INCLINE_FACTOR) / h; p->x -= delta_x; aadlbox_project_point_on_rectangle(&rectangle, p, angle); delta_y = h - (p->y - aadlbox->element.corner.y); delta_x = delta_y * (w * AADLBOX_INCLINE_FACTOR) / h; p->x += delta_x; }
static void aadlbus_project_point_on_nearest_border(Aadlbox *aadlbox,Point *p, real *angle) { Element *element = &aadlbox->element; real w = element->width; real h = element->height; /* top left corner */ coord x1 = element->corner.x; coord y1 = element->corner.y; /* bottom right corner */ coord x2 = element->corner.x + w; coord y2 = element->corner.y + h; if ( p->x >= x1 + w*AADL_BUS_ARROW_SIZE_FACTOR && p->x <= x2 - w*AADL_BUS_ARROW_SIZE_FACTOR) { Rectangle rectangle; rectangle.left = x1 + w*AADL_BUS_ARROW_SIZE_FACTOR; rectangle.top = y1 + h*AADL_BUS_HEIGHT_FACTOR; rectangle.right = x2 - w*AADL_BUS_ARROW_SIZE_FACTOR; rectangle.bottom = y2 - h*AADL_BUS_HEIGHT_FACTOR; aadlbox_project_point_on_rectangle(&rectangle, p, angle); } else { Point a, b, c, m; real k1, k2; /* left arrow */ if (p->x < x1 + w*AADL_BUS_ARROW_SIZE_FACTOR) { *angle = M_PI; /* m b ° /| / | / | a---c */ a.x = x1; a.y = y1 + h*0.5; b.x = x1 + w*AADL_BUS_ARROW_SIZE_FACTOR; b.y = (p->y<y1+0.5*h)?y1:y2; /* up or down */ c.x = b.x; c.y = a.y; } /* right arrow */ else { *angle = 0; a.x = x2; a.y = y1 + h*0.5; b.x = x2 - w*AADL_BUS_ARROW_SIZE_FACTOR; b.y = (p->y<y1+0.5*h)?y1:y2; /* up or down */ c.x = b.x; c.y = a.y; } point_copy(&m, p); /* intersection between (AB) and (MC) */ k1 = (b.y - a.y) / (b.x - a.x); k2 = (m.y - c.y) / (m.x - c.x); p->x = (m.y - a.y + k1*a.x - k2*m.x) / (k1 - k2); p->y = a.y + k1 * (p->x - a.x); } }