2013-05-07 110 views
2

我想問一些關於解決這個問題的最佳方法的建議:重疊兩個網格

我畫了兩個網格;一個正方形,一個六角形。

我正在覆蓋廣場上的六角網格。

Image

什麼是最好平均每個六邊形底層所以每個六邊形的值是下方的方塊的平均平方?

你認爲最有效的方法是什麼?有沒有我找不到的內置命令?

+0

你有映射工具箱嗎?如果是這樣,你見過['polyxpoly'](http://www.mathworks.co.uk/help/map/ref/polyxpoly.html)函數嗎? – wakjah 2013-05-07 11:09:58

+0

當然可以,你認爲我應該找到所有的交點,並將網格作爲新形狀進行網格劃分嗎?或polybool? – Lorna123 2013-05-07 11:13:00

+0

這取決於...如果你想實際找到相交區域,那麼可能是'polybool',但如果你只是想知道它與哪個方塊相交,那麼你可能不需要額外的複雜性。 – wakjah 2013-05-07 11:15:15

回答

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 s表示必須傳遞給polyxpoly爲每個多邊形來表示一個多邊形的結束和下一個的開始。非映射工具箱多邊形函數inpolygonpatch的情況並非如此。

您不能直接使用inpolygon,因爲如果多邊形相交但其中一個的頂點都不在另一個頂點內,則會失敗。

不幸的是,這種方法一次只能用於一個六邊形......在某處可能存在更高效的解決方案,但這種方法相當複雜,沒有嘗試「引導」它,所以我建議你從這裏開始並僅在你遇到性能問題。