我想找到图像中的所有像素(在笛卡尔坐标系中),它们位于特定极坐标范围内,r_min r_max theta_min和theta_max。换句话说,我有一些环形部分用上面提到的参数定义,我想找到位于其中的像素的整数x,y坐标。蛮力解决方案来到中间(通过图像的所有像素并检查它是否在其中)但我想知道是否有更有效的解决方案。
由于
答案 0 :(得分:1)
为简单起见,我们假设该部分的中心位于0,0。如果没有,可以通过偏移所有坐标来轻松改变。
对于从r_max
到-r_max
的每个可能的y坐标,找到两个半径的圆的x坐标:-sqrt(r*r-y*y)
和sqrt(r*r-y*y)
。对于r_max
圈内和r_min
圈外的每个点,可能成为该部分的一部分,需要进一步测试。
现在进行相同的x坐标计算,但这次使用角度描述的线段。您需要一些条件逻辑来确定线的哪一侧在内,哪一侧在外,以及它是否影响该部分的上部或下部。
答案 1 :(得分:1)
在强力解决方案中,您可以首先通过计算四个顶点并根据需要包括四个基本极值点来确定区域的紧密边界框。然后,对于每个像素,您将必须评估两个圆(二次表达式)和两个直线(线性表达式)。通过递增计算(X => X + 1),操作次数下降到大约没有。
在圈内
f(X,Y) = X²+Y²-2XXc-2YYc+Xc²+Yc²-R² <= 0
增量,
f(X+1,Y) = f(X,Y)+2X+1-2Xc <= 0
如果你真的想避免这种开销,你将采用扫描线转换技术。首先想到填充一个倾斜的矩形。通过中间顶点绘制两条水平线,可以将矩形分解为两个三角形和一个平行四边形。然后,对于穿过其中一个形状的任何扫描线,您事先知道要相交的一对边。从那里,您知道需要填充扫描线的哪个部分。
您可以推广到任何形状,尤其是圆形线段。准备进行相对微妙的案例分析,但找到交叉点并不是那么难。通过中心垂直分割域可能会有所帮助,这样任何水平方向总是会遇到轮廓两次,而不是四次。