我想就解决这个问题的最佳方法提出一些建议:
我画了两个网格;一个正方形,一个六角形。
我将六边形网格覆盖在方形网格上。
最好对每个六边形下方的方格进行平均,这样每个六边形的值是下方方格的平均值?
您认为最有效的方法是什么?是否有一个我无法找到的内置命令?
答案 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
,以表示一个多边形的结尾和下一个多边形的开头。非映射工具箱多边形函数(例如inpolygon
和patch
)不是这种情况。
您无法直接使用inpolygon
,因为如果多边形相交但一个顶点中没有一个位于另一个顶点内,它将会失败。
不幸的是,这一次仅适用于一个六边形......在某个地方可能有一个更有效的解决方案,但是如果没有尝试“矢量化”它,这是相当复杂的,所以我建议你从这里开始并优化只有你运行进入绩效问题。