提取多边形的网格坐标

时间:2013-03-06 15:18:31

标签: matlab grid geometry polygon

我有一个使用Matlab构建的网格图。我正在放置一些多边形。如何提取这些多边形内的网格坐标?感谢..

% construct grid
MAX_X=10;
MAX_Y=10;
MAX_VAL=10;
MAP=2*(ones(MAX_X,MAX_Y));
axis([1 MAX_X+1 1 MAX_Y+1])
grid on;
hold on;
%obst 1
x = [1 1 4 4];
y = [1 11 11 1];
plot([x x(1)],[y y(1)],'r-');

% obst 2
x = [7 7 11 11];
y = [11 1 1 11];
plot([x x(1)],[y y(1)],'r-');

3 个答案:

答案 0 :(得分:0)

首先做一个封闭的行:

x = [x x(1)]
y = [y y(1)]

以及XY在不同点的值矩阵:

Y = repmat((1:MAX_Y)',[1,MAX_X])
X = repmat(1:MAX_X,[MAX_Y,1])

然后您可以使用inpolygon

MAP = inpolygon(X,Y,x,y)

这也适用于非凸多边形。

答案 1 :(得分:0)

处理非凸多边形将非常棘手,因此您可能应该首先将多边形划分为多个凸多边形。您可以使用内角来确定拐角非凸的位置,并至少应用涉及这些拐角的切口。但也许matlab确实支持你可以使用的一些triangulation算法。

一旦得到凸多边形,就可以将它们视为半空间的交点。如果 A B 是跨越一条线的两个角,而 P 是一个网格点,则可以使用行列式的符号

| Ax Bx Px |
| Ay By Py |
| 1  1  1  |

决定该点在哪一侧。哪个符号取决于您在多边形中走动的顺序,但如果按顺序处理角点,则点 P 位于凸多边形内,如果符号永远不会改变。水平或垂直线条在这个公式中不会是特殊情况,并且您不会有任何有利于提高性能的分区,也可能有助于提高准确性。

如果您不想使用该方法迭代所有网格点,则可以进行各种优化。一种方法是预先计算跨越每一行的两个角的叉积 A × B 。该交叉乘积与点 P 之间的点积等于上述行列式(即det(A,B,P)=(A×B)·P),因此不是完全行列式你现在只需为每个点线组合计算三个产品和两个总和。

如果你想进一步优化它,你可能最好看Bresenham's line algorithm之类的东西来计算多边形边界处的点,然后简单地枚举水平(或垂直)上的所有点匹配边界点之间的线。

除非您使用整数或其他确切数字执行所有计算,否则舍入问题可能是所有这些中的主要问题。您必须决定是否计算边界点,并确保计算原始多边形内的点,但在其凸起部分的边界上只计算一次。这需要多少努力在很大程度上取决于你的输入是什么样的。

答案 2 :(得分:0)

相关帖子位于:What is an simple way to compute the overlap between an image and a polygon?

inpolygon 可能适用于您的应用程序,但只有在特定网格框的中心点位于多边形内部时才会返回true。如果您想知道网格框的任何部分是否在多边形内,它将无法工作。上述帖子中的提问者显示了使用 inpolygon 的示例。