Приложение 2D CAD в WPF

Я пытаюсь написать CAD-подобное приложение в WPF (.NET 4.0), которое должно отображать множество 2D-точек/линий. Он будет использоваться для отображения CAD-планов целых городов с масштабированием, панорамированием, вращением и привязкой к точке при наведении курсора мыши.

Сейчас я использую исключительно WPF. Я читаю объекты из файла САПР, рисую их в StreamGeometry, использую его как обводку нового пути и добавляю на холст с несколькими преобразованиями.

Моя проблема в том, что это решение недостаточно хорошо масштабируется. Он отлично работает с небольшими CAD-файлами, но когда я хочу отобразить, например, полгорода (с домами и границами земель), он очень сильно задерживается.

Я также пытался преобразовать свой CAD-файл в изображение, но - разрешения 32000x32000 иногда не хватает - при уменьшении масштаба линии получаются слишком тонкими.

В конце концов, мне нужно разместить это на холсте (2D/3D) в качестве фона.

Каковы мои лучшие варианты здесь?

Спасибо, Никлас


person user1193077    schedule 06.02.2012    source источник


Ответы (3)


wpf не подходит для больших 3D-моделей. Боюсь, это слишком медленно. Ваш лучший выбор — прямое 3D или openGL.

Тем не менее, даже со скоростью Direct3D, OpenGL вам все равно нужно решить, как отсеять как можно больше полигонов/вершин перед рендерингом сцены, если вы пытаетесь показать весь город.

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

Кроме того, поскольку у вас, вероятно, есть статическая сцена, вы можете использовать двоичное пространственное разбиение.

person Anton    schedule 07.02.2012
comment
Спасибо Антон. Если я правильно понимаю эти методы, они предназначены для отбраковки точек/объектов в 3D. Но мои CAD-файлы имеют только 2 (соответствующих) измерения (вид с высоты птичьего полета). В моем 3D-холсте мои CAD-объекты будут использоваться только в качестве текстуры. Я знаю, что если я отберу достаточно точек, производительность возрастет, но я думал, что WPF уже каким-то образом сделает это. - person user1193077; 07.02.2012
comment
Как говорит Антон, WPF просто не быстрый. Используйте OpenGL или DirectX, даже если это просто 2D, это будет намного быстрее. - person Wout; 24.05.2012

Насколько я понимаю, речь идет о системе 2D CAD в WPF. Здорово! Я использую его...
OpenGL и DirectX всегда находятся в бесконечном цикле OnDraw. ЦП работает постоянно. WPF/Silverlight 2D — умная модель.
Да, общее количество элементов (например, примитивов, унаследованных от Shape) должно быть не таким уж большим. Но сколько?
Я протестировал собственное приложение (Silverlight). Надеюсь, WPF будет немного быстрее... Вот мои результаты 2D CAD. Производительность по-прежнему велика. Каждый луч состоит из нескольких примитивов.

Обычный режим задачи

Тест производительности - посмотрите количество лучей

person Sergey Orlov    schedule 12.06.2013
comment
Вы не поделились какими-либо техническими аспектами того, как вы это реализовали. Не могли бы вы уточнить, что вы использовали? Спасибо - person Dan; 08.05.2014
comment
@EpiGen :) Нет, нет... 90% интернета об этом (посмотрите, какой я крутой). См. Пространства имен Media и Media3D. Для каждой детали есть множество классов: Line, Polygone... (ставится в Canvas) и ModelVisual3D, UIElement3D. Оберните параметры формы в свойство зависимости для простоты. - person Sergey Orlov; 05.07.2015
comment
@dna2 Единственная книга о диаграммах и графиках WPF apress.com/9781430224815 - person Sergey Orlov; 05.07.2015

Используйте VirtualCanvas, например этот от Криса Ловетта.

person SpeedCoder5    schedule 31.07.2013