Тор из четырехугольников
Функция, строящая квадратический (хоботический?) тор:
; #########################################################################
Torus PROC ListNumber:DWORD,Radius:DWORD,XYParts:DWORD,ZParts:DWORD,FillType:DWORD
LOCAL XYStep:DWORD,ZStep:DWORD
LOCAL i:DWORD,j:DWORD,fi:DWORD,fj:DWORD
LOCAL c0:DWORD,c1:DWORD,r:DWORD,r1:DWORD,z:DWORD,z1:DWORD,b:DWORD,b1:DWORD
LOCAL a0:DWORD,a1:DWORD,tmpx0:DWORD,tmpx1:DWORD,tmpy0:DWORD,tmpy1:DWORD
LOCAL x0:DWORD,y0:DWORD,x1:DWORD,y1:DWORD
LOCAL x2:DWORD,y2:DWORD,x3:DWORD,y3:DWORD
LOCAL x0n:DWORD,y0n:DWORD,x1n:DWORD,y1n:DWORD,zn:DWORD,z1n:DWORD
LOCAL x2n:DWORD,y2n:DWORD,x3n:DWORD,y3n:DWORD,z2n:DWORD,z3n:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
fldpi
fmul[dva]
fidiv[XYParts]
fst[XYStep]
mov eax,XYParts
dec eax
mov fi,eax
fldpi
fmul[dva]
fidiv[ZParts]
fst[ZStep]
mov i,0
newcicle:
fld[XYStep]
fimul[i]
fst[a0]
fadd[XYStep]
fst[a1]
fld[a0]
fcos
fst[tmpx0]
finit
fld[a0]
fsin
fst[tmpy0]
fld[a1]
fcos
fst[tmpx1]
fld[a1]
fsin
fst[tmpy1]
mov j,0
newline:
fld[ZStep]
fimul[j]
fst[b]
fcos
fst[c0]
mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c0]
fadd DWORD PTR [eax]
fst[r]
finit
fld[b]
fsin
fst[zn]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z]
fld[b]
fadd[ZStep]
fst[b1]
fcos
fst[c1]
mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c1]
fadd DWORD PTR [eax]
fst[r1]
finit
fld[b1]
fsin
fst[z1n]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z1]
finit
fld[tmpx0]
fmul[r]
fst[x0]
fld[tmpy0]
fmul[r]
fst[y0]
finit
fld[tmpx1]
fmul[r]
fst[x1]
fld[tmpy1]
fmul[r]
fst[y1]
finit
fld[tmpx0]
fmul[r1]
fst[x2]
fld[tmpy0]
fmul[r1]
fst[y2]
finit
fld[tmpx1]
fmul[r1]
fst[x3]
fld[tmpy1]
fmul[r1]
fst[y3]
finit
fld[tmpx0]
fmul[c0]
fst[x0n]
fld[tmpy0]
fmul[c0]
fst[y0n]
finit
fld[tmpx1]
fmul[c0]
fst[x1n]
fld[tmpy1]
fmul[c0]
fst[y1n]
finit
fld[tmpx0]
fmul[c1]
fst[x2n]
fld[tmpy0]
fmul[c1]
fst[y2n]
finit
fld[tmpx1]
fmul[c1]
fst[x3n]
fld[tmpy1]
fmul[c1]
fst[y3n]
invoke glBegin,FillType
invoke glNormal3f,x0n,y0n,zn
invoke glVertex3f,x0,y0,z
invoke glNormal3f,x1n,y1n,zn
invoke glVertex3f,x1,y1,z
invoke glNormal3f,x3n,y3n,z1n
invoke glVertex3f,x3,y3,z1
invoke glNormal3f,x2n,y2n,z1n
invoke glVertex3f,x2,y2,z1
invoke glEnd
inc j
mov ecx,ZParts
cmp ecx,j
jge newline
inc i
mov ecx,fi
cmp ecx,i
jge newcicle
invoke glEndList
ret
Torus ENDP
; #########################################################################
Геометрия тора задается двухэлементным массивом, первый элемент внешний радиус, второй - разность внешнего радиуса и радиуса дырки:
ObjectRadius dd 0.7,0.2
Пример тора, построенного функцией: