2013-03-06 154 views
-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-'); 
+0

你的'网格地图'是什么样的? – Junuxx 2013-03-06 15:20:33

+0

您可以为每个线段创建半平面 - 将其延伸至一条线,并查看左边的哪些点(0)以及右边的哪些点(1) - 布尔矩阵。然后只是相交所有4个。 – 2013-03-06 15:47:28

回答

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) 

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

+0

该代码是否也处理非凸多边形? – MvG 2013-03-06 16:07:35

+0

当然,为什么不呢?这只是分割细分市场的“左”和“右”。元素的顺序很重要,切换它们会使外部进入内部。代码虽然没有经过测试,但您可能需要将>更改为<(我没有Matlab了)。试试看,告诉我它是怎么回事。 – 2013-03-06 16:12:28

+0

我尝试了matlab中的代码..但它使整个MAP = 0? – user1785307 2013-03-06 16:16:09

0

处理非凸多边形将会非常棘手,所以也许您应该首先将多边形划分为多个凸多边形。您可以使用内角来决定角落的非凸面,并将涉及这些角落的剪裁应用到最小。但也许matlab确实支持您可以使用的一些triangulation算法。

一旦你有你的凸多边形,你可以把它们想象成半空间的交点。如果一个有两个角,其跨越行,P是网格点,你可以用行列式的符号

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

在其上线的边点决定所在。哪个符号取决于您在多边形周围走动的顺序,但是如果按顺序处理拐角,那么如果符号不会更改,则点位于凸多边形内。在这个公式中,水平线或垂直线不会是特殊情况,您也不会有任何对性能有益的分割,并且也可能有助于提高精确度。

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

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

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