计算具有粗细的线的边界框

Calculate bounding box of line with thickness

我在计算特定行的边界框时遇到问题。 我在下图中绘制了我使用的三种类型的线。

线条由 3 个点(标记为红色)指定,但可以有任意数量的点。这些行可以有不同的行上限:

  1. 没有线上限
  2. 矩形帽(线在末端 line_width/2 更长)
  3. 圆帽(半径为line_width/2的圆)

是否可以使用像 Cairo 这样的图形框架创建这样一条线并将边界框从 Cairo 中取出,还是我必须自己使用三角函数方法来计算它?

我用 C 编程。

我已经有了计算多边形边界框的函数。有没有一种简单的方法可以将这些线转换为多边形,以便我可以使用现有的功能?

我问这个问题是因为我希望有人有解决这个问题的有效方法。我的程序必须解析包含大量这些行的大型图形文件并提取各个边界框。


编辑

我发现关注 link 开罗。它似乎支持这些行类型:Cairo line caps

补充一下:我没用过开罗。我在搜索过程中偶然发现了它。我完全是初学者。

我发现了 Cairo Recoding Surface,它正是我所需要的。 我在无限记录表面内绘制对象,让 Cairo 计算边界框。

创建一些线并计算边界框的小示例如下所示:

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);
}