刘世光 天津大学计算机学院
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章图元的属性
刘世光
天津大学计算机学院
天津大学计算机科学与技术学院
主要内容
•点、线的属性
•填充图元的属性
(扫描线填充算法;边界填充算法;
泛滥填充算法)
天津大学计算机科学与技术学院
点的属性
•点的两个属性:颜色和大小
•对于光栅系统而言,点的大小是像素大小的一个整倍数。
•OpenGL的点属性函数
glPointSize(size); p.154
天津大学计算机科学与技术学院
天津大学计算机科学与技术学院
OpenGL的线属性函数
•设定线宽:
glLineWidth(width);
•设定线型:
glLineStripple(repeatFactor, pattern) glEnable(GL_LINE_STIPPLE);
使用不同的OpenGL线型和线宽绘制数据集(图4.16 P.155)
天津大学计算机科学与技术学院
多边形区域的填充
(多边形区域的扫描转换)
•确定哪些像素位于填充图元的内部;•确定以什么颜色填充这些像素。
天津大学计算机科学与技术学院
多边形的填充
•逐点判断算法
void FillPolygonPbyP(Polygon *P, int polygonColor) { int x,y;
for(y = ymin;y<= ymax;y++)
for(x = xmin;x<= xmax;x++)
if(IsInside(P,x,y))
PutPixel(x,y,polygonColor);
else
PutPixel(x,y,backgroundColor);
}/*end of FillPolygonPbyP()*/
天津大学计算机科学与技术学院
天津大学计算机科学与技术学院
–交点的取整规则
•要求:使生成的像素全部位于多边形之内–用于线画图元扫描转换的四舍五入原则导致部分像素
位于多边形之外,从而不可用
•假定非水平变与扫描线y=e Array相交,交点的合作标为x,
规则如下
天津大学计算机科学与技术学院
–数据结构
•边
typedef struct{int ymax;
float x,deltax;
Edge *nextEdge;
}Edge;
•边的分类表E
按照边的下端点y坐标对非水平边进行分类的指针数组•活化边表AEL
记录与当前扫描线相交的边(交点)
天津大学计算机科学与技术学院
天津大学计算机科学与技术学院
扫描线填充算法
算法步骤:
1、建立ET;
2、将扫描线纵坐标y的初值置为ET中非空元素的最小序号,如在上图中,y=1;
3、置AEL为空;
4、执行下列步骤直至ET和AEL都为空.
4.1、如ET中的第y类非空,则将其中的所有边取出并插入AEL中;
4.2、如果有新边插入AEL,则对AEL中各边排序;
4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,…),将每对边中x坐标按规则取整,获得有效的填充区段,再填充.
4.4、将当前扫描线纵坐标y值递值1;
4.5、将AEL中满足y=ymax边删去(因为每条边被看作下闭上开的);
4.6、对AEL中剩下的每一条边的x递增deltax,即x = x+deltax.
天津大学计算机科学与技术学院
不规则边界区域的填充方法•从区域的一个内部点开始,由内向外逐点绘制直到边界。
•算法条件:
输入待填充区域的一个起始位置;边界或内部的颜色信息
•常用算法:
边界填充算法;泛滥填充算法
天津大学计算机科学与技术学院
连通:
天津大学计算机科学与技术学院
•递归填充算法
–内点表示的4连通区域
void BoundaryFill4(int x, int y, int fillColor, int borderColor) {
int interiorColor;
getPixel(x, y, interiorColor);
if((interiorColor!=borderColor) && (interiorColor!=fillColor)) {
SetPixel(x, y, fillColor);
FloodFill4(x,y+1, fillColor, borderColor);
FloodFill4(x,y-1, fillColor, borderColor);
FloodFill4(x-1,y, fillColor, borderColor);
FloodFill4(x+1,y, fillColor, borderColor); }
}/*end of FloodFill4()*/
天津大学计算机科学与技术学院
泛滥填充算法
•有时,我们要对一个不是用单一颜色边界定义的区域(图4.30)进行填充。可以通过替换指定的内部颜色而不是搜索边界颜色值来对该区域涂色,这种方法称为泛滥填充算法(Flood-fill algorithm)。
天津大学计算机科学与技术学院
泛滥填充算法
算法步骤:
void floodFill4(int x, int y, int fillColor, int borderColor) {
int color;
getPixel(x, y, color);
if(color=interiorColor))
{
SetPixel(x, y, fillColor);
FloodFill4(x,y+1, fillColor,borderColor);
FloodFill4(x,y-1, fillColor,borderColor);
FloodFill4(x-1,y, fillColor,borderColor);
FloodFill4(x+1,y, fillColor,borderColor); }
}/*end of FloodFill4()*/
天津大学计算机科学与技术学院