Не ясно в вашем вопросе, сколько контрольных точек вы хотите.Если вы хотите создать ссылки с точкой перегиба, наиболее удобное решение - использовать D3 генераторы ссылок .
Например, предположим, у вас есть эти данные:
const data = [{x: 20, y: 20}, {x: 280, y: 130}];
Вы можете использовать генератор ссылок следующим образом:
const linkGenerator = d3.linkHorizontal()
.x(d => d.x)
.y(d => d.y)
.source(d => d[0])
.target(d => d[1]);
Вот демонстрационная версия:
const data = [{
x: 20,
y: 20
}, {
x: 280,
y: 130
}];
const svg = d3.select("svg");
const linkGenerator = d3.linkHorizontal()
.x(d => d.x)
.y(d => d.y)
.source(d => d[0])
.target(d => d[1]);
const circles = svg.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("r", 10)
.attr("cx", d => d.x)
.attr("cy", d => d.y);
const link = svg.append("path")
.style("fill", "none")
.style("stroke", "black")
.attr("d", linkGenerator(data))
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>
А вот еще одна демка со случайными данными:
const svg = d3.select("svg");
const linkGenerator = d3.linkHorizontal()
.x(d => d.x)
.y(d => d.y)
.source(d => d[0])
.target(d => d[1]);
draw();
d3.select("button").on("click", draw);
function draw() {
const data = [{
x: 20,
y: 20 + Math.random() * 110
}, {
x: 280,
y: 20 + Math.random() * 110
}];
const circles = svg.selectAll("circle")
.data(data);
circles.enter()
.append("circle")
.merge(circles)
.attr("r", 10)
.attr("cx", d => d.x)
.attr("cy", d => d.y);
const link = svg.selectAll("path")
.data([data]);
link.enter()
.append("path")
.style("fill", "none")
.style("stroke", "black")
.merge(link)
.attr("d", linkGenerator(data))
};
<script src="https://d3js.org/d3.v5.min.js"></script>
<button>Change data</button>
<br>
<svg></svg>