计算粗线的边界框

时间:2018-07-06 12:26:52

标签: graphics trigonometry cairo bounding-box

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

lines with different caps

线由3点(标记为红色)指定,但可以具有任意数量的点。线可以具有不同的线帽:

  1. 没有线帽
  2. 矩形盖(线的两端是line_width / 2长)
  3. 圆帽(半径为line_width / 2的圆)

是否可以使用诸如Cairo之类的图形框架创建这样的线并将边界框移出Cairo,还是我必须自己使用三角学方法来计算边界线?

我用C编程

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

我之所以问这个问题,是因为我希望有人能够以有效的方式解决此问题。我的程序必须使用许多这样的行来解析一个大的图形文件,并提取各个边界框。


编辑

我找到了开罗的以下链接。似乎支持以下线型:Cairo line caps

我想补充一点:我从未使用过开罗。我在搜索过程中偶然发现了它。我是一个完整的初学者。

1 个答案:

答案 0 :(得分:1)

我发现了开罗Recoding Surface确实可以满足我的需要。 我在无限的记录表面内绘制对象,然后让开罗计算边界框。

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

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