【问题标题】:extract grid coordinates of the polygon [closed]提取多边形的网格坐标[关闭]
【发布时间】:2013-03-06 15:18:30
【问题描述】:

我有一个网格图,使用 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) 以及哪些位于右侧 (1) - 一个布尔矩阵。然后将它们全部相交。

标签: matlab grid geometry polygon


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    先画一个闭合线:

    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)
    

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

    【讨论】:

    • 该代码是否也处理非凸多边形?
    • 当然,为什么不呢?它只是分割一个段的“左”和“右”侧。元素的顺序很重要,切换它们会使外部进入内部。虽然代码没有经过测试,您可能需要将 > 更改为
    • 我在 matlab 中尝试了代码..但它使整个 MAP=0??
    • 我不是 OP,也没有 matlab。但是对于一个“超出”段的点,即超过端点的某个点,如果多边形不是凸的,“左”或“右”信息可能会导致错误的情况。
    • @MvG:好点 - 没想到。
    【解决方案3】:

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

    一旦你有了凸多边形,你就可以把它们想象成半空间的交集。如果 AB 是跨越一条线的两个角,而 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 之类的东西来计算多边形边界处的点,然后简单地枚举它们之间的水平(或垂直)线上的所有点匹配的边界点。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 2012-07-05
      • 2019-02-14
      相关资源
      最近更新 更多