Фрагмент кода, который у вас там есть, мог бы быть написан проще (также нужно уметь догадываться, что означают некоторые переменные и функции).
Давайте разберемся с этим.
Первые две строки легко понять, это стандартная строфа для перебора 2D-массива
for (i = 0; i < samplesX; i++)
for (j = 0; j < samplesY; j++)
i
и j
- это запущенные индексы, которые будут повторяться по каждому кортежу дискретных координат в (i,j) ∈ [i, samplesX) × [j, samplesY)
. Следующие две строки преобразуют двумерные индексы в новый диапазон значений, в частности [i, samplesX)×[j, samplesY) → [0, DIM)×[0, DIM)
. Отсутствует информация о том, какого типа DIM
из. Это будет для некоторого типа с плавающей точкой.
newI = DIM * i / samplesX;
newJ = DIM * j / samplesY;
Следующая строка подвержена ошибкам. Он переводит newI
и newJ
в работающий одномерный индекс для одномерного массива, который адресуется i
и j
.
Почему это проблематично? Потому что при преобразовании в DIM-пространство информация могла быть потеряна. Такая потеря информации может привести к ошибкам безопасности (!) , в действительности, Skia, библиотека рендеринга, используемая в Google Chrome, Android и других проектах, недавно имела именно такую ошибку; запись стоит прочитать: https://googleprojectzero.blogspot.com/2019/02/the-curious-case-of-convexity-confusion.html
Правильный способ реализовать это состоит в том, чтобы DIM был целым числом и выполнял с ним арифметику с фиксированной запятой, в конечном итоге обрезая дробные цифры. Но я отвлекся. Следующий блок, по сути, выполняет поиск в таблице поиска бедного человека. vx``vy
и fx``fy
- некоторые плоские двумерные массивы, доступ к которым осуществляется через одномерный индекс, а direction_to_color
отображает либо значение , предположительно , на вызов glColor
; то же самое, вероятно, относится и к set_colormap
. Это плохое использование OpenGL.
Целое переназначение от i
и j
до DIM
, а затем поиск - просто плохая реализация поиска текстуры. OpenGL уже имеет текстуры. Просто загрузите как массив координат текстуры и включите текстурирование.
Наконец, для каждого позвоночника выполняются два вызова glVertex
, один с начальной точкой, которая лежит на центрах сетки (wn, hn)
, в местоположение смещения (wn, hn) + (i, j)
.
Мой вердикт этого кода: Полный мусор! Все это можно было бы сделать гораздо более элегантно, даже в 1994 году с OpenGL-1.0, для которого, похоже, написан код. Если вы хотите реализовать свой собственный векторный график, не используйте его в качестве отправной точки.
В наши дни у нас есть программируемые графические процессоры с шейдерами. Все, что можно сделать, - это несколько строк шейдерного кода.