Форум: "Игры";
Текущий архив: 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