chào các bác pro. em có đoạn code sau, em bợ được trên mạng xuống dùng để vẽ 1 Torus. vẽ 1 cái hình 3d như cái phao. nhưng em đọc mãi mà không hiểu nguyên lí vẽ nó là gì. vì sao phải vẽ như vậy. các bác ai biết giải thích giùm hàm sau với ạ (VD như wrapFrac dùng để làm gì....). em chân thành cảm ơn. chúc các bác sức khỏe

Visual C# Code:
  1.  private void torus(float MinorRadius, float MajorRadius)                    // Draw A Torus With Normals
  2.         {
  3.             int i, j;
  4.             int stacks = 40;
  5.             int slices = 40;
  6.             GL.glBegin(GL.GL_TRIANGLE_STRIP);                                    // Start A Triangle Strip
  7.             for (i = 0; i < stacks; i++)                                        // Stacks
  8.             {
  9.                 for (j = -1; j < slices; j++)                                    // Slices
  10.                 {
  11.                     float wrapFrac = (j % stacks) / (float)slices;
  12.                     double phi = Math.PI * 2.0 * wrapFrac;
  13.                     float sinphi = (float)(Math.Sin(phi));
  14.                     float cosphi = (float)(Math.Cos(phi));
  15.  
  16.                     float r = MajorRadius + MinorRadius * cosphi;
  17.  
  18.                     GL.glNormal3d(
  19.                             (Math.Sin(Math.PI * 2.0 * (i % stacks + wrapFrac) / (float)slices)) * cosphi,
  20.                             sinphi,
  21.                             (Math.Cos(Math.PI * 2.0 * (i % stacks + wrapFrac) / (float)slices)) * cosphi);
  22.                     GL.glVertex3d(
  23.                             (Math.Sin(Math.PI * 2.0 * (i % stacks + wrapFrac) / (float)slices)) * r,
  24.                             MinorRadius * sinphi,
  25.                             (Math.Cos(Math.PI * 2.0 * (i % stacks + wrapFrac) / (float)slices)) * r);
  26.  
  27.                     GL.glNormal3d(
  28.                             (Math.Sin(Math.PI * 2.0 * (i + 1 % stacks + wrapFrac) / (float)slices)) * cosphi,
  29.                             sinphi,
  30.                             (Math.Cos(Math.PI * 2.0 * (i + 1 % stacks + wrapFrac) / (float)slices)) * cosphi);
  31.                     GL.glVertex3d(
  32.                             (Math.Sin(Math.PI * 2.0 * (i + 1 % stacks + wrapFrac) / (float)slices)) * r,
  33.                             MinorRadius * sinphi,
  34.                             (Math.Cos(Math.PI * 2.0 * (i + 1 % stacks + wrapFrac) / (float)slices)) * r);
  35.                    
  36.                 }
  37.             }
  38.             GL.glEnd();                                                        // Done Torus
  39.         }