Библиотека визуализации на Python и вычисления на C++

Мне интересно реализовать некоторые геометрические алгоритмы и сделать их интерактивными. Я использовал библиотеку Matplotlib в Python для некоторых простых анимаций, и я считаю, что это очень просто и легко визуально проверить мои идеи. ( Спасибо, Джейк ВандерПлас !)

Однако самой большой и надежной библиотекой геометрических алгоритмов на планете является CGAL. Я хочу активно использовать большое количество пакетов в нем.

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

Мой вариант использования будет примерно таким: когда код запускается, открывается окно matplotlib, пользователь щелкает в некоторых точках или размещает и перемещает мышью определенные объекты, такие как диски. Он нажимает кнопку, которая затем анимирует ход выполнения алгоритма.

Мои коды будут написаны на C++ (язык CGAL ), но код, отвечающий за интерактивность и визуализацию, будет выполнен на Python. Мышцы в C++ и глаза в Python, так сказать.

Это возможно? Я слышал о библиотеке под названием ZeroMQ, которая позволяет отправлять сообщения между двумя живыми процессами, но я не знаю, подходит ли это для моей проблемы.

Ответы (1)

Вы можете встраивать python и его библиотеки в программу на C/C++, а также код C/C++ в программы на python — любой из них позаботится о вашем варианте использования.

Чтобы встроить python в программу на C++, в документации есть полезные примеры как для Python 2 , так и для Python 3 , но самым простым примером на C будет:

#include <Python.h>

int
main(int argc, char *argv[])
{
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    if (program == NULL) {
        fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
        exit(1);
    }
    Py_SetProgramName(program);  /* optional but recommended */
    Py_Initialize();
    PyRun_SimpleString("from time import time,ctime\n"
                       "print('Today is', ctime(time()))\n");
    Py_Finalize();
    PyMem_RawFree(program);
    return 0;
}

Ваш код C/C++ и код Python могут вызывать друг друга по мере необходимости. Также стоит взглянуть на расширение python с помощью C/C++.

Существует огромный список программ, сочетающих C/C++ и Python, в том числе: GIMP и Blender.

Наконец, есть пакет python для прямого взаимодействия с CGAL, который называется cgal-bindings . Он предоставляет оболочки для следующих пакетов CGAL , начиная с версии 0.7 :

  • Несколько примитивов ядра
  • 2D триангуляции
  • Трехмерные триангуляции
  • 2D-альфа-формы
  • 2D выпуклые оболочки и экстремальные точки
  • dD Пространственный поиск (только для случаев 2D и 3D)
  • Трехмерное быстрое пересечение и вычисление расстояний (дерево AABB)
  • Трехмерные многогранные поверхности
  • 2D соответствующие триангуляции и сетки
  • Генерация трехмерной поверхностной сетки
  • Генерация 3D-сетки
  • 2D и поверхностная интерполяция функций
  • Адаптер 2D диаграммы Вороного
  • Полуреберные структуры данных
  • Обработка набора точек
  • Пересекающиеся последовательности dD-изо-ориентированных блоков
  • Обработка полигональной сетки