三角形的光栅化.doc_第1页
三角形的光栅化.doc_第2页
三角形的光栅化.doc_第3页
三角形的光栅化.doc_第4页
三角形的光栅化.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

packageimportflash.display.Bitmap;importflash.display.BitmapData;importflash.display.Sprite;importflash.geom.Rectangle;publicclassDrawTriangleTestextendsSpriteprivatevartarget:BitmapData;privatevarrect:Rectangle;privatevarside:int;privatevarys:int;privatevartri_type:int;/初始值privatevarx0:int,x1:int,x2:int;privatevary0:int,y1:int,y2:int;privatevarxi:Number,yi:Number;privatevarxstart:int,xend:int;privatevarystart:int,yend:int;privatevarxl:Number,xr:Number;/左右斜边当前值/y每递增1时,左右斜边的增量privatevardxdyl:Number,dxdyr:Number;privatevardx:Number,dy:Number;privatevardyr:Number,dyl:Number;publicfunctionDrawTriangleTest()target=newBitmapData(400,400,true,0x0);this.addChild(newBitmap(target);rect=target.rect;varv0:Vector2D=newVector2D(50,10);varv1:Vector2D=newVector2D(10,150);varv2:Vector2D=newVector2D(300,300);drawTriangle(v0,v1,v2,0xFFFF0000);publicfunctiondrawTriangle(vt0:Vector2D,vt1:Vector2D,vt2:Vector2D,color:uint):voidvartemp1:Vector2D;vartri_type:int;vartemp:Number;/判断所有点是否在rect范围内if(vt0.yrect.y)&(vt1.yrect.y)&(vt2.yrect.height)&(vt1.yrect.height)&(vt2.yrect.height)|(vt0.xrect.x)&(vt1.xrect.x)&(vt2.xrect.width)&(vt1.xrect.width)&(vt2.xrect.width)return;/判断是否是一条线,如果是,则返回。if(vt0.x=vt1.x)&(vt1.x=vt2.x)|(vt0.y=vt1.y)&(vt1.y=vt2.y)return;/*调整vt0,vt1,vt2,让它们的y值从小到大*/if(vt1.yvt0.y)temp1=vt0,vt0=vt1,vt1=temp1;if(vt2.yvt0.y)temp1=vt0,vt0=vt2,vt2=temp1;if(vt2.yvt1.y)temp1=vt1,vt1=vt2,vt2=temp1;/*判断三角形的类型*/if(vt0.y=vt1.y)tri_type=Triangle3D.TRI_TYPE_FLAT_TOP;if(vt1.xvt0.x)temp1=vt0,vt0=vt1,vt1=temp1;elseif(vt1.y=vt2.y)tri_type=Triangle3D.TRI_TYPE_FLAT_BOTTOM;if(vt2.xvt1.x)temp1=vt1,vt1=vt2,vt2=temp1;elsetri_type=Triangle3D.TRI_TYPE_GENERAL;side=0;/转折后的斜边在哪一侧x0=vt0.x,y0=vt0.y;x1=vt1.x,y1=vt1.y;x2=vt2.x,y2=vt2.y;ys=y1;/转折点y坐标if(tri_type=Triangle3D.TRI_TYPE_FLAT_TOP|tri_type=Triangle3D.TRI_TYPE_FLAT_BOTTOM)if(tri_type=Triangle3D.TRI_TYPE_FLAT_TOP)dy=1/(y2-y0);dxdyl=(x2-x0)*dy;/左斜边倒数dxdyr=(x2-x1)*dy;/右斜边倒数/y0小于视窗顶部y坐标,调整左斜边和右斜边当前值,y值开始值if(y0rect.y)dy=(rect.y-y0);xl=dxdyl*dy+x0;xr=dxdyr*dy+x1;ystart=rect.y;else/注意平顶和平底这里的区别xl=x0;xr=x1;ystart=y0;else/平底三角形dy=1/(y1-y0);dxdyl=(x1-x0)*dy;dxdyr=(x2-x0)*dy;if(y0视窗高度时,大于rect.height部分就不用画出了if(yend=y2)rect.height)yend=rect.height;/x值需要裁剪的情况if(x0rect.width)|(x1rect.width)|(x2rect.width)for(yi=ystart;yi=yend;yi+)xstart=xl;xend=xr;/初始值需要裁剪if(xstartrect.width)xend=rect.width;/这里可以使用target.fillRect(newRectangle(xstart,yi,(xend-xstart),1),color);/但以后我们添加颜色插值时,还是必须单独绘制每个像素。/绘制扫描线for(xi=xstart;xi=xend;xi+)target.setPixel32(xi,yi,color);/y每增加1时,xl和xr分别加上他们的递增量xl+=dxdyl;xr+=dxdyr;else/不需要裁剪的情况for(yi=ystart;yi=yend;yi+)xstart=xl,xend=xr;for(xi=xstart;xirect.height)yend=rect.height;if(y1rect.y)/由于y0dxdyl)/交换斜边temp=dxdyl,dxdyl=dxdyr,dxdyr=temp;temp=xl,xl=xr,xr=temp;temp=x1,x1=x2,x2=temp;temp=y1,y1=y2,y2=temp;side=1;elseif(y0rect.y)dyl=1/(y1-y0);dxdyl=(x1-x0)*dyl;dyr=1/(y2-y0);dxdyr=(x2-x0)*dyr;dy=(rect.y-y0);xl=dxdyl*dy+x0;xr=dxdyr*dy+x0;ystart=rect.y;if(dxdyrdxdyl)temp=dxdyl,dxdyl=dxdyr,dxdyr=temp;temp=xl,xl=xr,xr=temp;temp=x1,x1=x2,x2=temp;temp=y1,y1=y2,y2=temp;side=1;else/y值都大于rect.ydyl=1/(y1-y0);dxdyl=(x1-x0)*dyl;dyr=1/(y2-y0);dxdyr=(x2-x0)*dyr;xl=x0;xr=x0;ystart=y0;if(dxdyrdxdyl)temp=dxdyl,dxdyl=dxdyr,dxdyr=temp;temp=xl,xl=xr,xr=temp;temp=x1,x1=x2,x2=temp;temp=y1,y1=y2,y2=temp;side=1;/x需要裁剪if(x0rect.width)|(x1rect.width)|(x2rect.width)for(yi=ystart;yi=yend;yi+)xstart=xl,xend=xr;if(xstartrect.width)xend=rect.width;for(xi=xstart;xi=xend;xi+)target.setPixel32(xi,yi,color);xl+=dxdyl;xr+=dxdyr;/转折点if(yi=ys)if(side=0)dyl=1/(y2-y1);dxdyl=(x2-x1)*dyl;xl=x1;xl+=dxdyl;elsedyr=1/(y1-y2);dxdyr=(x1-x2)*dyr;xr=x2;xr+=dxdyr;else/不需要裁剪for(yi=ystart;yi=yend;yi+)xstart=xl,xend=xr;for(xi=xstart;xi=xend;xi+)target.setPixel32(xi,yi,color);xl+=dxdyl;xr+=dxdyr;if(yi=ys)if(side=0)dyl=1/(y2-y1);dxdyl=(x2-x1)*dyl;xl=x1;xl+=dxdyl;elsedyr=1/(y1-y2);dxdyr=(x1-x2)*dyr;xr=x2;xr+=dxdyr;classVector2Dpublicvarx:Number;publicvary:Num

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论