graphics - 用粗细计算线的边界框
问题描述
我在计算特定线条的边界框时遇到问题。我已经绘制了我在下图中使用的三种类型的线。
这些线由 3 个点(标记为红色)指定,但可以有任意数量的点。这些行可以有不同的行帽:
- 没有线帽
- 矩形帽(线的末端为 line_width/2 长)
- 圆帽(半径为 line_width/2 的圆)
是否可以使用像 Cairo 这样的图形框架创建这样的线并将边界框从 Cairo 中取出,还是我必须自己使用三角法计算它?
我用C编程。
我已经有一个计算多边形边界框的函数。有没有一种简单的方法可以将这些线转换为多边形,以便我可以使用现有的函数?
我问这个问题是因为我希望有人有一种有效的方法来解决这个问题。我的程序必须解析一个包含大量这些行的大图形文件并提取各个边界框。
编辑
我找到了开罗的以下链接。它似乎支持这些线型: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);
}
推荐阅读
- python - 如何在 try-except-else 语句中引发异常
- php - PHP 7.4 中不推荐使用嵌套三元表达式(不带括号)。针对 PHP 8.0.0
- biginteger - 有没有一种节省空间的方法来计算高指数的 gcd?
- mongodb - 跳过值必须为非负数,但已收到:-1
- flutter - Flutter - 如何向 Widget 添加动画,以便在按下按钮时滑入视图?
- php - 无法使用 Laravel+vue UI 登录
- python - 我在对我的公共 shopify 应用程序进行身份验证时遇到问题
- kdb - 如何替换 KDB 列表中的项目?
- r - 从数据框列表创建平均数据框
- google-analytics - 分析 API 的每日错误限制何时重置?