【问题标题】:Calculate bounding box of line with thickness用粗细计算线的边界框
【发布时间】:2018-07-06 12:26:52
【问题描述】:

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

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

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

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

我用 C 编程。

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

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


编辑

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

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

【问题讨论】:

    标签: graphics trigonometry cairo bounding-box


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 2013-02-28
      相关资源
      最近更新 更多