图片附件: Sierpinski.JPG (2007-3-29 00:56, 39.68 K)
附件: D3DStudy.exe (2007-3-29 00:56, 64 K)
主要算法,就是个递归:
/***************************************
*三角形绘制
*vertex[3]
***************************************/
inline void DrawTriangle(CustomVertex vertex[])
{
//拷贝到顶点缓存
memcpy(pVertices,vertex,3 * sizeof(CustomVertex));
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
}
/****************************************
*Sierpinski镂垫绘制
*deepth:递归深度
****************************************/
void DrawSierpinski(CustomVertex vertex[],int deepth)
{
if(deepth == 0)
{
DrawTriangle(vertex);
return;
}else
{
//计算中点
CustomVertex midVertex[] =
{
{(vertex[1].x + vertex[2].x)/2,(vertex[1].y + vertex[2].y)/2,(vertex[1].z + vertex[2].z)/2,vertex[0].color},
{(vertex[0].x + vertex[2].x)/2,(vertex[0].y + vertex[2].y)/2,(vertex[0].z + vertex[2].z)/2,vertex[1].color},
{(vertex[1].x + vertex[0].x)/2,(vertex[1].y + vertex[0].y)/2,(vertex[1].z + vertex[0].z)/2,vertex[2].color}
};
CustomVertex tempVertex[3];
//分三部分进行递归绘制
tempVertex[0] = vertex[0];
tempVertex[1] = midVertex[2];
tempVertex[2] = midVertex[1];
DrawSierpinski(tempVertex,deepth - 1);
tempVertex[0] = midVertex[2];
tempVertex[1] = vertex[1];
tempVertex[2] = midVertex[0];
DrawSierpinski(tempVertex,deepth - 1);
tempVertex[0] = midVertex[1];
tempVertex[1] = midVertex[0];
tempVertex[2] = vertex[2];
DrawSierpinski(tempVertex,deepth - 1);
}
}