2009-12-29 2 views
1

Мне нужно отобразить график с тысячами узлов, чтобы пользователь мог прокручивать и увеличивать масштаб, чтобы просмотреть его. Узлы должны вести себя как безразмерные точки, а ребра - как одномерные. То есть, масштабирование, круги, представляющие узлы, перемещаются дальше друг от друга, но каждый из них остается одного размера, а линии, соединяющие их, становятся длиннее, но не более толстыми. При необходимости масштабирование должно быть «непрерывным» и «бесконечным».Построение большого количества точек/линий с увеличением

Какие API и алгоритмы используются для решения этой проблемы? (как, скажем, в приложениях САПР или ГИС)

Я не мог достичь приемлемой производительности с использованием GDI +. Моя реализация была, вероятно, наивной, но, тем не менее, я предполагаю, что мне нужно OpenGL или DirectX.

ответ

2

Вам необходимо отделить чертеж линий и видимых точек от масштабирования позиций, представляющих точки. Таким образом, когда сцена увеличена, вы фактически просто масштабируете свои позиции, а затем визуализируете, используя тот же метод линии и видимой точки, независимо от уровня масштабирования.

В прошлый раз, когда я смотрел, Direct3D не собирается предлагать вам что-нибудь из коробки, чтобы сделать это. Вам нужно будет реализовать линейные и точечные примитивы самостоятельно. Что еще более важно, вам потребуется сильное понимание векторов и матриц для выполнения необходимых преобразований в Direct3D. Не использовали OpenGL много.

GDI + может быть медленным, но вы можете получить приличную производительность, очень осторожно отображая только те точки, которые в настоящее время видны. Если бы я был в вашей должности, я бы определенно потратил больше времени на улучшение производительности вашего алгоритма рендеринга и придерживаться GDI + немного дольше.

Кроме того, рендеринг вашей сцены полностью в битмап в памяти (размер такой же, как ваше видимое окно), а затем просто рендеринг этого растрового изображения за один раз даст лучшую производительность, чем рендеринг каждой точки и линии индивидуально в видимое окно ,

+0

Спасибо за ваш ответ. Я рассмотрю только чертежи, которые видны на экране, но как насчет того, когда пользователь масштабируется? Думаю, я мог бы заменить близких соседей одной точкой, чтобы уменьшить количество очков. Есть ли установленный алгоритм для этого? Но все же тысяча очков легко могла быть сразу видна как умопостигаемый сюжет. Не будет ли заметной задержки отдать даже много эллипсов с GDI? – rgf

+0

Алгоритм уровня детализации используется для уменьшения сложности вашей сцены при ее уменьшении. В вашем случае это может быть так же просто, как рендеринг каждой точки как одного пикселя вместо эллипса при увеличении. 1000 точек, безусловно, могут быть быстро реализованы с использованием GDI +. Если вы визуализируете только при смене сцены (например, пользователь увеличивает или уменьшает масштаб), это даже не проблема. Большинство приложений GDI + отображаются по запросу (т. Е. В событии Paint), а не в постоянном цикле, как в Direct3D. Если вам нужен постоянный рендеринг, возможно, WPF также может быть вариантом. – Ash

0

Недавно я выпустил библиотеку Java для ускорения построения графика в 3d (http://code.google.com/p/jzy3d/).

Существует пример с трехмерным разбросом, в котором три точки безразмерны. Добавление всех строк, связывающих ваши сетевые узлы, должно быть частью торта.

Существуют доступные инструменты для масштабирования/масштабирования 3d-сцены с помощью мыши, так что, возможно, вам почти ничего не остается.

С уважением, Martin

1

Я считаю, что ROOT предоставляет всю запрошенную функциональность, хотя это большой пакет и много учиться ...

1

ZedGraph будет делать большую часть того, что вы описали (отображение линии и точки с фиксированными размерами, масштабирование и т. д.). Я рекомендую вам ознакомиться с учебником codeproject, чтобы узнать, соответствует ли его функциональность вашим потребностям. Я нашел его легким в применении, очень гибким, а .dll - около 300 тыс.

Надеюсь, это поможет, Андрей