IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Закраска по методу Гуро и Фонга
18192123
сообщение 16.04.2007 21:41
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Мне нужно изобразить тетраэдр , выполнить закраску Фонга относительно выбранного источника света, разработать процедуру управления скоростью вращения тела с одинаковыми ускорениями по осям и обеспечения перехода на низкозатратную процедуру Гуро и далее на закраску с использованием таблиц освещенности при увеличении угловых скоростей вращения.

Вот... Не знаю даже, с чего начать... Теорию по методам закраски изучила.... но с таким никогда не сталкивалась, поэтому с реализацией большие проблемы....

вот на что думаю опираться:
1. Получить нормаль грани: выбрать два вектора, лежащие в этой грани и найти их векторное произведение, нормировать этот вектор.
2. Записать найденные нормали граней в массив (normg[i]). Чтобы определить нормаль каждой вершины, определяем из таблицы граней для каждой вершины, какие грани в ней сходятся, и для этих найденных граней их нормали суммируем, а сумму нор-мируем (массив normv[i]).
3. Алгоритм Гуро. После того, как нормали вершин найдены, вы-числяем согласно модели освещения освещенность каждой вершины и записываем освещенности в массив освещенностей. Этот массив будет использоваться в процедуре рисования грани.
Алгоритм Фонга. Координаты найденных нормалей вершин пе-реводятся в сферические координаты, так что нормали представле-ны двумя числами типа byte. Нормали в таком виде будут использо-ваны процедурой рисования грани.
4. Реализовать процедуру рисования грани, для чего необходимо провести интерполяцию для определения освещенности (в ме-тоде Гуро) и нормали (в методе Фонга) для каждой точки гра-ни.
Закраску граней можно произвести путем заполнения внутренней области этой грани отрезками прямых, параллельных оси OX. Для этого найдем вершины грани с наименьшей и наибольшей координатой Y.
В качестве начальной возьмем вершину с наименьшей координатой Y. Разобьем условно множество ребер, составляющих грань, на две группы – левую и правую. Будем по очереди брать одно ребро из левой и одно из правой части, т.е. всегда работать с парой ребер. Выбор ребер может производиться следующим образом: сначала берем в качестве левого ребра ребро, начинающееся в начальной вершине и заканчиваю-щееся в следующей по порядку при обходе влево. Это ребро (l0,lk). Аналогично, в качестве первого правого ребра – ребро (r0,rk). Теперь в цикле будем строить прямые, параллельные оси X, начиная с прямой Y = Ymin, каждый раз увеличивая ординату. Для каждой этой прямой бу-дем находить точки пересечения с нашей парой боковых ребер. Если одно из боковых ребер не имеет точки пересечения с этой прямой, то его отбрасываем и берем следующее из его группы (левой или правой).
Если точки пересечения найдены, то найдем, какая часть левого и правого ребра пройдена, это значение запишется соответственно в пе-ременные tl и tr. Значение переменных tl и tr используется на первом шаге билинейной интерполяции в методе Гуро для нахождения осве-щенности в точках пересечения прямой, параллельной оси Х, и ребер, а в методе Фонга для определения нормалей тела в этих точках. Второй шаг интерполяции ведется аналогично, только вдоль отрезка, заключен-ного между парой ребер. Таким образом, вычисляется необходимая ин-формация для каждой точки грани.

но как всё это реализовать - не знаю! С чего начинать! Может быть кто-нибудь может привести реализацию методов закраски?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
18192123
сообщение 19.04.2007 12:10
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Нашла вот такую программу для закраски тетраэдра:


program lab5;
uses graph,crt;
const n=8;
procedure draw;
label
nextj;
type
tetr=array[1..n] of record x,y,z:integer end;
const
verts : tetr=(
(x:-1; y:1; z:1),
(x:1; y:1; z:1),
(x:-1; y:1; z:-1),
(x:-1; y:-1; z:1),
(x:1;y:-1;z:-1),
(x:1;y:-1;z:1),
(x:1;y:1;z:-1),
(x:-1;y:-1;z:-1) );
g:array[1..n,1..4] of shortint=
(
(1,4,2,3),
(1,3,2,4),
(3,4,2,1),
(4,1,3,2),
(2,4,1,3),
(3,2,4,1),
(2,4,3,1),
(4,1,2,3));
var
alfa,beta,gamma,
teta,
dt:real;
c:tetr;
procedure rotate(var x,y,z:integer);
var
cost,sint,one_cost,aone_cost,bone_cost,gsint:real;
xn,yn,zn:integer;
begin
cost:=cos(teta);
sint:=sin(teta);
one_cost:=1.0-cost;
aone_cost:=alfa*one_cost;
bone_cost:=beta*one_cost;
gsint:=gamma*sint;

xn:=trunc(
x*(cost +alfa*aone_cost)+
y*(gsint +beta *aone_cost)+
z*(-beta*sint +gamma*aone_cost));
yn:=trunc(
x*(-gsint+ beta*aone_cost)+
y*(cost +beta*bone_cost)+
z*(alfa*sint + gamma*bone_cost));
zn:=trunc(
x*(beta*sint + gamma*aone_cost)+
y*(-alfa*sint +gamma *bone_cost)+
z*(-beta*sint +gamma*one_cost));
x:=xn;y:=yn;z:=zn;
end;
function minz:integer;
var j,m:integer;
begin
m:=1;
for j:=1 to n do
if c[j].z<c[m].z then m:=j;
minz:=m;
end;
var
pnts:array[1..n] of record
x,y:integer end ;
min:integer;
x0,y0:integer;
a:integer;
i,j,k:integer;
page:word;
begin
page:=0;
x0:=300;
y0:=150;
a:=70;
alfa:=0.6;
beta:=0.7;
gamma:=sqrt(1.0-alfa*alfa-beta*beta);
teta:=0;
dt:=2*pi/100; for i:=1 to n do
begin
c[i].x:=verts[i].x*a;
c[i].y:=verts[i].y*a;
c[i].z:=verts[i].y*a;
rotate(c[i].x,c[i].y,c[i].z)
end;
min:=minz;
setvisualpage((page+1)mod 2);
for k:=0 to 2500 do
begin
setactivepage(page);
for j:=1 to 8 do
begin
for i:=1 to 5 do if min=g[j,i] then goto nextj;
for i:=1 to 5 do
begin
pnts[i].x:=x0+c[g[j,i]].x;
pnts[i].y:=y0+trunc(0.775*c[g[j,i]].y)
end;
setfillstyle(solidfill,word(j+4));
fillpoly(3,pnts) ; delay(100);
nextj:
end;
setvisualpage(page);
setactivepage((page+1)mod 2);
for i:=1 to n do
begin
c[i].x:=verts[i].x*a;
c[i].y:=verts[i].y*a;
c[i].z:=verts[i].z*a;
rotate(c[i].x,c[i].y,c[i].z)
end;
min:=minz;cleardevice;
teta:=teta+dt;
page:=(page+1)mod 2;
if keypressed then
exit;
end;
end;
var drv,mode:integer;
begin
drv:=ega;
mode:=egahi;
initgraph(drv,mode,'');
draw;
closegraph;
end.




мне здесь не понятно назначение функции minz, а также что хранится в этом массиве записей и для чего это нужно:

pnts:array[1..n] of record
x,y:integer end ;



а самое главное - не понятна главная часть процедуры Рисование(procedure draw;), каким образом там производится рисование и закраска? пожалуйста, объясните основные моменты этого куска!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Закраска по методу Гуро и Фонга   16.04.2007 21:41
18192123   получилось нарисовать фигуру и вращать её, вот тол...   17.04.2007 20:52
18192123   а как выбрать источник света и как с ним работать?   17.04.2007 22:53
volvo   Марина, загляни вот сюда: Dasaev Demo Guide v1.1 ...   17.04.2007 23:07
18192123   Марина, загляни вот сюда: Dasaev Demo Guide v1.1 ...   18.04.2007 14:18
18192123   а может есть ещё что-то такое?   18.04.2007 19:55
18192123   Нашла вот такую программу для закраски тетраэдра: ...   19.04.2007 12:10
Malice   мне здесь не понятно назначение функции minz пои...   20.04.2007 15:49
18192123   Если тетраэдр с его вершинами и сторонами задаётся...   19.04.2007 18:19
18192123   и что значит "нормировать" вектор? ( как...   19.04.2007 21:49
Malice   Вот еще с далеких фидошных времен откопался пример...   19.04.2007 21:55
18192123   Вот еще с далеких фидошных времен откопался приме...   19.04.2007 23:26
18192123   Спасибо! Но лучше уж я с чистого листа начну....   20.04.2007 8:11
Сергей   Почему никто не хочет мне этого объяснить на моём...   25.04.2007 12:13
Lapp   и что значит "нормировать" вектор? ( ка...   20.04.2007 8:18
18192123   Я думаю, нормировать - это значит сделать так, чт...   20.04.2007 8:21
Lapp   :blink: никогда о таком не слышала...а можно пока...   20.04.2007 8:37
18192123   Ai'=Ai/|A| Остальное позже. Машина в ремонт...   20.04.2007 8:48
Lapp   |A| - поясни пожалуйста, это модуль чего? (без i)...   20.04.2007 10:53
18192123   procedure draw(color:byte); begin for p:=0 to 5 ...   23.04.2007 21:32
Malice   а именно, не пойму, для чего *2, *3, прибавляем ...   23.04.2007 22:34
18192123   Что ж тут не понятного ? Массив Line_ заполнен та...   23.04.2007 22:56
Malice   спасибо за объяснение! а для чего умножение н...   24.04.2007 0:12


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 10:53
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"