-2

我有一个网格图,使用 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-');
4

3 回答 3

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)

这也应该适用于非凸多边形。

于 2013-03-06T15:59:41.550 回答
0

处理非凸多边形会很棘手,所以也许您应该从将多边形划分为多个凸多边形开始。您可以使用内角来确定角在哪里是非凸的,并应用最少涉及这些角的切割。但也许 matlab 确实支持一些您可以使用的三角测量算法。

一旦有了凸多边形,就可以将它们视为半空间的交集。如果AB是跨越一条线的两个角,并且P是一个网格点,则可以使用行列式的符号

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

来决定点位于直线的哪一侧。哪个符号取决于您在多边形周围行走的顺序,但如果您按顺序处理拐角,则点P位于凸多边形内,前提是符号永远不会改变。在此公式中,水平线或垂直线不会是特殊情况,并且您也不会有对性能有好处的划分,也可能有助于提高准确性。

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

如果您想进一步优化这一点,您可能最好看一下Bresenham 的线算法来计算多边形边界处的点,然后简单地枚举匹配边界之间的水平(或垂直)线上的所有点点。

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

于 2013-03-06T16:54:39.973 回答
0

相关帖子在这里:计算图像和多边形之间重叠的简单方法是什么?

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

于 2013-03-07T09:38:03.657 回答