覆盖两个网格

时间:2013-05-07 10:42:40

标签: matlab grid

我想就解决这个问题的最佳方法提出一些建议:

我画了两个网格;一个正方形,一个六角形。

我将六边形网格覆盖在方形网格上。

Image

最好对每个六边形下方的方格进行平均,这样每个六边形的值是下方方格的平均值?

您认为最有效的方法是什么?是否有一个我无法找到的内置命令?

1 个答案:

答案 0 :(得分:0)

以下示例使用polyxpoly查找六边形与方形网格的交点,然后使用inpolygon找出哪些方格相交。

% Generate grid of squares
sqSize = 5; 
sqN = 4; 
sqPolyX = [0 0 sqSize sqSize 0]'; 
sqPolyY = [0 sqSize sqSize 0 0]';
offs = (0:sqN-1) * sqSize;
[sqXOff, sqYOff] = meshgrid(offs, offs);

sqX = bsxfun(@plus, sqPolyX, sqXOff(:)');
sqY = bsxfun(@plus, sqPolyY, sqYOff(:)');

% Generate one hexagon
Nsides = 6;
hexTh = (0:Nsides)' * 2*pi / Nsides;
hexSize = 2.5; % "radius"
hexOff = rand(2, 1) * (sqN * sqSize);
hexPolyX = hexSize * cos(hexTh) + hexOff(1);
hexPolyY = hexSize * sin(hexTh) + hexOff(2);

% Find intersections between polygons
[xi, yi] = polyxpoly([sqX; NaN(1, sqN^2)], [sqY; NaN(1, sqN^2)], hexPolyX, hexPolyY);

% Find squares corresponding to intersections
hexInPolys = false(sqN^2, 1);
for nSquare = 1:sqN^2
    hexInPolys(nSquare) = any(inpolygon(xi, yi, sqX(:, nSquare), sqY(:, nSquare))); 
end
hexInPolys = find(hexInPolys);

% Make some pretty plots
close all;
hold on;
patch(sqX, sqY, rand(size(sqX)));

for nFound = 1:length(hexInPolys)
    fill(sqX(:, hexInPolys(nFound)), sqY(:, hexInPolys(nFound)), 'r')
end

patch(hexPolyX, hexPolyY, rand(size(hexPolyX)))
plot(xi, yi, 'o');

注意每个多边形必须传递给NaN的附加polyxpoly,以表示一个多边形的结尾和下一个多边形的开头。非映射工具箱多边形函数(例如inpolygonpatch)不是这种情况。

您无法直接使用inpolygon,因为如果多边形相交但一个顶点中没有一个位于另一个顶点内,它将会失败。

不幸的是,这一次仅适用于一个六边形......在某个地方可能有一个更有效的解决方案,但是如果没有尝试“矢量化”它,这是相当复杂的,所以我建议你从这里开始并优化只有你运行进入绩效问题。