Типичным объявлением переменной является
extern int x;
. Поскольку это только объявление, требуется одно определение. Соответствующим определением будет:
int x;
Например, следующее генерирует ошибку:
extern int x;
int main()
{
x = 0;
}
//int x; // uncomment this line for successful definition
Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:
void foo(); // declaration only
int main()
{
foo();
}
//void foo() {} //uncomment this line for successful definition
Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы объявили. Например, у вас могут быть несогласованные cv-квалификаторы:
void foo(int& x);
int main()
{
int x;
foo(x);
}
void foo(const int& x) {} //different function, doesn't provide a definition
//for void foo(int& x)
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
К сожалению, ответа на ваш вопрос не существует.
В D3 нет встроенного механизма, который отталкивает края или сводит к минимуму пересечения ребер. Вы могли бы подумать, что было бы не так сложно реализовать заряд на грани, но мы здесь.
Кроме того, нигде не существует какого-либо механизма, который бы вообще сокращал пересечения ребер. Я просмотрел десятки библиотек визуализации и алгоритмов компоновки, и ни один из них не связан с уменьшением кросс-пересечений на общем неориентированном графике.
Существует ряд алгоритмов, которые хорошо работают для планарных графов, или 2 -уровневые графики или другие упрощения. dagre хорошо работает в теории для двухуровневых графов, хотя полная нехватка документации делает почти невозможным работу.
. Частично это объясняется тем, что выкладка графиков трудно. В частности, сведение к минимуму пересечений кромок NP-hard, поэтому я подозреваю, что большинство дизайнеров макетов поразило эту проблему, несколько раз ударило головой о клавиатуру и сдался.
Если кто-то придумал хорошая библиотека для этого, пожалуйста, опубликуйте ее для остальных из нас:)
Я «решил» проблему с этим:
nodes[0].x = width / 2;
nodes[0].y = 100;
nodes[0].fixed = true;
force.on("tick", function(e) {
var kx = .4 * e.alpha, ky = 1.4 * e.alpha;
links.forEach(function(d, i) {
d.target.x += (d.source.x - d.target.x) * kx;
d.target.y += (d.source.y + 80 - d.target.y) * ky;
});
[...]
}
http://mbostock.github.io/d3/talk/20110921/parent-foci.html
Это не совсем то, что мы хотели, но лучше, чем раньше. Importend - это то, что вы определяете «root» -Node и исправляете его.
nodes[0].fixed = true;
Он выглядит больше как дерево, но так яснее.
Я следовал примеру Force Editor, и я увидел, что параметры charge
и linkDistance
решают проблему.
...
.charge(-200)
.linkDistance(50)
...
Снимок экрана:
[/g0]
Что-то, что может быть проще, чем пытаться сильно отразить ребра, - это покачивать узлы вокруг, пока количество линий пересечения в системе не будет ниже.
http://en.wikipedia.org/wiki/Simulated_annealing
Начните с узлов с наименьшим количеством подключений и пошагите.
Если вы попытаетесь использовать ребра в качестве узлов, я подозреваю, что вы просто получите те же проблемы с пространственной блокировкой. Решение состоит в том, чтобы выяснить, где есть пересечения ребер, и если они могут быть разрешены. Вы можете обнаружить, что разрешить многие перекрестки края невозможно
. Более боковой подход к визуализации - это оживить его так, что он отображает только подмножество узлов и соединений за раз. Или сделать края прозрачными, пока пользователь не наложит фокус мыши на узел, что указывает на то, что связанные края становятся более видимыми.