문제

미적 그래프로 구성 해야하는 객체 목록이 있습니다. 내 현재의 접근 방식은 Ironpython과 유전자 알고리즘과 관련이 있지만 너무 오래 걸립니다.

GraphViz, QuickGraph 및 Graph#을 읽었지만 시각화 부품이 필요하지 않습니다. 이미 X/Y 좌표가 주어진 노드를 표시 할 앱이 이미 있습니다. 나는 스기 야마 알고리즘과 힘 기반 알고리즘 패밀리가 모두 기쁨 그래프를 출력하는 경향이 있다고 들었지만, 아주 심한 Sourcecode없이 이미지 대신 좌표를 출력하는 .NET 라이브러리를 찾을 수는 없습니다. 해킹.

라이브러리, 알고리즘 등을 추천 할 수 있습니까?

도움이 되었습니까?

해결책

다양한 장단점을 가진 여러 가지 옵션이 있습니다. 이것 이것은 당신이 찾고있는 것, 더 적은 소프트웨어 목록입니다.

예전에는 오픈 소스 솔루션을 찾는 것이 어려웠지만 한때 상업적으로 라이센스가 부여 된 경우 msagl 지금 오픈 소스 인 것 같습니다.

의 구별 그래프# 그리고 QuickGraph 후자는 그래프 트래버스 및 조작 프리미티브를 제공하지만 레이아웃 알고리즘을 제공하지 않는 것입니다. 그래프#에는 모든 소스를 사용할 수 있으며 (간단히) 보았던 것에서 레이아웃 엔진과 드로잉 구현간에 깔끔한 분리가 있습니다.

GraphViz 순수한 C/C ++로 작성되었으며, 그래프를 설명하는 텍스트 파일을 입력하고 벡터 및 래스터 기반의 다양한 유형의 출력을 생성하는 텍스트 파일을 입력하는 것으로 간주됩니다. 플러그인 레이아웃 엔진으로는 크지 않지만 필수 입력 파일을 제공하고 출력을 구문 분석하여 사용할 수 있습니다. 그래도 매우 깨끗한 솔루션은 아닙니다.

또한 불리는 것도 있습니다 OGDF. C ++로 완전히 작성되었지만 레이아웃 엔진 라이브러리로 사용되도록 설계되었으며이를 위해 잘 구조화 된 인터페이스가 있습니다. 최적화 된 스 지야마를 포함한 다양한 레이아웃 알고리즘을 지원합니다.

스기 야마에서 최적화 된 변형을 구현하는 데 관심이 있다면 언제든지 알고리즘에 대한 깔끔한 설명 :)

그러나 궁극적으로 도서관을 결정하기 전에 어떤 유형의 레이아웃을 결정해야 할 것입니다.

다른 팁

Microsoft Research에는 이러한 노력에 도움이 될 수있는 자동 그래프 레이아웃 엔진이 있습니다.

자세한 내용은 다음을 참조하십시오.

http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/

yfiles 힘을 지시받은 ( "유기농"이라고 함)와 스기 야마 기반 ( "Hierarchic") 레이아웃 알고리즘의 매우 정교한 구현이 있습니다. Java, .NET, Silverlight, Flex 및 JavaScript에 대한 뷰어가없는 구현을 제공합니다. 좌표를 검색하는 API는 온라인으로 제공됩니다 여기.

알고리즘과 품질은 무료로 테스트 할 수 있습니다. yed 그래프 편집기 응용 프로그램, 라이브러리는 상업적으로 만 이용 가능합니다.

누군가가 비슷한 문제에 직면 할 경우를 대비하여. .NET Open-Source 프로젝트 용 Graphx가 있으며 시각화 엔진과 분리 된 많은 레이아웃 알고리즘이 통합되어 있습니다. 따라서 로직 라이브러리를 사용하고 계산을 수행하며 자신의 VIS 도구에서 사용할 좌표 팩을 가져올 수 있습니다.

https://github.com/panthernet/graphx

Java에는 MODSL 시스템 인 Apache 라이센스의 일환으로 Sugiyama 레이아웃 구현이 있습니다. 출처입니다 여기.

나는 그것을 혼합 된 사람으로 합리적으로 쉽게 변환 할 수 있었다. 목표 C/Objective-C ++ 구현 Digraph를 기반으로합니다.

나는 이런 식으로 노드의 좌표를 받았다

namespace GleeTest
{
    class GleeTest
    {

        static void Main() {
            Microsoft.Glee.GleeGraph oGleeGraph = new Microsoft.Glee.GleeGraph();

            Microsoft.Glee.Splines.ICurve oCurve =
               Microsoft.Glee.Splines.CurveFactory.CreateEllipse(
                   1, 1,
                   new Microsoft.Glee.Splines.Point(0, 0)
                   );
            Microsoft.Glee.Node strNode1 = new Microsoft.Glee.Node("Circle", oCurve);

            Microsoft.Glee.Node strNode3 = new Microsoft.Glee.Node("Diamond", oCurve);
            Microsoft.Glee.Node strNode4 = new Microsoft.Glee.Node("Standard", oCurve);
            Microsoft.Glee.Node strNode2 = new Microsoft.Glee.Node("Home", oCurve);

            oGleeGraph.AddNode(strNode1);
            oGleeGraph.AddNode(strNode2);
            oGleeGraph.AddNode(strNode3);
            oGleeGraph.AddNode(strNode4);

            Microsoft.Glee.Edge oGleeEdge1 =
               new Microsoft.Glee.Edge(strNode1, strNode2);
            Microsoft.Glee.Edge oGleeEdge2 =
            new Microsoft.Glee.Edge(strNode2, strNode1);
            Microsoft.Glee.Edge oGleeEdge3 =
            new Microsoft.Glee.Edge(strNode2, strNode2);
            Microsoft.Glee.Edge oGleeEdge4 =
            new Microsoft.Glee.Edge(strNode1, strNode3);
            Microsoft.Glee.Edge oGleeEdge5 =
            new Microsoft.Glee.Edge(strNode1, strNode4);
            Microsoft.Glee.Edge oGleeEdge6 =
          new Microsoft.Glee.Edge(strNode4, strNode1);


            oGleeGraph.AddEdge(oGleeEdge1);
            oGleeGraph.AddEdge(oGleeEdge2);
            oGleeGraph.AddEdge(oGleeEdge3);
            oGleeGraph.AddEdge(oGleeEdge4);
            oGleeGraph.AddEdge(oGleeEdge5);
            oGleeGraph.AddEdge(oGleeEdge6);

            oGleeGraph.CalculateLayout();


            System.Console.WriteLine("Circle position  " + oGleeGraph.FindNode("Circle").Center.X + "," + oGleeGraph.FindNode("Circle").Center.Y);
            System.Console.WriteLine("Home position = " + oGleeGraph.FindNode("Home").Center.X + "," + oGleeGraph.FindNode("Home").Center.Y);
            System.Console.WriteLine("Diamond position = " + oGleeGraph.FindNode("Diamond").Center.X + "," + oGleeGraph.FindNode("Diamond").Center.Y);
            System.Console.WriteLine("Standard position = " + oGleeGraph.FindNode("Standard").Center.X + "," + oGleeGraph.FindNode("Standard").Center.Y);




        }

    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top