Reputation: 625
I have a problem calculating the bounding boxes of specific lines. I have drawn the three types of lines I use in the following figure.
The lines are specified by 3 points (marked red) but can have an arbitrary number of points. The lines can have different line caps:
Is it possible to create such a line using a graphics framework like Cairo and get the bounding box out of Cairo, or do I have to calculate it using trigonometric approaches on my own?
I program in C.
I already have a function to calculate the bounding box of a polygon. Is there an easy way to convert these lines into polygons so that I can use my existing functions?
I'm asking this question because I hope someone has an efficient approach to solving this problem. My program has to parse a big graphics file with a lot of these lines and extract the individual bounding boxes.
I have found following link for Cairo. It seems to support these line types: Cairo line caps
I wanted to add: I have never used Cairo. I just stumbled across it during my search. I am a complete beginner with it.
Upvotes: 3
Views: 893
Reputation: 625
I have discovered the Cairo Recoding Surface which exactly does, what I need. I draw my objects inside the unlimited recording surface and let Cairo compute the bounding box.
A small example that creates some lines and calculates the bounding box looks as follows:
void main(void)
{
cairo_surface_t *rec;
cairo_t *cr;
double x0, y0, width, height;
rec = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, NULL);
cr = cairo_create(rec);
cairo_scale(cr, 10, 10);
cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_width(cr, 2);
cairo_move_to(cr, 0, 0);
cairo_rel_line_to(cr, 0, 20);
cairo_rel_line_to(cr, 5, 0);
cairo_rel_line_to(cr, 1, 1);
cairo_stroke(cr);
cairo_recording_surface_ink_extents(rec, &x0, &y0, &width, &height);
printf("Size: %lf / %lf at (%lf, %lf)\n", width, height, x0, y0);
}
Upvotes: 5