我正致力于实现一种填充多边形的算法。我使用本教程作为参考: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);
}
}
}
}
}
vx
和vy
变量是具有多边形每个顶点的x和y坐标的数组。我已经检查了很长时间的代码,但我仍然不知道我做错了什么。
这是我绘制一个简单的4边多边形时得到的结果: 之前: 图一是绘图(这不是与下图相同的图,但它也是一个4边多边形)
后:
如果它有帮助,不知何故,当我绘制正方形时,算法会正确填充它:
你能帮我找一下代码中的错误吗?
答案 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])