SVG曲线为许多小直线

Rav*_*Koh 0 javascript svg d3.js

我没有使用d3.js. 我想知道当前是否有任何JS库可以帮助将SVG路径中的任何曲线转换为指定精度的许多小行.转换路径的一个示例是: <path d="M0 50 a50 50 0 1 0 100 0 a50 50 0 1 0 -100 0">

结果的示例是将此圆转换 为看起来几乎像圆的n-gon.为缺乏好的例子而道歉,因为我真的不知道如何将曲线转换为多条小直线.

Hol*_*ill 5

你不需要一个库.SVG有两个用于路径的DOM API:getTotalLengthgetPointAtLength.有了这两个,你可以很容易地做你想做的事情.

只需将路径的总长度除以所需的段数,然后使用getPointAtLenght沿着路径使用这些步骤来获取线段的点数.

flatten(src1,5)
flatten(src2,7)
flatten(src3,11)
flatten(src4,100)

function flatten(path,num){
  var l = path.getTotalLength()
  var p = path.getPointAtLength(0)
  var d = `M${p.x} ${p.y}`
  for(var i = (l/num);i<=l;i+=(l/num)){
    p = path.getPointAtLength(i)
    d+=`L${p.x} ${p.y}`
  }
  path.setAttribute("d",d+"z")
}
Run Code Online (Sandbox Code Playgroud)
<svg width="800" height="200" viewBox="0 0 800 200" fill="none" stroke="black" stroke-width="5">
  <path id="src1" d="M100 10 A90 90 0 0 0 100 190A90 90 0 0 0 100 10z"/>
  <path transform="translate(200 0)" id="src2" d="M100 10 A90 90 0 0 0 100 190A90 90 0 0 0 100 10z"/>
  <path transform="translate(400 0)" id="src3" d="M100 10 A90 90 0 0 0 100 190A90 90 0 0 0 100 10z"/>
  <path transform="translate(600 0)" id="src4" d="M100 10 A90 90 0 0 0 100 190A90 90 0 0 0 100 10z"/>
</svg>
Run Code Online (Sandbox Code Playgroud)