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; }
bool rectangle_superposition (rectangle r1, rectangle r2) { rectangle inter = rectangle_intersection (r1,r2); return inter.w && inter.h; }