使用多边形算法

时间:2016-01-14 16:29:05

标签: c graphics

我正致力于实现一种填充多边形的算法。我使用本教程作为参考:http://alienryderflex.com/polygon_fill/

这是我的代码:

//point in polygon algorithm for filling polyons

void fill_polygon(Array *vx,Array *vy){
    int  nodes, nodeX[1000], pixelX, pixelY, i, j, swap,top,bot,right,left,polyCorners ;
    polyCorners = vx->used;
    if(polyCorners<=2){
        return;
    }

    bot = maximum(vy);
    top = minimum(vy);
    right = maximum(vx);
    left = minimum(vx);
    /*printf("Top %d  - Bot %d - Left %d - Right %d \n",top,bot,left,right);
    wait(40);*/
    for (pixelY=top; pixelY<bot; pixelY++) {

        //  building list of nodes
        nodes=0; j=polyCorners-1;
        for (i=0; i<polyCorners; i++) {
            if (vy->array[i]< pixelY && vy->array[j]>=pixelY
                ||  vy->array[j]< pixelY && vy->array[i]>= pixelY) {

                nodeX[nodes++]=(int) (vx->array[i]+(pixelY-vy->array[i])/(vy->array[j]-vy->array[i])*(vx->array[j]-vx->array[i])); 

            }
            j=i; 
        }   
        //   bubble sort
        i=0;
        while (i<nodes-1) {
            if (nodeX[i]>nodeX[i+1]) {
              swap=nodeX[i]; nodeX[i]=nodeX[i+1]; nodeX[i+1]=swap; if (i) i--; 
            }

            else {
              i++; 
            }
        }
     // filling pixels between nodes
        for (i=0; i<nodes; i+=2) {
            if   (nodeX[i  ]>=right) break;

            if   (nodeX[i+1]> left ) {
                if (nodeX[i  ]< left ) nodeX[i  ]=left ;
                if (nodeX[i+1]> right) nodeX[i+1]=right;
                for (pixelX=nodeX[i]; pixelX<nodeX[i+1]; pixelX++){

                    plot_pixel(pixelX,pixelY,current_color);
                }  
            }
        }       

    }
}

vxvy变量是具有多边形每个顶点的x和y坐标的数组。我已经检查了很长时间的代码,但我仍然不知道我做错了什么。

这是我绘制一个简单的4边多边形时得到的结果: 之前: 图一是绘图(这不是与下图相同的图,但它也是一个4边多边形) enter image description here

后:

enter image description here

如果它有帮助,不知何故,当我绘制正方形时,算法会正确填充它:

enter image description here

你能帮我找一下代码中的错误吗?

1 个答案:

答案 0 :(得分:1)

vx->array[i]+(pixelY-vy->array[i])/(vy->array[j]-vy->array[i])*(vx->array[j]-vx->array[i])

假设这些都是整数,这将进行整数除法。也就是说,它会在分裂后扔掉小数部分。

您可以先将double中涉及的其中一个数字投射到double分区:

vx->array[i]+(pixelY-vy->array[i])/(double)(vy->array[j]-vy->array[i])*(vx->array[j]-vx->array[i])
                                   ^^^^^^^^

或者您可以交换操作顺序,因此乘法首先发生。 (但是,如果数字足够大,这可能会导致溢出)

vx->array[i]+(pixelY-vy->array[i])*(vx->array[j]-vx->array[i])/(vy->array[j]-vy->array[i])