【问题标题】:Draw an svg arc using d3 knowing 3 points on the arc使用 d3 绘制 svg 弧,知道弧上的 3 个点
【发布时间】:2017-05-07 06:05:48
【问题描述】:

我想使用d3.js 函数从 A 点开始通过 B 点绘制弧线,并在 C 点结束。

我想知道是否有使用 d3 函数的方法,例如。 d3.radialLine() 或 d3.path().arcTo() 可以与其他 d3 函数结合使用,而无需编写任何数学代码。

【问题讨论】:

  • 我不会将其标记为重复,因为它不是特定于 d3 而是特定于 this is probably what you are looking for...
  • 谢谢你,马克,但我想知道是否有一种方法可以使用 d3 函数,如 d3.radialLine 或 d3.path().arcTo() 而无需编写数学代码。

标签: d3.js


【解决方案1】:

d3 中没有内置的路径生成器来执行此操作 - 你可以获取我为 swoopy-drag 编写的路径生成器:

//convert 3 points to an Arc Path 
function calcCirclePath(points){
  var a = points[0].pos
  var b = points[2].pos
  var c = points[1].pos

  var A = dist(b, c)
  var B = dist(c, a)
  var C = dist(a, b)

  var angle = Math.acos((A*A + B*B - C*C)/(2*A*B))

  //calc radius of circle
  var K = .5*A*B*Math.sin(angle)
  var r = A*B*C/4/K
  r = Math.round(r*1000)/1000

  //large arc flag
  var laf = +(Math.PI/2 > angle)

  //sweep flag
  var saf = +((b[0] - a[0])*(c[1] - a[1]) - (b[1] - a[1])*(c[0] - a[0]) < 0) 

  return ['M', a, 'A', r, r, 0, laf, saf, b].join(' ')
}

function dist(a, b){
  return Math.sqrt(
    Math.pow(a[0] - b[0], 2) +
    Math.pow(a[1] - b[1], 2))
}

【讨论】:

猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多