Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 像素与多边形重叠:高效(扫描线类型)算法_Graphics_Geometry_Polygon_Computational Geometry_Scanline - Fatal编程技术网

Graphics 像素与多边形重叠:高效(扫描线类型)算法

Graphics 像素与多边形重叠:高效(扫描线类型)算法,graphics,geometry,polygon,computational-geometry,scanline,Graphics,Geometry,Polygon,Computational Geometry,Scanline,问题说明: 我有一个具有顶点坐标(I,j),(I+1,j),(I,j+1),(I+1,j+1)[I=0,…,m-1;j=0,…,n-1]的矩形等距像素图像和一个具有顶点坐标(x_1,y_1),…,(x_n,y_n)的多边形P。现在我想有效地计算每个像素与P重叠的百分比。P可以是非凸的,甚至是自相交的 本质上,这是扫描线光栅化算法的“软”推广,该算法可以有效地检查像素中心是否位于多边形的内部/外部 我可以想到以下方法: (1) 对图像进行上采样(例如,按系数10*10),计算多边形内的子像素中心数

问题说明: 我有一个具有顶点坐标(I,j),(I+1,j),(I,j+1),(I+1,j+1)[I=0,…,m-1;j=0,…,n-1]的矩形等距像素图像和一个具有顶点坐标(x_1,y_1),…,(x_n,y_n)的多边形P。现在我想有效地计算每个像素与P重叠的百分比。P可以是非凸的,甚至是自相交的

本质上,这是扫描线光栅化算法的“软”推广,该算法可以有效地检查像素中心是否位于多边形的内部/外部

我可以想到以下方法:

(1) 对图像进行上采样(例如,按系数10*10),计算多边形内的子像素中心数,然后除以100。问题:时间效率、内存效率、准确性

(2) 在稍微大一点且经过(0.5,0.5)平移的网格上使用扫描线算法来计算完全位于内部/外部的像素,创建“边界”像素列表,沿边缘逆时针行走,并计算与沿途所有像素的相交区域。问题:需要微妙的编码,容易引入错误

我的问题是:有人已经遇到过这个问题吗?你知道第三种更好的方法吗?如果没有,您是否在(1)或(2)方面获得了更好的体验?我假设这个问题可能出现在抗锯齿的环境中?

我会这样做

1a)像素部分重叠时的上采样:

但不是整个图像,只有要检查的当前像素,或当前扫描行中的所有像素(如果有帮助)。

没有内存参数


速度?对于16x16,我认为速度不是问题。

进行精确的几何分析可能不会太困难

首先处理部分被多边形覆盖的像素:可以使用快速查找与多边形边相交的所有像素。然后,可以使用该算法有效地找到边缘和像素之间的交点,从而计算该像素的覆盖面积

请注意,可以避免Cohen-Sutherland中涉及的两个剪裁操作之一,因为相邻像素将共享一个线段交点。例如,如果您有两个相邻的像素,
A
B
在点
a1
a2
b1
b2
处与线段
p->q
相交,则
a2
b1
将是相同的。在对
B
进行剪切时,将段
a2->q
传递到例程中应避免重复工作

您必须对包含多边形顶点的像素进行特殊处理,但这也不应该太棘手:科恩·萨瑟兰(Cohen Sutherland)在这里也会有所帮助

自相交多边形还将抛出一些特殊情况来处理-与两条或多条边相交的像素。我可以很容易地想象,在所有情况下准确地处理这些数据可能会变得棘手,因此我很想在这里使用上采样方法

一旦识别出这些边缘像素,就可以执行标准扫描线操作来填充多边形的内部像素


编辑:事实上,现在我想得更多了,你完全可以跳过科恩·萨瑟兰的步骤。链接纸中的算法可以很容易地扩展,以返回线段和像素网格之间的交点。段将在
min(tmax,tMaxY)
处保留给定像素。跟踪最后一个退出点,将其重新用作下一个像素的进入点。

有点不对劲,但我想它可以工作。我只担心当我们单独处理每个(边缘)像素时,扫描线算法的效率会下降到最低。有什么进展吗?我正在处理完全相同的问题。