码迷,mamicode.com
首页 > 其他好文 > 详细

扫描线填充三角形注意事项

时间:2015-09-29 12:47:56      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

扫描线填充三角形,首先把三角形拦腰切开,使其变成一个平底三角形和一个平顶三角形。

然后分别对这两个三角形进行扫描线填充。

下面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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!