Я пытаюсь найти пути для отображения рядом друг с другом, так что они будут толкать друг друга (факторинг по ширине и соседним точкам), а не перекрываться.Бок о бок пути в d3
Это моя скрипка, в основном собрана из примеров https://jsfiddle.net/crimsonbinome22/k2xqn24x/
var LineGroup = svg.append("g")
.attr("class","line");
var line = d3.svg.line()
.interpolate("linear")
.x(function(d) { return (d.x); })
.y(function(d) { return (d.y); })
;
LineGroup.selectAll(".line")
.data(series)
.enter().append("path")
.attr("class", "line")
.attr("d", function(d){ return line(d.p); })
.attr("stroke", function(d){ return d.c; })
.attr("stroke-width", function(d){ return d.w; })
.attr("fill", "none");
И это то, что я надеюсь достичь в this image here, в основном:
- Для всех линий посадки на то же самое, надавите на них влево или вправо от этой точки, так что вместе они вокруг него.
- Фактор в ширине линии, чтобы они не перекрывались, или оставляли пробелы между ними.
- Уметь обрабатывать пути с различным количеством точек (максимум в примере 3, но я хочу иметь дело с до 10)
- Примечания хотя точки, которые перекрываются всегда будут иметь один и тот же показатель (они не будут петля вокруг, но просто выходите наружу, как дерево)
- Уметь обрабатывать различные количества линий, приземляющихся на одну и ту же точку.
Некоторые вопросы, которые я имею:
- Я новичок в d3, и я нахожу функции немного озадачивает. Не уверен, как даже начать применять логику, которая будет перемещать линии вокруг.
- В моей структуре данных есть некоторая избыточная информация, например r для ранга (для принятия решения о том, нажимать влево или вправо) и w для ширины, оба из которых всегда будут одинаковыми для определенной строки.
- У меня много данных, поэтому используемая здесь структура данных не будет работать с данными csv, которые у меня есть. Возможно, сейчас пропустите этот вариант, и я открою для него новый вопрос позже.
У меня был поиск, но я не могу найти примеров того, как это сделать. В некотором смысле это почти как диаграмма аккордов, но немного отличается, и я не могу найти много подходящего кода для повторного использования. Любая помощь в том, как достичь этого (либо с подходом, который я начал, либо чем-то совершенно другим, если я его пропустил), будет оценена.
Это очень сложный, нетривиальный вопрос. В худшем случае вам понадобится использовать [line-line intersection] (https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection) уравнения, чтобы определить, где они пересекаются, а затем сместить их до тех пор, т. Однако ваша ситуация может быть проще, поскольку линии лежат друг над другом. Интересно, можете ли вы определить наклон и перехват каждой линии, и если они совпадут с вами, сдвиньте влево или вправо. – Mark
Я согласен с сложностью, но думал, что это будет проще, чем вы описали. Например, я не думал, что мне нужно будет вычислить пересечения, так как я хочу только сдвинуть строки, где встречаются вершины. Например: возьмите первую точку на каждом пути и сгруппируйте те, у которых одинаковые (x, y), затем выполняйте перемещение внутри каждой группы. Сделайте то же самое для второй точки в каждом пути, третий по каждому пути и т. Д. Существует потенциал для сложности (например: разработка угла, чтобы нажимать на них, а не только налево/вправо), но в качестве начала просто зная, что они нужно двигаться, должно быть (надеюсь) просто? – crimsonbinome22