2

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

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

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

图片

什么是最好的平均每个六边形下面的正方形,所以每个六边形的值是下面正方形的平均值?

您认为最有效的方法是什么?有没有我找不到的内置命令?

4

1 回答 1

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注意必须为每个多边形传递的附加spolyxpoly来表示一个多边形的结束和下一个多边形的开始。非映射工具箱多边形函数(如inpolygon和)并非如此patch

您不能inpolygon直接使用它,因为如果多边形相交但一个顶点都不在另一个顶点内,它将失败。

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

于 2013-05-07T12:18:36.517 回答