Direct3D学习(一):3D Sierpinski镂垫绘制

来源:互联网 发布:尼泊尔旅游攻略 知乎 编辑:程序博客网 时间:2024/04/29 07:02

自己几何也太差劲了,时间都花在计算坐标位置上了



图片附件: 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);
    }

}


 

原创粉丝点击