Sierpinsky pyramid recursive algorithm
我正在尝试实现一个谢尔宾斯基金字塔,它类似于谢尔宾斯基三角形,但是是 3D 的。
我有这个结构来包含有关金字塔的所有数据:
1
2 3 4 5 6 7 8 |
typedef struct
{ GLfloat xUp; GLfloat yUp; GLfloat zUp; GLfloat base; GLfloat height; }pyramid; |
然后我写了一个计算三个子金字塔的函数:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void findSubPyramids( pyramid pyr, pyramid subs[3]) { for(int i=0; i<3; i++) { subs[i].height=pyr.height/2.0; subs[i].base=pyr.base/2.0; } memcpy(subs,&pyr,3*sizeof(GLfloat)); subs[1].yUp= pyr.yUp–pyr.height/2.0; subs[2].yUp= subs[1].yUp; } |
但是这个算法实现是错误的:底部两个子金字塔的zUp坐标有问题:确实金字塔没有按我的意愿绘制:
但是,如果我使用 glOrtho 而不是 gluPerspective,则可以绘制金字塔。我知道我使用的 gluPerspective 和函数是正确的,但是算法是错误的。
这是我实现计算所有子金字塔的算法的地方:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void drawSierpinskyPyramid (pyramid pyr)
{ assert(EQUAL(pyr.height, pyr.base)); if(pyr.base > 4.0) { setRandomColor(); pyramid subs[3]; drawPyramid(pyr); findSubPyramids(pyr, subs); for(int i=0; i<3; i++) { drawSierpinskyPyramid(subs[i]); } } } |
我不明白出了什么问题。
试一试:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
// gcc -std=c99 main.c -lglut -lGL -lGLU
#include <GL/glut.h> typedef struct void glTriangle( Vec3f* v0, Vec3f* v1, Vec3f* v2 ) // v0, v1, v2 = base, v3 = top Vec3f Lerp( Vec3f* v0, Vec3f* v1, float u ) void glSierpinskiPyramid( Vec3f* v0, Vec3f* v1, Vec3f* v2, Vec3f* v3, unsigned int level ) // midpoints glSierpinskiPyramid( v0, &m01, &m02, &m03, level–1 ); void display() glMatrixMode( GL_PROJECTION ); glMatrixMode( GL_MODELVIEW ); srand(0); static float angle = 0; Vec3f v0 = { –1, –1 / sqrtf(3), –1 / sqrtf(6) }; glutSwapBuffers(); void timer(int extra) int main( int argc, char **argv ) glEnable( GL_DEPTH_TEST ); glutMainLoop(); |
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269375.html