В следующей библиотеке Java с открытым исходным кодом есть пара алгоритмов, которые могут помочь в построении плоских графов.
http://open.trickl.com/trickl-graph/index.html
В частности, следующие классы предоставляют аналитические решения проблемы:
ChrobakPayneLayout (на основе реализации Boost C ++ Аарона Виндзора)
http://www.boost.org/doc/libs/1_37_0/libs/graph/doc/straight_line_drawing.html
FoldFreeLayout (основано на распределенной локализации без привязки в сенсорных сетях
* Ниссанка Б. Приянта, Хари Балакришнан, Эрик Демейн и Сет Теллер)
То, что вы можете сделать, это использовать что-то вроде этого в качестве первой «попытки», которая гарантирует отсутствие совпадений, хотя может и не выглядеть великолепно. Затем вы можете применить силовой алгоритм для более справедливого разнесения узлов.
К сожалению, библиотека только что была выпущена, поэтому не хватает документации. Однако это может быть полезно, если предоставить какой-то реальный код, а не просто теорию.