能否使用paper.js计算SVG路径的质心?
基于paper.js计算SVG路径重心的实现方案
paper.js没有内置的路径重心计算接口,但可以通过路径采样+多边形重心计算公式的方案实现,不需要额外引入其他依赖,具体实现逻辑如下:
- 首先将目标路径转换为离散的多边形点集
对于包含贝塞尔曲线的路径,可直接调用paper.js内置的path.flatten()方法将路径转换为仅包含直线段的扁平化路径,之后通过path.segments属性即可拿到所有顶点的坐标数组。 - 套用多边形重心公式计算最终坐标
核心实现代码示例如下:function getPathCenterOfGravity(path) { // 第二个参数为扁平化公差,值越小精度越高、计算耗时越长,常规场景0.1-1即可满足需求 const flattenedPath = path.flatten(0.1); const points = flattenedPath.segments.map(seg => seg.point); let x = 0, y = 0, area = 0; for (let i = 0, j = points.length - 1; i < points.length; j = i++) { const cross = points[i].x * points[j].y - points[j].x * points[i].y; x += (points[i].x + points[j].x) * cross; y += (points[i].y + points[j].y) * cross; area += cross; } area /= 2; x /= 6 * area; y /= 6 * area; // 返回重心坐标,也可直接构造为paper.js的Point对象使用 return { x: Math.abs(x), y: Math.abs(y) }; }
如果需要计算带孔洞的复合路径的重心,只需要先分别计算每个子路径的重心和面积,再按面积加权平均得到整体重心即可,计算复合路径总面积时注意外路径面积为正、内孔洞面积为负。
内容的提问来源于stack exchange,提问作者farincz
相关产品推荐
相关产品推荐

