首页 > 解决方案 > 用粗细计算线的边界框

问题描述

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

不同大写的线条

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

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

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

我用C编程。

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

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


编辑

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

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

标签: graphicstrigonometrycairobounding-box

解决方案


我发现了 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);
}

推荐阅读