svg - 如何获得笔画的轮廓?

标签 svg raphael d3.js vector-graphics

我想将描边路径转换为填充对象。 (以编程方式,在 JavaScript 中。)

这条线只是一条简单的曲线,一个坐标序列。我可以将这条线渲染为路径,并给它一定厚度的笔划...但我试图获得填充形状而不是描边线,以便我可以对其进行进一步的修改,例如扭曲,因此生成的“笔画”的粗细可能会有所不同,或者会切掉自定义位(据我所知,这些事情对于真正的 SVG 笔画来说都是不可能的)。

所以我试图手动将一条线“加粗”为实体形状。我找不到任何执行此操作的函数 - 我浏览了 D3.js 的文档和 Raphaël ,但没有运气。有谁知道可以执行此操作的库/函数吗?

或者,甚至更好:如果有人可以向我解释如何手动完成此任务的几何理论,通过获取我拥有的线坐标列表并制定一条有效“抚摸”它的新路径,那就会了太棒了。换句话说,当您告诉浏览器描边路径时,浏览器会做什么 - 它如何计算出描边应该是什么形状?

最佳答案

最近也有类似的问题: svg: generate 'outline path'

总而言之,这是一项艰巨的任务。正如我对链接问题的回答中提到的,PostScript 有一个用于生成路径的命令,该路径产生与笔画基本相同的输出,称为 中风路径。如果您在运行我在链接问题中发布的代码时查看 Ghostscript 吐出的内容,就会发现它非常丑陋。甚至 Inkscape 也做得不好。我刚刚在 Inkscape 中尝试了“路径 => 轮廓描边”(我认为这就是英文字幕应该说的),结果看起来与描边路径并不相同。

“最简单”的情况是,如果您只有非自相交的折线、多边形或不包含曲线的路径,因为一般来说,您无法在右侧和右侧绘制精确的“平行”贝塞尔曲线。一条非平凡的贝塞尔曲线的左侧将界定描边区域 - 它在数学上是不存在的。所以你必须以一种或另一种方式来近似它。对于直线段,比较容易找到精确解。

渲染带有曲线/圆弧的矢量路径的经典方法是用足够平滑的折线来近似所有内容。 De Casteljau's Algorithm通常用于将贝塞尔曲线转换为线段。 (这基本上也是您在 Ghostscript 中使用 strokepath 命令时出现的结果。)然后您可以找到分隔平行线段,但必须使用适当的 linejoin 和 miterlimit 规则正确连接它们。当然,不要忘记线帽。

我认为自相交路径可能很棘手,因为路径内可能会出现空心区域,即黑色路径的“交叉区域”可能会变成白色。使用 nonzero winding rule 时,这对于开放路径可能不是问题,但我对此持谨慎态度。对于闭合路径,您可能需要两条“分隔”路径以相反的方向运行。但我现在不确定这是否真的涵盖了所有潜在的陷阱。

很抱歉,如果我对此造成了很多困惑,并且可能没有多大帮助。

关于svg - 如何获得笔画的轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43582329/

相关文章:

python - D3.js 前端和 Python 后端之间的双向流?/网站中的交互式图表

javascript - D3.js 微不足道的工具提示

javascript - map 中浏览器的最大 svg 元素数

html - 如何将 svg + xml 放入 css 样式文档而不将其编码为 base64?

javascript - javascript函数变量数据如何传递到另一个页面

javascript - 为什么在 Raphaël 中拖动会因在气泡阶段的封闭元素中停止 mousemove 的传播而中断?

javascript - 将 SVG 多边形点转换为路径?

javascript - D3 'mouseenter' 并同时缩放

javascript - SVG react 组件未渲染/黑色矩形

jquery - 向上或向下滚动时 Bootstrap 导航栏更改