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

Ваш аккаунт

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

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

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

Как построить поверхность?

3.1K
16 января 2003 года
dascon
1 / / 16.01.2003
Фигура напоминает цилндр с выпуклостями на поверхности.
Имеется массив "радиусов", т.е. расстояний от центра до поверхности цилиндра. Как построить по этому массиву поверхность? Угол между радиусами 2 градуса, т.е. всего 180 радиусов.

может понятнее будет по этому (строятся опорные точки, на которые и надо натянуть поверхность):
glBegin(GL_POINTS);
for j:=1 to 10 do
begin
for i:=0 to 179 do
begin
alpha:=2*i*pi/180;
Radius:=0.75+random/4;
glNormal3f(cos(alpha)*Radius, j/5, sin(alpha)*Radius);
glVertex3f(cos(alpha)*Radius, j/5, sin(alpha)*Radius);
end;
end;
glEnd;
463
22 января 2003 года
waterman
178 / / 17.01.2003
А зачем ты в цикле вызываешь glNormal? Эта функция здесь не при делах.

Вот алгоритм [не самый оптимальный, конечно :), но работает]. Берешь два значения угла: ang и ang + d_ang. (Так как у тебя в градусах, то сначала берешь 0 и 0 + 2 = 2.) Далее строишь кусок поверхности цилиндра между двумя образующими цилиндра, соответствующими этим углам, следующим образом: пробегаешь весь массив радиусов и для каждого из них добавляешь точки вызовами glVertex, как показано на рисунке (надо выставить режим соединения точек отрезками). Надеюсь, я понятно нарисовал (строится "снизу вверх"):

12,15 ****** 10,13 (r = 3)
* **
* * *
* * *
** *
8,11 ****** 6,9 (r = 2)
* **
* * *
* * *
** *
4,7 ****** 2,5 (r = 1)
* **
* * *
* * *
** *
0,3 ****** 1 (r = 0, если массив радиусов нумеруется с нуля)

(Последовательность вызовов glVertex происходит в порядке возрастания индексов точек: 0, 1, 2, ...
Там, где у точки два индекса, она добавляется два раза. То есть, начиная с точки 0, добавляем затем
точку 1, затем 2, затем 3, но точка 3 совпадает с 0. Это надо для того, чтобы нарисовать диагональ
прямоугольника.) И так далее до последнего радиуса. Получишь кусок поверхности цилиндра между двумя его образующими, аппроксимированный четырехугольниками. [Можно и без диагоналей, но так, имхо, красивше %) ] Далее берешь углы 2 и 4 и для них повторяешь ту же последовательность действий. И так далее, пока не сделаешь полный круг.

На Пасквиле выглядит примерно так (я этот код пишу на шару; не запускал, не отлаживал):

glBegin();
for ang := 0 to 180 do
{RCount - количество радиусов; Radius - массив радиусов}
for r := 0 to RCount - 2 do
begin{ось симметрии цилиндра - ось Z}
glVertex3f(Radius[r] * cos((ang + 1) * 2.0), Radius[r] * sin((ang + 1) * 2.0), r);{точка 0}
glVertex3f(Radius[r] * cos(ang), Radius[r] * sin(ang), r);{точка 1}
glVertex3f(Radius[r + 1] * cos(ang), Radius[r + 1] * sin(ang), r + 1);{точка 2}
glVertex3f(Radius[r] * cos((ang + 1) * 2.0), Radius[r] * sin((ang + 1) * 2.0), r);{точка 3}
end;
glEnd;

Если очень надо, могу кинуть Дельфовый исходник.
463
22 января 2003 года
waterman
178 / / 17.01.2003
Ну и форматирование форума у Вас, товарищи!.. :-/
Рисунок к предыдущей мессаге - еще разик:

12,15_****** 10,13 (r = 3)
______*___**
______*__*_*
______*_*__*
______**___*
_8,11_****** 6,9 (r = 2)
______*___**
______*__*_*
______*_*__*
______**___*
__4,7_****** 2,5 (r = 1)
______*___**
______*__*_*
______*_*__*
______**___*
__0,3_****** 1 (r = 0, если массив радиусов нумеруется с нуля)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог