Эллипсоид
Трехосный эллипсоид строится аналогично сфере, код функции:
;#################################################################
Ellipsoide PROC ListNumber:DWORD,Radius:DWORD,Zparts:DWORD,XYparts:DWORD,FillType:DWORD
LOCAL phi:DWORD,i:DWORD,j:DWORD
LOCAL Rx:DWORD,Ry:DWORD,Rz:DWORD
LOCAL theta:DWORD,theta0:DWORD,theta1:DWORD
LOCAL phi0:DWORD,sphi0:DWORD,cphi0:DWORD
LOCAL phi1:DWORD,sphi1:DWORD,cphi1:DWORD
LOCAL x0:DWORD,y0:DWORD,z0:DWORD,x1:DWORD,y1:DWORD,z1:DWORD,x2:DWORD,y2:DWORD,z2:DWORD,x3:DWORD,y3:DWORD,z3:DWORD
finit
fldpi
fmul[dva]
fidiv[XYparts]
fst[phi]
fldpi
fmul[dva]
fidiv[Zparts]
fst[theta]
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
mov eax,0
mov i,eax
newcicle:
finit
fld[phi]
fimul[i]
fst[phi0]
fcos
fst[cphi0]
finit
fld[phi0]
fsin
fst[sphi0]
mov eax,0
mov j,eax
newline:
finit
fld[theta]
fimul[j]
fst[theta0]
fsin
fmul[cphi0]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[y0]
finit
fld[theta0]
fcos
fmul[cphi0]
mov eax,Radius
fmul DWORD PTR [eax]
fst[x0]
finit
fld[phi0]
fsin
mov eax,Radius
fmul DWORD PTR [eax+8]
fst[z0]
finit
fld[theta0]
fadd[theta]
fst[theta1]
fsin
fmul[cphi0]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[y1]
finit
fld[theta1]
fcos
fmul[cphi0]
mov eax,Radius
fmul DWORD PTR [eax]
fst[x1]
fld[phi0]
fsin
mov eax,Radius
fmul DWORD PTR [eax+8]
fst[z1]
fld[phi0]
fadd[phi]
fst[phi1]
fsin
fst[sphi1]
finit
fld[phi1]
fcos
fst[cphi1]
fld[theta1]
fsin
fmul[cphi1]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[y2]
finit
fld[theta1]
fcos
fmul[cphi1]
mov eax,Radius
fmul DWORD PTR [eax]
fst[x2]
fld[phi1]
fsin
mov eax,Radius
fmul DWORD PTR [eax+8]
fst[z2]
finit
fld[theta0]
fsin
fmul[cphi1]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[y3]
finit
fld[theta0]
fcos
fmul[cphi1]
mov eax,Radius
fmul DWORD PTR [eax]
fst[x3]
fld[phi1]
fsin
mov eax,Radius
fmul DWORD PTR [eax+8]
fst[z3]
invoke glBegin,FillType
invoke glNormal3f,x0, y0, z0
invoke glVertex3f,x0,y0,z0
invoke glNormal3f,x1, y1, z1
invoke glVertex3f,x1,y1,z1
invoke glNormal3f,x2, y2, z2
invoke glVertex3f,x2,y2,z2
invoke glNormal3f,x3, y3, z3
invoke glVertex3f,x3,y3,z3
invoke glEnd
inc j
mov eax,j
cmp eax,XYparts
jle newline
inc i
mov eax,i
cmp eax,Zparts
jnz newcicle
invoke glEndList
invoke glDisable,GL_TEXTURE_2D
ret
Ellipsoide ENDP
; #########################################################################
Параметры a, b и c передаются функции в трехэлементном массиве радиуса:
ObjectRadius dd 0.8,0.4,0.3
Чтобы получить эллипсоид вращения достаточно задать одинаковые значения для двух элементов радиуса. Пример эллипсоида, созданного этой функцией: