2009-08-25 36 views
6

Tôi đang cố định vị trí các thực thể trực quan để hiển thị mối quan hệ của chúng với nhau. Có vẻ như để bố trí biểu đồ tự động, thuật toán mùa xuân sẽ phù hợp với nhu cầu của tôi. Tôi muốn thực hiện điều này trong Silverlight bằng cách sử dụng C#, vì vậy tôi đang tìm các mẫu mã, hoặc các liên kết để giải thích tốt về lý thuyết. Bất kỳ trợ giúp nào được đánh giá caoBố cục sơ đồ bố cục tự động lý thuyết xuân

Trả lời

6

tôi đã viết một số mã lúc trước để thực hiện động sơ đồ bố trí bằng cách sử dụng C# và XNA (nguồn đầy đủ có sẵn theo yêu cầu).

Dưới đây là một số chức năng quan trọng:

 public void UpdateNodes() 
     { 
      for (int i = 0; i < nodes.Count; i++) 
      { 
       Vector2 netForce = Vector2.Zero; 
       foreach (Node otherNode in nodes) 
       { 
        if (otherNode != nodes[i]) 
        { 
         netForce += CoulombRepulsion(nodes[i], otherNode); //calculate repulsion for all nodes 
         if (nodes[i].links.Contains(otherNode)) 
         { 
          netForce += HookeAttraction(nodes[i], otherNode); //only calc attraction for linked nodes 
         } 
        } 
       } 
       nodes[i].Velocity += netForce; 
       nodes[i].Velocity *= .99f; 
       nodes[i].Position += nodes[i].Velocity; 
      } 
     } 


     public Vector2 HookeAttraction(Node node1, Node node2) //ON node1 BY node2 
     { 
      Vector2 direction = Vector2.Subtract(node2.Position, node1.Position); 
      direction.Normalize(); 

      return hookeConst* node2.Mass * Vector2.Distance(node1.Position, node2.Position) * direction; 
     } 

     public Vector2 GravAttraction(Node node1, Node node2) //ON node1 BY node2 
     { 
      Vector2 direction = Vector2.Subtract(node2.Position, node1.Position); 
      direction.Normalize(); 

      return gravConst * node2.Mass * Vector2.DistanceSquared(node1.Position, node2.Position) * direction; 
     } 

Chọn hai hằng số dựa vào tốc độ bạn muốn đồ thị để hội tụ. Tôi đã sử dụng chúng:

 private const float hookeConst = .000005f; 
     private const float gravConst = .00000001f; 

Mã đó khá tự giải thích, nhưng vui lòng hỏi xem bạn có cần gì không. Về cơ bản, gọi hàm UpdateNodes() trong một vòng lặp, và đồ thị của bạn sẽ hội tụ về trạng thái năng lượng tối thiểu của nó.

+0

Chỉ cần lưu ý: "nút [i] .Velocity * = .99f;" là một hằng số giảm chấn để làm cho biểu đồ của bạn hội tụ dễ dàng hơn. Giảm giá trị đó cho ít "springyness". –

+0

Tôi muốn nguồn ... [email protected] –

+0

chắc chắn, ở đây là (như một dự án nén): http://staff.arson-media.com/preetum/uploads/springForceV0.zip Lưu ý rằng tôi đã viết mã này * khá * một thời gian trước đây, vì vậy có một số vùng không cần thiết bị xáo trộn (như vùng được đánh dấu "mouseStuff" trong vòng lặp cập nhật). Tuy nhiên, tất cả các thành phần quan trọng đều có mặt và hoạt động. (Có một số tương tác với con chuột, là tốt) –

Các vấn đề liên quan