标签:
扫描线填充三角形,首先把三角形拦腰切开,使其变成一个平底三角形和一个平顶三角形。
然后分别对这两个三角形进行扫描线填充。
下面fillPanBottomTriFace和fillPanTopTriFace分别是填充平底和平顶三角形的实现。
需要注意的是,填充平底三角形时扫描线一定要从底开始逐行向上扫描,填充平顶三角形时扫描线一定要从顶开始逐行向下扫描。如果不按此规则做的话,对于纵向非常扁的三角形,在顶(底)处会滋出一个非常难看的线头儿。
void fillPanBottomTriFace(const Cc3dVector4&pTop,const Cc3dVector4&pBottomLeft,const Cc3dVector4&pBottomRight){ const int yTop_int=pTop.y(); const int yBottom_int=pBottomLeft.y(); const float leftDxDivDy=(pTop.x()-pBottomLeft.x())/(pTop.y()-pBottomLeft.y()); const float rightDxDivDy=(pTop.x()-pBottomRight.x())/(pTop.y()-pBottomRight.y()); float xLeft=pBottomLeft.x(); float xRight=pBottomRight.x(); for(int y_int=yBottom_int;y_int<=yTop_int;y_int++){ const int xLeft_int=(int)(xLeft); const int xRight_int=(int)(xRight); for(int x_int=xLeft_int;x_int<=xRight_int;x_int++){ drawPixel_OAtLD(x_int,y_int,RGB(255, 0,0)); } xLeft+=leftDxDivDy; xRight+=rightDxDivDy; } } void fillPanTopTriFace(const Cc3dVector4&pTopLeft,const Cc3dVector4&pBottom,const Cc3dVector4&pTopRight){ const int yTop_int=pTopLeft.y(); const int yBottom_int=pBottom.y(); const float leftDxDivDy=(pTopLeft.x()-pBottom.x())/(pTopLeft.y()-pBottom.y()); const float rightDxDivDy=(pTopRight.x()-pBottom.x())/(pTopRight.y()-pBottom.y()); float xLeft=pTopLeft.x(); float xRight=pTopRight.x(); for(int y_int=yTop_int;y_int>=yBottom_int;y_int--){ const int xLeft_int=(int)(xLeft); const int xRight_int=(int)(xRight); for(int x_int=xLeft_int;x_int<=xRight_int;x_int++){ drawPixel_OAtLD(x_int,y_int,RGB(255, 0,0)); } xLeft-=leftDxDivDy; xRight-=rightDxDivDy; } }
标签:
原文地址:http://www.cnblogs.com/wantnon/p/4845913.html