Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

Вопросик по оптимальному алгоритму вывода тора?   Найти похожие ветки 

 
Tihas   (2002-10-24 02:01) [0]

При попытке изобразить тор мне пришол в голову только такой способ,
я вижу ,что сдесь есть недостатки, почти все точки рассчитываються четыре раза. Может кто знает по оптимальней алгоритм?

procedure Torus(innerR,outerR:GLDouble;Slices,Loops:GLint);
var w,dW,F,dF:GLFloat;
WCos,WSin,WCos1,WSin1,
R1,R2,
FCos,FSin,FCos1,FSin1:GLFloat;
i:byte;
v:array[0..3,0..2] of GLFloat;
begin
dW:=(2/Slices)*pi;
dF:=(2/Loops)*pi;
W:=-pi;
F:=-pi;
glBegin(GL_Quads);
while(W<pi) do
begin
while(F<pi) do
begin
WCos:=cos(W);
WSin:=sin(W);
WCos1:=Cos(W+dW);
WSin1:=Sin(W+dW);
FCos:=cos(F);
FSin:=sin(F);
FCos1:=Cos(F+dF);
FSin1:=Sin(F+dF);

R1:=(innerR+outerR*FCos);
R2:=(innerR+outerR*Fcos1);

v[0,0]:=R1*Wsin;
v[0,1]:=R1*Wcos;
v[0,2]:=outerR*Fsin;

v[1,0]:=R2*Wsin;
v[1,1]:=R2*Wcos;
v[1,2]:=outerR*Fsin1;

v[2,0]:=R2*Wsin1;
v[2,1]:=R2*Wcos1;
v[2,2]:=outerR*Fsin1;

v[3,0]:=R1*Wsin1;
v[3,1]:=R1*Wcos1;
v[3,2]:=outerR*Fsin;

for i:=0 to 3 do
begin
glNormal3fv(@v[i]);
glVertex3fv(@v[i]);
end;
F:=F+dF;
end;
F:=-pi;
W:=W+dW;
end;
glEnd;
end;


 
Gandalf   (2002-10-24 18:03) [1]

Странный вопрос, ты сам ответ сказал, ну вынеси константы за цикл, используй значения прошлой итерации. Если я не ошибаюсь будет так, можно наверное еще улучшить. Можно еще мат-финты использовать(симетрию). Строить только некоторую часть а потом glRotate, новая прорисовка. Много чело можно. Слушай а торус разве не один из gl примитивов, или хочешь руками?

procedure Torus(innerR,outerR:GLDouble;Slices,Loops:GLint);
var w,dW,F,dF:GLFloat;
WCos,WSin,WCos1,WSin1,
R1,R2,
FCos,FSin,FCos1,FSin1:GLFloat;
i:byte;
v:array[0..3,0..2] of GLFloat;
begin
dW:=(2/Slices)*pi;
dF:=(2/Loops)*pi;
W:=-pi;
F:=-pi;
glBegin(GL_Quads);
while(W<pi) do
begin
WCos:=cos(W);
WSin:=sin(W);
WCos1:=Cos(W+dW);
WSin1:=Sin(W+dW);
FCos:=cos(F);
FSin:=sin(F);
while(F<pi) do
begin// Block2
// WCos:=cos(W); // const in Block2
// WSin:=sin(W); // const in Block2
// WCos1:=Cos(W+dW); // const in Block2
// WSin1:=Sin(W+dW); // const in Block2
FCos:=FCos1;//cos(F); // it so
FSin:=FSin1;//sin(F); // it so
FCos1:=Cos(F+dF);
FSin1:=Sin(F+dF);

R1:=(innerR+outerR*FCos);
R2:=(innerR+outerR*Fcos1);

v[0,0]:=R1*Wsin;
v[0,1]:=R1*Wcos;
v[0,2]:=outerR*Fsin;

v[1,0]:=R2*Wsin;
v[1,1]:=R2*Wcos;
v[1,2]:=outerR*Fsin1;

v[2,0]:=R2*Wsin1;
v[2,1]:=R2*Wcos1;
v[2,2]:=outerR*Fsin1;

v[3,0]:=R1*Wsin1;
v[3,1]:=R1*Wcos1;
v[3,2]:=outerR*Fsin;

for i:=0 to 3 do
begin // Block1
glNormal3fv(@v[i]);
glVertex3fv(@v[i]);
end; // Block1
F:=F+dF;
end; //Block2
F:=-pi;
W:=W+dW;
end;
glEnd;
end;


 
Tihas   (2002-10-25 01:37) [2]

Не вроде в GL нет тора там только, примитивы, а в GLU-шар,цилиндр,конус, кольцо, и усёчённое кольцо. Тора там нет.
Ну спосибо, я просто с ОпенGL мало работал, по этому ещё не могу
думать опенджиеливски.
Большое спасибо.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.007 c
1-76456
Ozone
2003-03-12 06:11
2003.03.24
Пишем


1-76416
Vlad V. Oshin
2003-03-13 15:42
2003.03.24
как быстро обнулить массив


14-76651
aga
2003-03-08 14:44
2003.03.24
Объект


9-76253
Dark[UA]
2002-09-30 09:25
2003.03.24
GLScene


3-76318
sapsi
2003-03-05 11:38
2003.03.24
Удаление записей в АДО таблице





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский