Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
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);
  }
}