javascript - 在两点之间绘制圆弧

标签 javascript d3.js svg

我正在为我认为 D3 可能适合的应用程序进行概念验证。因为我是 D3 的新手,所以我想我会从简单的开始,然后逐步构建以满足应用程序需求。然而,我似乎遇到了一个障碍,我认为这个库应该是一个非常容易的任务。我想在 SVG 上放置两个小圆圈,然后在它们之间画一条弧线或曲线。根据文档,我相信 arcTo 最适合这个,因为我知道起点和终点。对于我的生活,我无法画出弧线。不过每次都画出完美的圆圈。

var joints = [{x : 100, y : 200, r : 5},
    {x : 150, y : 150, r : 5}];
              
var svg = d3.select("svg");

svg.selectAll("circle")
  .data(joints)
  .enter().append("circle")
  .attr("cx", function(d) { return d.x; })
  .attr("cy", function(d) { return d.y; })
  .attr("r", function(d) { return d.r; });

svg.selectAll("path").append("path").arcTo(100,200,150,150,50)
  .attr("class", "link");
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="960" height="800" />

我要么以错误的方式解决这个问题,要么我不完全理解如何将路径附加到 SVG。有人能指出我正确的方向吗?我没能找到很多 arcTo 的例子。谢谢!

最佳答案

你误解了 d3.path() 是什么。根据API :

The d3-path module lets you take [a HTML Canvas] code and additionally render to SVG.

对于d3.path():

d3.path(): Constructs a new path serializer that implements CanvasPathMethods.

如您所见,d3-path 模块只有一堆方法可以让您获取 HTML canvas 代码并使用它来绘制 SVG 元素。

也就是说,您不能像现在这样直接在 SVG 中使用 arcTo。应该是:

var path = d3.path();
    path.moveTo(100, 200);
    path.arcTo(100,200,150,150,50)

...然后:

svg.append("path")
    .attr("d", path.toString())

然而,作为一个附加问题,arcTo 比这更复杂:前两个值不是起点的 x 和 y,而是第一个切线的坐标。

这是一个演示,对 arcTo 使用不同的值,我认为这就是您想要的:

var joints = [{
  x: 100,
  y: 200,
  r: 5
}, {
  x: 150,
  y: 150,
  r: 5
}];

var svg = d3.select("svg");

svg.selectAll("circle")
  .data(joints)
  .enter().append("circle")
  .attr("cx", function(d) {
    return d.x;
  })
  .attr("cy", function(d) {
    return d.y;
  })
  .attr("r", function(d) {
    return d.r;
  });

var path = d3.path();
path.moveTo(100, 200);
path.arcTo(100, 150, 150, 150, 50);

svg.append("path")
  .attr("d", path.toString())
  .attr("stroke", "firebrick")
  .attr("stroke-width", 2)
  .attr("fill", "none");
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg width="400" height="250" />

一个简单的替代方法是简单地删除 d3.path() 并只使用 SVG 代码来完成所有这些。有很多示例展示了如何绘制具有给定半径的从 A 点到 B 点的 SVG 圆弧。

关于javascript - 在两点之间绘制圆弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621654/

相关文章:

javascript - 为什么这会保留列表组项目上 ('click' )之后先前单击的 id?

javascript - 从列/数据名称中单击 C3Js 设置参数

javascript - 路径上的 d3.js 工具提示

javascript - 从 d3.js + 数据操作中的数据绘制线条时出现问题

internet-explorer - Internet Explorer 中的 SVG 太小

SVG "Move"命令 : Absolute path to Relative Path

algorithm - 撕纸效果(将矩形分成随机形状)

javascript - 以尽可能少的开销通过引用将提交文件传递给 web worker

javascript - 使用 NextJS 和 highcharts-react-official 的气泡图

javascript 获取日期时间输入并根据输入过滤列表