Exemple #1
0
void
ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect)
{
  Rectangle *r;
  int top,bottom,left,right;
  Rectangle *visible;
  int width, height;

  if (!ddisp->renderer)
    return; /* can happen at creation time of the diagram */
  width = dia_renderer_get_width_pixels (ddisp->renderer);
  height = dia_renderer_get_height_pixels (ddisp->renderer);

  if (!rectangle_intersects(rect, &ddisp->visible))
    return;

  /* Temporarily just do a union of all rectangles: */
  if (ddisp->update_areas==NULL) {
    r = g_new(Rectangle,1);
    *r = *rect;
    rectangle_intersection(r, &ddisp->visible);
    ddisp->update_areas = g_slist_prepend(ddisp->update_areas, r);
  } else {
    r = (Rectangle *) ddisp->update_areas->data;
    rectangle_union(r, rect);
    rectangle_intersection(r, &ddisp->visible);
  }
  
  visible = &ddisp->visible;
  left = floor( (r->left - visible->left)  * (real)width /
		(visible->right - visible->left) ) - 1;
  top = floor( (r->top - visible->top)  * (real)height /
	       (visible->bottom - visible->top) ) - 1; 
  right = ceil( (r->right - visible->left)  * (real)width /
		(visible->right - visible->left) ) + 1;
  bottom = ceil( (r->bottom - visible->top)  * (real)height /
		 (visible->bottom - visible->top) ) + 1;

  ddisplay_add_display_area(ddisp,
			    left, top, 
			    right, bottom);
}
int main() {
  assert(EQ(20, rectangle_area(point(1, 1), point(5, 6))));

  assert(point_in_rectangle(point(0, -1), point(0, -3), 3, 2));
  assert(point_in_rectangle(point(2, -2), point(3, -3), -3, 2));
  assert(!point_in_rectangle(point(0, 0), point(3, -1), -3, -2));
  assert(point_in_rectangle(point(2, -2), point(3, -3), point(0, -1)));
  assert(!point_in_rectangle(point(-1, -2), point(3, -3), point(0, -1)));

  point p, q;
  assert(-1 == rectangle_intersection(point(0, 0), point(1, 1),
                                      point(2, 2), point(3, 3)));
  assert(0 == rectangle_intersection(point(1, 1), point(7, 7),
                                     point(5, 5), point(0, 0), &p, &q));
  assert(EQP(p, point(1, 1)) && EQP(q, point(5, 5)));
  assert(1 == rectangle_intersection(point(1, 1), point(0, 0),
                                     point(0, 0), point(1, 10), &p, &q));
  assert(EQP(p, point(0, 0)) && EQP(q, point(1, 1)));
  assert(2 == rectangle_intersection(point(0, 5), point(5, 7),
                                     point(1, 6), point(2, 5), &p, &q));
  assert(EQP(p, point(1, 6)) && EQP(q, point(2, 5)));

  return 0;
}
Exemple #3
0
bool rectangle_superposition (rectangle r1, rectangle r2)
{
	rectangle inter = rectangle_intersection (r1,r2);
	return inter.w && inter.h;
}