计算机图形学.doc

实验一 多边形彩色填充 实验目的 学习并掌握Y-X扫描线算法 掌握基于 Win32、Visual C++环境下MFC编程绘制图形 实验原理 对任一条扫描线,确定该扫描线与多边形边的交点位置,自左向右存储,并对每对内部交点间的帧缓存填写指定颜色 算法步骤 扫描线链表 4. 边表ET :初始化时建立全局边表(ET),包含多边形所有边,按边端点的ymin排序存放。即:若该边的下端点为ymin,则该边就放在扫描线ymin对应的链表中。每条扫描线交的多边形的边按其下端点的x坐标增序排列。 5. 活跃边表AET:与当前扫描线相交的边称为活性边,按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表(AET) 实验关键代码 CPolyFill::CPolyFill() { m_pEDGEs = NULL; m_pET = NULL; m_pAET = NULL; MinY = 10000; MaxY = -1; MinX = 10000; MaxX = -1; } CPolyFill::~CPolyFill() { if(m_pEDGEs) delete[] m_pEDGEs; if(m_pET) delete[] m_pET; if(m_pAET) delete[] m_pAET; } // 统计多边形各条边的信息,生成Edge结构。 void CPolyFill::BuildEDGEs() { if(m_pEDGEs) { delete[] m_pEDGEs; m_pEDGEs = NULL; } m_pEDGEs = new EDGE[m_PtNum]; for(int i = 0; i m_PtNum-1; i++) { if (m_Pts[i].y m_Pts[i+1].y) { m_pEDGEs[i].Up = m_Pts[i]; m_pEDGEs[i].Down = m_Pts[i+1]; } else { m_pEDGEs[i].Up = m_Pts[i+1]; m_pEDGEs[i].Down = m_Pts[i]; } m_pEDGEs[i].EG.Ymax = m_pEDGEs[i].Up.y ; m_pEDGEs[i].EG.X = m_pEDGEs[i].Down.x; m_pEDGEs[i].EG.Dx = double((m_pEDGEs[i].Up.x - m_pEDGEs[i].Down.x))/(m_pEDGEs[i].Up.y - m_pEDGEs[i].Down.y); } if (m_Pts[0].y m_Pts[m_PtNum-1].y) { m_pEDGEs[m_PtNum-1].Up = m_Pts[0]; m_pEDGEs[m_PtNum-1].Down = m_Pts[m_PtNum-1]; } else { m_pEDGEs[m_PtNum-1].Up = m_Pts[m_PtNum-1]; m_pEDGEs[m_PtNum-1].Down = m_Pts[0]; } m_pEDGEs[m_PtNum-1].EG.Ymax = m_pEDGEs[m_PtNum-1].Up.y ; m_pEDGEs[m_PtNum-1].EG.X = m_pEDGEs[m_PtNum-1].Down.x; m_pEDGEs[m_PtNum-1].EG.Dx = double((m_pEDGEs[m_PtNum-1].Up.x - m_pEDGEs[m_PtNum-1].Down.x))/(m_pEDGEs[m_PtNum-1].Up.y - m_pEDGEs[m_PtNum-1].Down.y); } void CPolyFill::Polygon(CPoint *pts, int cnt) { m_Pts = pts; m_PtNum = cnt; BuildEDGEs(); // 计算出每条多边形边的斜率,Ymax, Xmin等。 CreateET(); // 初始化全局边表 InitAET(); // 初始化活跃边表 } void CPolyFill::CreateET() { GetMinMaxY(MinY,MaxY); if(m_pET) { delete [] m_pET; m_pET = NULL; } m_pET = new CArrayEdge,Edge[MaxY- MinY+1]; // Add

文档评论(0)

1亿VIP精品文档

相关文档