2009-08-08 37 views
13

Tôi có một danh sách các đối tượng mà tôi cần để tổ chức như một biểu đồ thẩm mỹ. Cách tiếp cận hiện tại của tôi liên quan đến IronPython và một thuật toán di truyền, nhưng điều này mất quá nhiều thời gian.Tối ưu hóa bố cục biểu đồ trong C#

Tôi đã đọc trên Graphviz, QuickGraph và Graph #, nhưng tôi không cần phần trực quan hóa - Tôi đã có một ứng dụng sẽ hiển thị các nút cho tọa độ x/y. Tôi đã nói rằng cả hai thuật toán Sugiyama và gia đình dựa trên lực lượng của thuật toán có xu hướng sản xuất đồ thị dễ chịu, nhưng tôi dường như không thể tìm thấy một thư viện. NET sẽ ra tọa độ thay vì hình ảnh mà không có một số sourcecode khá nghiêm trọng hacking.

Bất kỳ ai cũng có thể đề xuất thư viện, thuật toán hoặc các loại tương tự không?

Trả lời

21

Có một số lựa chọn, với nhiều thuận và chống - bạn có thể muốn sift thông qua this mà là một danh sách các phần mềm mà không, nhiều hơn hoặc ít hơn, những gì bạn đang tìm kiếm.

Về cơ bản, có vẻ như không phải là bản triển khai C# thuần túy, miễn phí được dự định sẽ được sử dụng trong khả năng của thư viện công cụ bố cục. Điều gần nhất có vẻ là MSAGL, là downloadable if you're on MSDN, nhưng nếu không thì khá đắt đỏ.

Sự khác biệt giữa Graph#QuickGraph là sau này cung cấp đồ thị truyền tải và điều khiển nguyên thủy nhưng không cung cấp bất kỳ thuật toán bố cục nào. Đồ thị # có tất cả các nguồn có sẵn, và từ những gì tôi đã (một thời gian ngắn) nhìn vào, có một sự tách biệt gọn gàng giữa công cụ bố trí và triển khai bản vẽ.

Graphviz được viết bằng C/C++ nguyên chất và là nguyên khối, lấy đầu vào là tệp văn bản mô tả biểu đồ và sản xuất các loại đầu ra khác nhau, cả vectơ và raster. Nó không phù hợp với công cụ bố trí trình cắm thêm, nhưng có thể được sử dụng bằng cách bắn phá và cung cấp tệp đầu vào cần thiết và phân tích cú pháp đầu ra. Không phải là một giải pháp rất sạch sẽ mặc dù.

Còn có tên gọi là OGDF. Mặc dù nó được viết hoàn toàn bằng C++, nó đã được thiết kế để được sử dụng như một thư viện công cụ bố trí và có một giao diện được cấu trúc tốt cho việc này. Nó hỗ trợ các thuật toán bố trí khác nhau bao gồm tối ưu hóa Sugiyama nếu đó là những gì bạn quan tâm.

Nếu bạn quan tâm trong việc thực hiện một biến thể được tối ưu hóa trên Sugiyama, bạn luôn có thể cuộn của riêng bạn sử dụng một neat description of the algorithm :)

Cuối cùng tuy nhiên, bạn có lẽ nên quyết định loại bố cục nào bạn đang theo dõi trước khi đưa ra quyết định về thư viện.

+1

MSAGL hiện có sẵn dưới dạng mã nguồn mở trong GitHub: https://github.com/Microsoft/automatic-graph-layout –

+1

MSAGL dường như bây giờ theo giấy phép MIT: https : //github.com/Microsoft/automatic-graph-layout/blob/master/LICENSE, cộng với nó được duy trì, vì tôi thấy họ đã sửa các bản sửa lỗi cho phiên bản Silverlight gần đây –

3

Microsoft Research có một công cụ bố cục biểu đồ tự động có thể hỗ trợ bạn trong nỗ lực này.

Bạn có thể đọc thêm về nó ở đây:

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

+0

tôi đã cố gắng GLEE/MSAGL, nhưng nó chỉ xuất ra hình ảnh AFAIK - để bạn biết nếu bạn có thể lấy tọa độ? –

+1

Tôi đã được ấn tượng rằng công cụ bố trí độc lập với các thành phần hiển thị, nhưng tôi không thể khẳng định điều đó với độ chắc chắn tuyệt đối. Bài báo này nói về lý thuyết đằng sau nó, bao gồm thuật toán Sugiyama. ftp://ftp.research.microsoft.com/pub/tr/TR-2007-72.pdf –

+0

Có, bạn chỉ có thể nhận tọa độ từ MSAGL (trước đây là GLEE) và triển khai hiển thị của riêng bạn - http: // coding -time.blogspot.com/2009/03/debugger-visualizer-for-visual-studio.html –

1

yFiles có triển khai rất tinh vi của cả hai hướng lực (được gọi là "Không phải trả tiền") và Sugiyama dựa trên thuật toán bố cục "Được gọi là phân cấp". Chúng cung cấp triển khai ít người xem hơn cho Java, .net, Silverlight, Flex và Javascript. API để truy xuất tọa độ có sẵn trực tuyến here.

Các thuật toán và chất lượng của chúng có thể được kiểm tra trong ứng dụng yEd Graph Editor miễn phí, tuy nhiên, các thư viện chỉ có sẵn trên thị trường.

+1

một giải pháp đắt tiền nhưng rất hay kiến trúc và tài liệu, cộng với thư viện cho một số platfor ms (bao gồm một số HTML5 ngay bây giờ) –

0

có triển khai bố cục Sugiyama trong Java như là một phần của hệ thống modsl, giấy phép Apache. nguồn là here.

tôi đã có thể chuyển đổi nó một cách hợp lý dễ dàng thành hỗn hợp Objective-C/Objective-C++ implementation dựa trên đồ họa.

0

tôi đã nhận được tọa độ của các nút theo cách này

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); 




     } 

    } 
} 
0

Chỉ trong trường hợp ai đó sẽ phải đối mặt với vấn đề tương tự. Có một dự án mã nguồn mở của GraphX ​​dành cho .NET, kết hợp nhiều thuật toán bố cục tách biệt với công cụ trực quan hóa. Vì vậy, bạn chỉ có thể lấy thư viện logic, thực hiện các phép tính và lấy gói tọa độ được sử dụng trong công cụ của riêng bạn.

https://github.com/panthernet/GraphX