功能:有效边表转换算法 参数说明: vertices2---顶点列表 VertexNum ---顶点数目备注: DrawPixelint x int y --绘制像素点x yvoid CPolygon_ConversionViewActive_Edge_Table_Conersionint Vertices2 int VertexNum return;用c++完成有效边表转
/********************************************************************* 功能:有效边表转换算法
参数说明:
vertices[][2]---顶点列表
VertexNum ---顶点数目
备注:
DrawPixel(int x, int y) --绘制像素点(x, y)
**********************************************************************/
void CPolygon_ConversionView::Active_Edge_Table_Conersion(int vertices[][2], int vertexNum)
{
// 定义边表和活动边表
vector
// 构建边表
for (int i = 0; i < vertexNum; i++)
{
int x1 = vertices[i][0];
int y1 = vertices[i][1];
int x2 = vertices[(i + 1) % vertexNum][0];
int y2 = vertices[(i + 1) % vertexNum][1];
// 如果线段不是水平线,则加入边表
if (y1 != y2)
{
EdgeTableNode node;
if (y1 < y2)
{
node.yMax = y2;
node.xMin = x1;
node.k = (float)(x2 - x1) / (float)(y2 - y1);
}
else
{
node.yMax = y1;
node.xMin = x2;
node.k = (float)(x1 - x2) / (float)(y1 - y2);
}
edgeTable.push_back(node);
}
}
// 按yMax排序
sort(edgeTable.begin(), edgeTable.end(), cmp);
// 设置最大y值
int yMax = edgeTable.back().yMax;
// 从上往下扫描
for (int y = 0; y <= yMax; y++)
{
// 将所有yMax为y的边加入活动边表
for (int i = 0; i < edgeTable.size(); i++)
{
if (edgeTable[i].yMax == y)
{
ActiveEdgeNode node;
node.x = edgeTable[i].xMin;
node.k = edgeTable[i].k;
activeEdgeTable.push_back(node);
}
}
// 删除yMin为y的边
for (int i = 0; i < activeEdgeTable.size(); i++)
{
if (activeEdgeTable[i].yMin == y)
{
activeEdgeTable.erase(activeEdgeTable.begin() + i);
i--;
}
}
// 按x排序
sort(activeEdgeTable.begin(), activeEdgeTable.end(), cmp2);
// 绘制像素点
for (int i = 0; i < activeEdgeTable.size(); i += 2)
{
int x1 = activeEdgeTable[i].x;
int x2 = activeEdgeTable[i + 1].x;
for (int x = x1; x <= x2; x++)
{
DrawPixel(x, y);
}
}
// 更新x
for (int i = 0; i < activeEdgeTable.size(); i++)
{
activeEdgeTable[i].x += activeEdgeTable[i].k;
activeEdgeTable[i].yMin = y + 1;
}
}
}
原文地址: https://www.cveoy.top/t/topic/bd4H 著作权归作者所有。请勿转载和采集!