Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

кривая безье

34K
10 мая 2008 года
Bochkin
11 / / 15.04.2008
Проблема в следующем: при рисовании кривой безье использую динамический массив:
 
Код:
var
     mas: array of array of GLfloat;

При этом кривая не отображается в окне; если же использовать статический массив, то кривая рисуется правильно, за исключением момента, когда статический массив содержит не тип GLfloat... В чём проблема?
257
10 мая 2008 года
kosfiz
1.6K / / 18.09.2005
просто хочу убедиться: ты SetLength используешь? функция или процедура точно принимают на вход двумерный массив? это ж OpenGL он наверное только свои типы и принимает к рисованию. и приведи фрагмент, который у тебя отвечает за рисование кривой.
34K
10 мая 2008 года
Bochkin
11 / / 15.04.2008
Код, отвечающий за рисование кривой Безье:
Код:
procedure surface.DisplySurface(var msg: TMessage);
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: array of array of GLfloat;

А вто так я инициализирую массив mas:
Код:
SetLength(mas, 4, 3);
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);

Как видно из приведенного выше кода я даже не передаю массив в качестве аргумента какой-либо функции или процедуры для упрощения. Это в дальнейшем будет веститсь программный расчёт всех опорных точек, входящих в массив...
257
10 мая 2008 года
kosfiz
1.6K / / 18.09.2005
в случае с динамическим массивом было бы правильнее все-таки давать указатель на первый элемент массива, т.е.
[highlight=delphi]
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, @mas[0,0]);
[/highlight]
однако - это дает не тот результат хотя и появляется кривая. тогда я решил не использовать динамический массив, а работать с указателями и добился нужного результата. проблема заключается именно в использовании динамического массива. вообщем я посмотрел и вот что получилось: обычно в массиве с заранее определенными границами данные распалагаются друг за другом - деление на строки и столбцы условно, а в случае с динамическим массивом нет - (условно)данные первой строки, потом пустота, равная длине строки данных, потом данные второй строки, пустота и т.д. видимо проблема в SetLength, хотя я вполне не исключаю, что сильно заблуждаюсь. тем не менее я вижу один выход - работать с указателями. если тебя это не устраивает, то думаю можно поднять обсуждение данной проблемы в ветке форума Delphi & Kylix.
9
11 мая 2008 года
Lerkin
3.0K / / 25.03.2003
Кстати, можно еще и glVertex3fv использовать...
257
11 мая 2008 года
kosfiz
1.6K / / 18.09.2005
вообщем так, модифицировал немного код и привел к следующему виду:
[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) вызвать для высвобождения памяти. я бы рекомендовал тебе как-нибудь с процедурками или функциями сделать, чтоб попроще было, тем более если ты планируешь интенсивно работать с динамическими массивами.
34K
12 мая 2008 года
Bochkin
11 / / 15.04.2008
kosfiz, спасибо большое... Обязательно попробую работать через указатели... Поясню, для чего я всё это делаю... Дело в том, что возникла проблема с трёхмерной графикой... Требуется начертить трёхмерный график функции z=f(x, y), но средства библиотеки OpenGL негодятся для этой цели, так как чертится поверхность Безье или NURBS-поверхность по опорным точкам, которые собственно говоря не принадлежат этой поверхности... Проблема заключается как раз в нахождении таких опорных точек, построенная по которым поверхность проходила бы через точки функции z=f(x, y)... Я пытался всячески извратится при построении такой поверхности, рисую её отдельными полигонами (прямоугольниками, но не получилось. Это что касается трёхмерной поверхности... Я пишу класс по рисованию таких поверхностей, вот поэтому приходится иметь дело с динамическими массивами, указателями и т.д.
1.9K
13 мая 2008 года
andriano
474 / / 10.01.2008
Цитата: Bochkin
Требуется начертить трёхмерный график функции z=f(x, y), но средства библиотеки OpenGL негодятся для этой цели,

Это очень странно.
До сих пор всегда подходили.

Цитата:
так как чертится поверхность Безье или NURBS-поверхность по опорным точкам, которые собственно говоря не принадлежат этой поверхности... Проблема заключается как раз в нахождении таких опорных точек, построенная по которым поверхность проходила бы через точки функции z=f(x, y)...

Нет, проблема не в этом.
Собственно, здесь и искать ничего не надо, просто ты подходишь к задаче не с той стороны. Ты пытаешься подобрать сплайн, который, будучи построен на крайних точках интервала, проходил бы через все промежуточные, а это, как правило, невозможно. Нужно стоить сплайны между каждой парой следующих друг за другом точек. При этом поверхность будет по определению проходить через все точки. Опорные точки при этом подбираются из условия непрерывности производных.

34K
13 мая 2008 года
Bochkin
11 / / 15.04.2008
Цитата:
Нужно стоить сплайны между каждой парой следующих друг за другом точек. При этом поверхность будет по определению проходить через все точки. Опорные точки при этом подбираются из условия непрерывности производных.


Хорошее решение, но оптимальное ли оно с точки зрения быстродействия? И как расчитываются опорные точки для достижения непрерывности производных в концевых точках каждой пары точки?

1.9K
14 мая 2008 года
andriano
474 / / 10.01.2008
Цитата: Bochkin
Хорошее решение, но оптимальное ли оно с точки зрения быстродействия? И как расчитываются опорные точки для достижения непрерывности производных в концевых точках каждой пары точки?

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

34K
14 мая 2008 года
Bochkin
11 / / 15.04.2008
Цитата:
Опорные точки вокруг одной заданной точки должны лежать на одной прямой,

... являющейся касательной к кривой в данной точке... :)
Спасибо всем большое, помогли!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог