кривая безье
mas: array of array of GLfloat;
При этом кривая не отображается в окне; если же использовать статический массив, то кривая рисуется правильно, за исключением момента, когда статический массив содержит не тип GLfloat... В чём проблема?
begin
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
for i:=0 to 30 do
glEvalCoord1f(i/30);
glEnd;
glBegin(GL_POINTS);
for i:=0 to High(mas) do
glVertex3f(mas[i, 0], mas[i, 1], mas[i, 2]);
glEnd;
SwapBuffers(dc);
end;
Массив объявлен как динамический:
А вто так я инициализирую массив mas:
mas[0, 0]:=-4;
mas[0, 1]:=-4;
mas[0, 2]:=0;
mas[1, 0]:=-2;
mas[1, 1]:=4;
mas[1, 2]:=0;
mas[2, 0]:=2;
mas[2, 1]:=-4;
mas[2, 2]:=0;
mas[3, 0]:=4;
mas[3, 1]:=4;
mas[3, 2]:=0;
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, @mas);
glEnable(GL_MAP1_VERTEX_3);
Как видно из приведенного выше кода я даже не передаю массив в качестве аргумента какой-либо функции или процедуры для упрощения. Это в дальнейшем будет веститсь программный расчёт всех опорных точек, входящих в массив...
[highlight=delphi]
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, @mas[0,0]);
[/highlight]
однако - это дает не тот результат хотя и появляется кривая. тогда я решил не использовать динамический массив, а работать с указателями и добился нужного результата. проблема заключается именно в использовании динамического массива. вообщем я посмотрел и вот что получилось: обычно в массиве с заранее определенными границами данные распалагаются друг за другом - деление на строки и столбцы условно, а в случае с динамическим массивом нет - (условно)данные первой строки, потом пустота, равная длине строки данных, потом данные второй строки, пустота и т.д. видимо проблема в SetLength, хотя я вполне не исключаю, что сильно заблуждаюсь. тем не менее я вижу один выход - работать с указателями. если тебя это не устраивает, то думаю можно поднять обсуждение данной проблемы в ветке форума Delphi & Kylix.
[highlight=delphi]
var
p, a: PGLfloat;
ctrlpoints : array of array of GLfloat;
{......................................}
SetLength(ctrlpoints, 4, 3);
ctrlpoints[0, 0]:=-4.0;
ctrlpoints[0, 1]:=-4.0;
ctrlpoints[0, 2]:=0.0;
ctrlpoints[1, 0]:=-2.0;
ctrlpoints[1, 1]:=4.0;
ctrlpoints[1, 2]:=0.0;
ctrlpoints[2, 0]:=2.0;
ctrlpoints[2, 1]:=-4.0;
ctrlpoints[2, 2]:=0.0;
ctrlpoints[3, 0]:=4.0;
ctrlpoints[3, 1]:=4.0;
ctrlpoints[3, 2]:=0.0;
{дальне нововведения}
{выделяем необходимую память}
p:=AllocMem(4*3*sizeof(GLfloat));
a:=p;
{копируем массив в память связанную с указателем}
for i:=0 to 3 do
for j:=0 to 2 do
begin
p^:=ctrlpoints[i, j];
p:=pointer(integer(p)+sizeof(GLfloat));
end;
{передаем начальный адрес на выделенный блок памяти}
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, a);
glEnable(GL_MAP1_VERTEX_3);
[/highlight]
только не забудь потом FreeMem(a) вызвать для высвобождения памяти. я бы рекомендовал тебе как-нибудь с процедурками или функциями сделать, чтоб попроще было, тем более если ты планируешь интенсивно работать с динамическими массивами.
Это очень странно.
До сих пор всегда подходили.
Нет, проблема не в этом.
Собственно, здесь и искать ничего не надо, просто ты подходишь к задаче не с той стороны. Ты пытаешься подобрать сплайн, который, будучи построен на крайних точках интервала, проходил бы через все промежуточные, а это, как правило, невозможно. Нужно стоить сплайны между каждой парой следующих друг за другом точек. При этом поверхность будет по определению проходить через все точки. Опорные точки при этом подбираются из условия непрерывности производных.
Хорошее решение, но оптимальное ли оно с точки зрения быстродействия? И как расчитываются опорные точки для достижения непрерывности производных в концевых точках каждой пары точки?
Оптимальное по быстродействию решение - вообще не строить никакого сплайна, а обходиться теми точками, что есть. Так что ты уж определись, что именно тебе нужно: сплайн илии быстро.
Опорные точки вокруг одной заданной точки должны лежать на одной прямой, причем расстояния от опорных точек до соответствующей точки должны быть равны между собой.
... являющейся касательной к кривой в данной точке... :)
Спасибо всем большое, помогли!