Главная страница
    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.009 c
3-76290
anton2v
2003-03-04 16:52
2003.03.24
Подключение к odbc через ConnectionString


14-76664
X-Man
2003-03-06 19:54
2003.03.24
Windows 98


1-76446
Барсук
2003-03-11 07:15
2003.03.24
ListBox с элементами разного цвета


3-76265
Вопрошающий
2003-03-05 17:34
2003.03.24
Проверка подключения ADOConnection.


6-76544
Cherepovets
2003-02-03 13:55
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский