вопросы по применению 3D-графики

#graphics #3d #graphing #graph-visualization #rpn

#графика #3D #построение графиков #график-визуализация #rpn

Вопрос:

Для одного из моих занятий я создал приложение для построения 3D-графиков (используя Visual Basic). Он принимает строку (z = f (x, y)) в качестве входных данных, преобразует ее в RPN-нотацию, затем вычисляет и отображает уравнение на графике. Хотя это и сработало, построение графика заняло около 20 секунд. Я бы хотел добавить полосы слайдов для поворота графика по вертикали и горизонтали, но это было определенно слишком медленно, чтобы позволить это.

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

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

Наконец, мне нужен лучший способ отображения графика. В настоящее время (используется VB с Visual Studio) Я наношу на график 200 000 точек, но это ни в коем случае не выглядит великолепно. В конце концов, я хотел бы иметь возможность изменять цвет в зависимости от высоты и других графических манипуляций, чтобы он выглядел лучше.

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

Ответ №1:

Итак, я объясню, как бы я это сделал, используя C и OpenGL. Это не означает, что вы должны использовать именно эти инструменты, просто это стандартные графические инструменты.

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

Что вам следует сделать, это выбрать диапазоны для домена rectangle, который вы хотите отобразить (минимум x, максимум x, минимум y, максимум y) И создайте 2 вложенных цикла for вида:

 // Pseudocode
for (x=minimum; x<maximum; x  )
    for (y=minimum; y=maximum; y  )
       3D point = (x,y, f(x,y))
  

Сохраните все эти точки в контейнере (std vector для c работает нормально), и это будет ваша «сетка».

Это делается один раз, перед рендерингом. Затем вы визуализируете эти точки, используя, например, GL_POINTS, и поворачиваете сетку графика, используя повороты на графическом процессоре.

При этом будут показаны только отдельные точки, а не поверхность.

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

Сгруппируйте каждые 4 смежные вершины (т. е. вершины с индексами <x,y>, <x 1,y>, <x 1,y>, <x 1,y 1>) и создайте 2 треугольника:

 (<x,y>, <x 1,y>, <x,y 1>), (<x 1,y>, <x 1,y 1>, <x,y 1>)
  

Это заполнит триангуляцию поверхности вашей сетки.

По сути, вам нужно построить свою сетку только один раз, и таким образом, рендеринг должен составлять 60 кадров в секунду для чего-то с 20 000 вершинами, независимо от того, визуализируете ли вы только точки или треугольники тоже.

Ответ №2:

Язык программирования в основном не имеет значения, поэтому сам VB, вероятно, не является проблемой. У вас могут возникнуть те же проблемы в Python, C #, C и т.д. Конечно, вы должны освоить выбранный вами язык программирования.

Одним из ключевых аспектов является использование правильных алгоритмов и структур данных. Правильное использование выделений памяти и ее компоновки для максимального использования кэша процессора (и GPU) также являются ключевыми. Затем вы должны воспользоваться преимуществами платформы и аппаратных возможностей (графический процессор и многопоточность). Для последнего пункта вам определенно нужно использовать графическую библиотеку, такую как OpenGL или Vulkan.

Комментарии:

1. Спасибо, это очень помогает. Я сосредоточился на удобочитаемости и быстром завершении проекта, поэтому есть много вещей, которые можно оптимизировать. Я обязательно загляну в графические библиотеки. Мой инструктор тоже что-то говорил о многопоточности, так что я узнаю больше и об этом.