2009-12-29 9 views
1

사용자가 스크롤하고 확대/축소하여 볼 수 있도록 수천 개의 노드가있는 그래프를 표시해야합니다. 노드는 무 차원 포인트처럼 동작해야하고, 에지는 1 차원 라인과 같이 동작해야합니다. 즉 확대하는 경우 노드를 나타내는 원이 더 멀리 떨어져 있지만 각 노드는 같은 크기로 유지되며이 둘을 연결하는 선은 길어 지지만 두껍지는 않습니다. 가능한 경우 확대/축소는 "연속"및 "무한"이어야합니다.많은 수의 점/선을 줌으로 그려 줌

이 문제를 해결하는 데 사용되는 API와 알고리즘은 무엇입니까? (예 : CAD 또는 GIS 응용 프로그램에서와 마찬가지로)

GDI +를 사용하면 성능이 거의 떨어지지 않습니다. 내 구현은 아마 순진했지만 OpenGL이나 DirectX가 필요하다고 생각합니다.

답변

2

점을 나타내는 위치의 배율에서 선과 표시 점의 그림을 분리해야합니다. 이렇게하면 장면이 확대 될 때 실제로 위치의 크기를 조정 한 다음 확대/축소 수준에 관계없이 동일한 선과 가시 점 방식을 사용하여 렌더링됩니다.

마지막으로 보았을 때, Direct3D는 이것을하기 위해 무엇이든 제공하지 않을 것입니다. 직접 라인 및 포인트 프리미티브를 구현해야합니다. 더 중요한 것은 Direct3D에서 필요한 변환을 수행하기 위해 벡터와 행렬을 강력하게 이해해야한다는 것입니다. OpenGL을 많이 사용하지 않았습니다.

GDI +는 느려질 수 있지만 실제로 표시되는 점만 표시하는 데는 매우주의해야만 실제로 성능을 향상시킬 수 있습니다. 내가 맡은 자리에 있다면 렌더링 알고리즘의 성능을 향상시키고 GDI +를 조금 더 오래 사용하는 데 더 많은 시간을 할애 할 것입니다.

또한 장면을 완전히 메모리 내 비트 맵 (보이는 창과 동일한 크기로)으로 렌더링 한 다음이 비트 맵을 한 번에 렌더링하면 가시적 인 창에 모든 점과 선을 개별적으로 렌더링하는 것보다 더 나은 성능을 얻을 수 있습니다 .

+0

답장을 보내 주셔서 감사합니다. 화면에 표시되는 점 만 그리기로하겠습니다.하지만 사용자가 축소하면 어떻게됩니까? 나는 포인트의 수를 줄이기 위해 가까운 이웃을 단일 포인트로 대체 할 수 있다고 생각한다. 그것을 할 수있는 알고리즘이 있습니까? 그러나 여전히, 천 포인트는 쉽게 알 수있는 음모로 즉시 볼 수 있습니다. GDI가있는 많은 타원을 렌더링하는 데 상당한 지연이 없습니까? – rgf

+0

세부 알고리즘 수준은 축소 된 장면의 복잡성을 줄이기 위해 사용됩니다. 귀하의 경우에는 줌아웃 할 때 각 포인트를 타원 대신 단일 픽셀로 렌더링하는 것처럼 간단 할 수 있습니다. 1000 포인트는 GDI +를 사용하여 신속하게 렌더링 할 수 있습니다. 장면이 변할 때만 렌더링하는 경우 (예 : 사용자가 확대/축소)이 문제는 훨씬 적습니다. 대부분의 GDI + 응용 프로그램은 Direct3D와 같이 상수 루프가 아닌 필요에 따라 (즉, Paint 이벤트에서) 렌더링됩니다. 만약 당신이 WPF 아마 상수 렌더링을해야 할 수도 있습니다 옵션. – Ash

0

최근 필자는 3d로 플로팅 속도를 높이기 위해 Java 라이브러리를 출시했습니다 (http://code.google.com/p/jzy3d/).

3D 점이 무 차원 인 예제가 있습니다. 네트워크 노드를 연결하는 모든 라인을 추가하는 것은 한 조각의 케이크가되어야합니다.

마우스로 3D 장면을 확대/축소 할 수있는 도구가 있으므로 거의 아무 것도 할 수 없습니다.

감사합니다, 마틴 나는 그것이 큰 패키지 배울 수있는 많은 비록 ROOT가 요청 된 모든 기능을 제공 있다고 생각

1

... 당신이 설명 무엇의 대부분을 할 것입니다 (

1

ZedGraph를 표시 고정 된 크기, 확대/축소 등의 선과 점). codeproject 자습서를 검토하여 필요에 맞는 기능인지 확인하는 것이 좋습니다. 필자는 구현하기 쉽고 유연성이 뛰어나며 .dll은 약 300k입니다.

호프가 도움이 되길 바랍니다.