-
-
-
-
-
-
-
-
-
-
-
-
-
- void DrawChess(double a, double b, double c, int n)
- {
- const double PI = 3.14159265358979323846;
- double fRange1 = PI - atan(a / (b + c));
- double R = sqrt(a * a + (b + c) * (b + c)) + c;
- double fRange2 = atan(a / (b + c));
- double vPos[3], vNormal[3];
-
- for (int i=0; i<n; i++)
- {
- for (int j=0; j<n; j++)
- {
- ;
- #define FILL1(n1, n2) \
- {\
- vPos[0] = (-a * (n1) / n) * cos((n2) * (2.0 * PI) / n);\
- vPos[1] = b;\
- vPos[2] = (-a * (n1) / n) * sin((n2) * (2.0 * PI) / n);\
- vNormal[0] = 0;\
- vNormal[1] = -1.0;\
- vNormal[2] = 0; \
- }\
-
- #define DRAW_TRIANGLE(x) \
- {\
- glBegin(GL_TRIANGLE_STRIP);\
- FILL##x(i, j); glNormal3dv(vNormal); glVertex3dv(vPos);\
- FILL##x(i + 1, j); glNormal3dv(vNormal); glVertex3dv(vPos);\
- FILL##x(i, j + 1); glNormal3dv(vNormal); glVertex3dv(vPos);\
- FILL##x(i + 1, j + 1); glNormal3dv(vNormal); glVertex3dv(vPos);\
- glEnd();\
- }\
-
- DRAW_TRIANGLE(1);
-
-
- #define FILL2(n1, n2) \
- {\
- vPos[0] = (-a - c * sin((n1) * fRange1 / n)) * cos((n2) * (2.0 * PI) / n);\
- vPos[1] = b + c - c * cos((n1) * fRange1 / n);\
- vPos[2] = (-a - c * sin((n1) * fRange1 / n)) * sin((n2) * (2.0 * PI) / n);\
- vNormal[0] = -sin((n1) * fRange1 / n) * cos((n2) * (2.0 * PI) / n);\
- vNormal[1] = -cos((n1) * fRange1 / n);\
- vNormal[2] = -sin((n1) * fRange1 / n) * sin((n2) * (2.0 * PI) / n);\
- }\
-
- DRAW_TRIANGLE(2);
-
-
- #define FILL3(n1, n2) \
- {\
- vPos[0] = (-R * sin(fRange2 - fRange2 * (n1) / n)) * cos((n2) * (2.0 * PI) / n);\
- vPos[1] = R * cos(fRange2 - fRange2 * (n1) / n);\
- vPos[2] = (-R * sin(fRange2 - fRange2 * (n1) / n)) * sin((n2) * (2.0 * PI) / n);\
- vNormal[0] = -sin(fRange2 - fRange2 * (n1) / n) * cos((n2) * (2.0 * PI) / n);\
- vNormal[1] = cos(fRange2 - fRange2 * (n1) / n);\
- vNormal[2] = -sin(fRange2 - fRange2 * (n1) / n) * sin((n2) * (2.0 * PI) / n);\
- }\
-
- DRAW_TRIANGLE(3);
- }
- }
- }
DrawChess(2, 1, 0.8, 50)的绘制效果如下:
DrawChess(2, 1, 0.8, 20)的网格图图效果如下(我把镜头拉近了因此显得大一些):
(acloud) |