Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Matlab 提取多边形的栅格坐标_Matlab_Grid_Geometry_Polygon - Fatal编程技术网

Matlab 提取多边形的栅格坐标

Matlab 提取多边形的栅格坐标,matlab,grid,geometry,polygon,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

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

首先画一条封闭线:

x = [x x(1)]
y = [y y(1)]
以及不同点处
X
Y
值的矩阵:

Y = repmat((1:MAX_Y)',[1,MAX_X])
X = repmat(1:MAX_X,[MAX_Y,1])
然后您可以使用:


这也适用于非凸多边形。

处理非凸多边形将是一件棘手的事情,因此,也许您应该从将多边形划分为多个凸多边形开始。可以使用内角来确定角点的非凸位置,并应用涉及这些角点的最小切割。但也许matlab确实支持一些可以使用的算法

一旦你有了凸多边形,你可以把它们看作是半空间的交点。如果A和B是跨越直线的两个角,P是网格点,则可以使用行列式的符号

| Ax Bx Px|
|一个接一个|
| 1  1  1  |
决定点位于直线的哪一侧。哪个符号取决于围绕多边形行走的顺序,但如果按顺序处理角点,则点P位于凸多边形内,前提是符号从未更改。在这个公式中,水平线或垂直线都不是特例,也不会有分割,这对性能有好处,也可能有助于精确性

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

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

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

相关帖子如下:


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

你的“栅格地图”是什么样子的?你可以为每个线段创建半平面-将其延伸到一条直线,并查看哪些点在左边(0),哪些点在右边(1)-布尔矩阵。然后将它们全部相交。这个代码也处理非凸多边形吗?当然,为什么不呢?它只是将一段的“左”和“右”边分开。元素的顺序很重要,切换它们会使外部变为内部。虽然代码没有经过测试,但您可能需要将>更改为<(我不再使用Matlab)。试一下,告诉我它是怎么运行的。我在matlab中试过代码。但是它使整个映射=0??我不是OP,也没有matlab。但是,对于“超出”线段的点,即超过端点的某个位置,如果多边形不是凸的,则信息“左”或“右”可能会导致错误的情况。@MvG:好点-没有想到这一点。
MAP = inpolygon(X,Y,x,y)