2011-11-27 3 views
11

C#에서 기업 구조 트리 (계열 트리와 유사)를 그려야합니다. 모든 부수적 인 코드가 있습니다. 색깔이 있고 대화 형이며 공상적입니다. 유일한 문제는 실제로 각 노드를 어디에 놓을 지 결정하는 알고리즘으로 많은 슬픔을주고 있습니다.효율적으로 나무를 그리는 알고리즘?

잠시 동안 상자의 크기는 100x50이고 특정 x, y 좌표의 직원을 나타내는 StaffNode 클래스가 있습니다.

알고리즘은 적절한 x와 y를 사용하여 List<StaffNode>을 만들어야합니다.

이것은 매우 까다 롭습니다.

기본적으로 알고리즘은 기업 구조를 따라 재귀 적이므로 트리를 따라 왼쪽 → 오른쪽, 위에서 아래로 내려갑니다. 두 노드가 서로 겹치면 분명히 나쁘다.

나는 이런 식으로 뭔가를 생산할 수있는 몇 가지 알고리즘을 생각할 수

:

  * 
    o   O 
o o o o o  O 
o   O O O O O 
       O 

나무가 매우 큰 공간이 매우 제한되어 있기 때문에 이런 일이 더 좋을 것이다 반면 :

 * 
    o  O 
o o o o o O 
o  O O O O O 
      O 

이전에 이렇게 나무를 그려야 만했던 사람이 있습니까? 네가 가진다면 내가 가진 많은 장애물을 보았을거야. 어떤 팁? 지금까지 하루 종일 보냈습니다.

+0

당신이 뭘 하려는지를 찾을 수 있습니까? 그것은 마이크로 소프트 visio 또는 무언가에서해야하지 않아 ?? – DrStrangeLove

+0

일부 테트리스 해결사를 사용하십시오 ... – Dialecticus

+0

@DrStrangeLove 아니요, 저는 대화 형 시각화를 작성하고 있습니다. – user1002358

답변

12

나무를 그릴 때 여러 가지 좋은 알고리즘이 많이 있습니다. 각 알고리즘은 나무의 여러 속성을 보여줍니다. 계층을 과시하고 싶다면 this code for WPF that draws hierarchies이 있습니다. 그래프와 나무를 그리는 방법에 대한 좀 더 일반적인 논의를 위해 많은 알고리즘을 상술 한 these lecture slides을 살펴 보자. 유사한 자료를 다루는 these excellent slides도 있습니다.

희망이 도움이됩니다.

+2

그건 절대적으로 완벽합니다! 내가 필요한 것.그것은 Reingold-Tilford 알고리즘을 사용합니다. – user1002358

+1

@ user1002358 해당 댓글에 감사드립니다. 나는 여기에 나열된 답변에서 알고리즘을 이해하는 데 어려움을 겪었지만 "Reingold-Tilford 알고리즘"을 검색하면 [유용한 질문] ([http://edackoverflow.com/q/13128750/302677])으로 안내됩니다. 나는 다른 사람들이 간단한 설명을 찾고있는 경우를 대비하여 [여기] (http://rachel53461.wordpress.com/2014/04/20/algorithm-for-drawing-trees/) 알고리즘을 코딩하는 단계를 요약했다 – Rachel

1

반복 접근 방식을 사용할 수 있습니다. 위에 사용 된 첫 번째 예제와 같은 것을 사용하여 트리를 배치하십시오. 그런 다음 노드 또는 하위 트리를 서로 가깝게 이동하면서 제약 조건을 위반하지 않도록합니다 (예 : 노드가 겹칠 수 없으며 자식 노드가 부모 노드 아래에 있어야 함).

장점 :

  • 간단한 알고리즘입니다.
  • 좋은 솔루션을 얻습니다.
  • 변화하는 나무에 지속적으로 적용 할 수 있습니다.
  • 시원하게 보이게 할 수 있습니다.

단점 :

  • 좋은보고 많은 반복을해야 할 수도 있습니다.
  • 는 (로컬 최대에 잡힐) 최적의 솔루션
+0

단일 반복에서 이와 같은 작업을 수행 할 수 있습니다. –

+0

동의하지만 때로는 반복 최적화 방법은 단일 패스 알고리즘이 많은 수의 노드에 대해 계산적으로 실행 불가능할 경우 유용 할 수 있습니다. – geofftnz

관련 문제