You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:45:04