正确的解决办法是,当顶点表现为是 局部极大或局部极小时,就看做是二个, 否则看做一个。这里一个顶点是局部极 大,如果这个顶点的前面和后面各有一 些相邻顶点的y坐标,都小于该顶点的y 坐标。是局部极小可类似地确定。 实际处理这个问题可以有一个简便 办法,那就是对应该看做是一个的顶点, 将其上面的边缩短两条相邻扫描线对应 的一个单位
正确的解决办法是,当顶点表现为是 局部极大或局部极小时,就看做是二个, 否则看做一个。这里一个顶点是局部极 大,如果这个顶点的前面和后面各有一 些相邻顶点的y坐标,都小于该顶点的y 坐标。是局部极小可类似地确定。 实际处理这个问题可以有一个简便 办法,那就是对应该看做是一个的顶点, 将其上面的边缩短两条相邻扫描线对应 的一个单位
怎样计算扫描线与多边形边界线的交 点。注意到若扫描线y,与多边形边界线 交点x的坐标是x:,则对下一条扫描线 它与那条边界线的交点的x坐标x;+1 可如下求出:x+1=x+
怎样计算扫描线与多边形边界线的交 点。注意到若扫描线yi与多边形边界线 交点x的坐标是xi,则对下一条扫描线 yi+l,它与那条边界线的交点的x坐标xi+1, 可如下求出: i m x i x 1 1 = + +
活跃边表AET(Active-Edge-一 Table),用这个表存贮与当前扫描线相 交的各边。每次离开一条扫描线进入下 一 条之前,将表中有但与下一条扫描线 不相交的边清除出表,将与下一条扫描 线相交而表中没有的边加入表中。 边表ET(Edge一Table),ET中各登记 项按y坐标递增排序,每一登记项下的 “吊桶”按所记x坐标递增排序,“吊桶 中各项的内容依次是:
活跃边表AET(Active—Edge— Table),用这个表存贮与当前扫描线相 交的各边。每次离开一条扫描线进入下 一条之前,将表中有但与下一条扫描线 不相交的边清除出表,将与下一条扫描 线相交而表中没有的边加入表中。 边表ET(Edge—Table),ET中各登记 项按y坐标递增排序,每一登记项下的 “吊桶”按所记x坐标递增排序,“吊桶” 中各项的内容依次是:
1.边的另一端点的较大的y坐标yx 2.与较小的y坐标对应的边的端点的x 坐标Xmin 3.斜率的倒数,即1/m。 Void Polygonfill(EdgeTableET,COLORREF color) {y=置y为边表ET中各登记项对应的y坐标 中最小的值; 活跃边表AET初始化为空表; while(ET表中仍有扫描线未被处理)/处理 ET表中的每一条扫描线
1.边的另—端点的较大的y坐标ymax。 2.与较小的y坐标对应的边的端点的x 坐标xmin。 3.斜率的倒数,即1/m。 Void Polygonfill(EdgeTableET,COLORREF color) { y=置y为边表ET中各登记项对应的y坐标 中最小的值; 活跃边表AET初始化为空表; while(ET表中仍有扫描线未被处理) //处理 ET表中的每一条扫描线
{将ET中登记项y对应的各“吊桶”合 并到表AET中,将AET中各吊桶按x坐 标递增排序; 在扫描线y上,按照AET表提供的x坐标 对,用color实施填充; 将AET表中有ymax的各项清除出表; 对AET中留下的各项,分别将x换为 x+1/m,这是求出AET中各边与下一条 扫描线交点的x坐标; 由于前一步可能破坏了AET表中各项x 坐标的递增次序,故按x坐标重新排序;
{ 将ET中登记项y对应的各“吊桶”合 并到表AET中,将AET中各吊桶按x坐 标递增排序; 在扫描线y上,按照AET表提供的x坐标 对,用color实施填充; 将AET表中有y=ymax的各项清除出表; 对AET中留下的各项,分别将x换为 x+1/m,这是求出AET中各边与下一条 扫描线交点的x坐标; 由于前一步可能破坏了AET表中各项x 坐标的递增次序,故按x坐标重新排序;
yy+1,去处理下一条扫描线。 3 11 10 97 520回7 64 6 回130区 -920N 375257648 0 》nx Xnmn 1物
y=y+1,去处理下一条扫描线。 } }
AET指针 初始化区 扫描线13752□5764 e1 扫描线2□4出528出264☒ 扫描线3□32521064☒ 扫描线4□-可20□51⅓64☒ 扫描线592051364 扫描线6920□130 扫描线7-可20□-回752□回764工-回30☒ e2 扫描线8□920□94出52回864回130 2 扫描线9920-9252□-回1064□-回130区 e 扫描线1回1出64回130 es 扫描线1-回1364工-回130 扫猫线12