Graphics 计算具有厚度的线的边界框

Graphics 计算具有厚度的线的边界框,graphics,trigonometry,cairo,bounding-box,Graphics,Trigonometry,Cairo,Bounding Box,我在计算特定直线的边界框时遇到问题。 我在下图中绘制了三种类型的线 线由3个点(标记为红色)指定,但可以有任意数量的点。这些线可以有不同的线帽: 无线帽 矩形帽(线条为线条宽度/末端长2) 圆盖(带半径线的圆\u宽度/2) 是否有可能使用Cairo这样的图形框架创建这样一条线,并从Cairo中获取边界框,或者我必须自己使用三角法计算它 我用C语言编程 我已经有了一个计算多边形边界框的函数。是否有一种简单的方法将这些线转换为多边形,以便我可以使用现有的函数 我问这个问题是因为我希望有人有一个有效

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

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

  • 无线帽
  • 矩形帽(线条为线条宽度/末端长2)
  • 圆盖(带半径线的圆\u宽度/2)
  • 是否有可能使用Cairo这样的图形框架创建这样一条线,并从Cairo中获取边界框,或者我必须自己使用三角法计算它

    我用C语言编程

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

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


    编辑 我找到了开罗的以下链接。它似乎支持以下线型:


    我想补充一句:我从未使用过开罗。我只是在找的时候偶然发现的。我是一个完全的初学者。

    我发现了开罗,它正是我所需要的。 我在无限记录面内绘制对象,并让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);
    }