重叠两个网格
问题描述:
我想问一些关于解决这个问题的最佳方法的建议:重叠两个网格
我画了两个网格;一个正方形,一个六角形。
我正在覆盖广场上的六角网格。
什么是最好平均每个六边形底层所以每个六边形的值是下方的方块的平均平方?
你认为最有效的方法是什么?有没有我找不到的内置命令?
答
下面是一个使用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
s表示必须传递给polyxpoly
为每个多边形来表示一个多边形的结束和下一个的开始。非映射工具箱多边形函数inpolygon
和patch
的情况并非如此。
您不能直接使用inpolygon
,因为如果多边形相交但其中一个的顶点都不在另一个顶点内,则会失败。
不幸的是,这种方法一次只能用于一个六边形......在某处可能存在更高效的解决方案,但这种方法相当复杂,没有尝试“引导”它,所以我建议你从这里开始并仅在你遇到性能问题。
你有映射工具箱吗?如果是这样,你见过['polyxpoly'](http://www.mathworks.co.uk/help/map/ref/polyxpoly.html)函数吗? – wakjah 2013-05-07 11:09:58
当然可以,你认为我应该找到所有的交点,并将网格作为新形状进行网格划分吗?或polybool? – Lorna123 2013-05-07 11:13:00
这取决于...如果你想实际找到相交区域,那么可能是'polybool',但如果你只是想知道它与哪个方块相交,那么你可能不需要额外的复杂性。 – wakjah 2013-05-07 11:15:15