/********************************************************************* 功能:有效边表转换算法

参数说明: vertices[][2]---顶点列表 VertexNum ---顶点数目 备注: DrawPixel(int x, int y) --绘制像素点(x, y) **********************************************************************/ void CPolygon_ConversionView::Active_Edge_Table_Conersion(int vertices[][2], int vertexNum) { // 定义边表和活动边表 vector edgeTable; vector activeEdgeTable;

// 构建边表
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;
    }
}

}

功能:有效边表转换算法	 参数说明:	 vertices2---顶点列表	 VertexNum ---顶点数目备注: DrawPixelint x int y --绘制像素点x yvoid CPolygon_ConversionViewActive_Edge_Table_Conersionint Vertices2 int VertexNum	return;用c++完成有效边表转

原文地址: https://www.cveoy.top/t/topic/bd4H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录