尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

svgpathtools微分几何工具包:一算切线、法线、曲率的完整用法

svgpathtools微分几何工具包:一算切线、法线、曲率的完整用法 svgpathtools微分几何工具包一算切线、法线、曲率的完整用法【免费下载链接】svgpathtoolsA collection of tools for manipulating and analyzing SVG Path objects and Bezier curves.项目地址: https://gitcode.com/gh_mirrors/sv/svgpathtoolssvgpathtools是一个用 Python 操作和分析 SVG 路径与贝塞尔曲线的开源工具包。它的亮点之一是内置了一整套微分几何工具一行代码即可算出曲线上任意一点的切线tangent、法线normal和曲率curvature非常适合做路径标注、文字沿曲线排版、偏移曲线等图形处理任务。本文用最少的代码带你一次跑通这三个核心方法。为什么需要微分几何级别的 API处理 SVG 路径时我们常会遇到这样的需求 在曲线某一点上竖一根标记线需要切线方向 沿曲线均匀排布文字或图标需要切线 弧长 检测曲线的弯折程度判断哪里最陡、哪里接近直线需要曲率。如果手动推导贝塞尔曲线的导数公式不仅繁琐还容易在端点、尖角处出错。svgpathtools 把这些数学细节全部封装好了你只需要告诉它哪个点它直接返回向量或数值。相关实现主要位于 svgpathtools/path.py几何计算工具在 svgpathtools/bezier.py。快速上手安装与第一个路径在终端执行pip install svgpathtools然后创建一个路径对象即可。svgpathtools 支持直接用d属性字符串构造路径from svgpathtools import Path, parse_path path parse_path(M 0,0 C 30,-50 80,50 100,0)拿到path对象后切线、法线、曲率的计算就开箱即用了。核心概念向量就是复数 ⚙️svgpathtools 用复数表示二维向量实部是 x 坐标虚部是 y 坐标。因此unit_tangent(0.5)返回的complex数值可以直接理解为起点在原点的方向箭头把它平移到曲线上的点就得到了几何学意义上的切线。一算切线unit_tangent() 与 derivative()曲线和完整路径上都提供两个切线相关方法方法含义适用场景derivative(t)一阶导数向量速度向量需要速度、弧长相关量时unit_tangent(t)单位切线向量方向箭头长度为 1画切线、排文字、求方向两个关键细节参数是 0~1 之间的比例。单段曲线Line、QuadraticBezier、CubicBezier、Arc传t完整Path传全局弧长参数T表示走了全程百分之几的位置导数为零也不报错。贝塞尔曲线存在导数为 0 的点比如控制点与端点重合时。此时derivative()会返回 0但unit_tangent()会聪明地自动求极限始终给你正确的切线方向——这也是官方文档反复推荐用它而非derivative()的原因。# 曲线中点处的切线方向单位向量复数形式 tangent_vec path.unit_tangent(0.5)一算法线normal() 一行搞定法线就是垂直于切线的方向。svgpathtools 按右手定则定义法线把切线向量顺时针旋转 90°。数学上就是乘以-1j所以实现只有一行见 svgpathtools/path.py 中Path.normal的定义。normal_vec path.normal(0.5) # 与切线垂直的单位向量用法举例在曲线中点处画一条长度为 20 的标注线端点就是center path.point(0.5) label_end center 20 * path.normal(0.5) 小提示切线方向、法线方向都可以通过直接做复数加减/乘除来合成无需任何转换。一算曲率curvature() 与曲率半径曲率 κ 描述曲线在某点弯得多厉害直线为 0半径为 r 的圆恒为 1/r值越大代表越急促地转弯。svgpathtools 的curvature()直接返回这个数值kappa path.curvature(0.5) # 该点曲率 r 1 / kappa if kappa 0 else float(inf) # 曲率半径不同段的内置行为各不相同这正是完整的体现Line曲率恒为 0直线不弯QuadraticBezier / CubicBezier按贝塞尔导数公式精确计算Arc按椭圆弧几何计算Path整条路径自动定位到 T 值落在哪一段上再计算如果 T 恰好在尖角前后两段不光滑连接处返回float(inf)等价于告诉你这里不可导。内部公式就是经典平面曲率公式 κ |x′y″ − y′x″| / (x′² y′²)^1.5代码可参考 svgpathtools/path.py 的Path.curvature实现。实战把切线画出来 最直观的应用沿曲线密集采样在每个采样点画一条短切线立刻能看到曲线的流向。项目的示例笔记 README.ipynb 中就有一个用Line段连接point(t)与point(t) mag*unit_tangent(t)来绘制切线的完整示例大批量采样时可参考 examples/compute-many-points-quickly-using-numpy-arrays.py 的 NumPy 数组加速写法。for T in [i / 100 for i in range(101)]: p path.point(T) # 以 p 为中点、沿切线方向、总长 10 的短切线段 tangent_seg Line(p - 5 * path.unit_tangent(T), p 5 * path.unit_tangent(T))结合curvature()还能给切线段着色曲率越大颜色越深曲线的弯折热点一目了然。常见陷阱与最佳实践 ✅区分 t 和 T单段用t本段 0~1整条路径用T按弧长归一化到全程 0~1。搞混会在多段路径上算到错误位置取方向请用unit_tangent()而非derivative()前者永远给出单位长度方向且能处理导数为 0 的退化点尖角处曲率为 infPath.curvature()在尖角返回无穷大是设计如此不可导写批量计算代码时记得做if kappa 1e9之类的防御导数支持任意阶derivative(T, n2)可取二阶导方便自己扩展向心加速度等物理量。小结svgpathtools 把 SVG 路径的微分几何变成了三个一算方法unit_tangent()给方向、normal()给垂直方向、curvature()给弯曲程度。API 统一、边界情况零点导数、尖角全部内建处理几行代码就能支撑起曲线标注、排版、形状分析等常见需求。想深入细节可阅读源码 svgpathtools/path.py 和演示笔记本 README.ipynb。【免费下载链接】svgpathtoolsA collection of tools for manipulating and analyzing SVG Path objects and Bezier curves.项目地址: https://gitcode.com/gh_mirrors/sv/svgpathtools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表