2012-08-17 40 views
2

我現在很長時間以來一直困擾着這個問題。我有一個多邊形區域(可以說,一個六邊形)。我可以計算多邊形內任何點的某個函數的值。現在我需要爲這些數據創建一個填充輪廓(使用MATLAB中的contourf)。我如何去做。我發現下面的鏈接,這個話題進行一些討論(第121頁)不規則域的MATLAB contourf圖

http://www-personal.umich.edu/~jpboyd/eng403_chap4_contourplts.pdf

這工作有點確定,但它仍然會產生,我不想鋸齒狀邊緣。任何人有任何關於這個問題的建議?謝謝。這裏是我的代碼

close all 
Node = [ 1.0 0 
      0.5 0.8660 
     -0.5 0.8660 
     -1.0 0 
     -0.5 -0.8660 
      0.5 -0.8660]; 
[x,y] = meshgrid(-1:0.1:1,-1:0.1:1); 

N = zeros(size(x)); 
for i=1:size(x,2) 
    for j=1:size(y,2) 
     p = [x(i,j) y(i,j)]; 
     IN = inpolygon(p(1),p(2),Node(:,1),Node(:,2)); 
     if IN 
      N(i,j)= rand;    
     else 
      N(i,j)= NaN; 
     end 
    end 
end 

figure 
contourf(x,y,N,'LineStyle','none'), hold on;  
xlabel('X'), ylabel('Y'), axis equal; axis off; colorbar;  
line([Node(:,1);Node(1,1)],[Node(:,2);Node(1,2)],'Color',[1 1 1],'LineWidth',2.0) 
clear IN i j p x y 
+0

我們可以看到您的代碼和您正在使用的一些數據嗎? – AGS 2012-08-17 00:38:23

回答

0

您使用的是方形網格來樣六邊形區域。這確實會導致邊界問題。

更好的解決方案(但仍沒有完全最佳)是使用hexagonal grid

%# define hexagon 
Node = [ 1.0 0 
      0.5 0.8660 
     -0.5 0.8660 
     -1.0 0 
     -0.5 -0.8660 
      0.5 -0.8660]; 

%# Generate hexagonal grid 
Rad3Over2 = sqrt(3)/2; 
[x, y] = meshgrid(0:51); 
n = size(y,1); 
x = Rad3Over2 * x; 
y = y + repmat([0 0.5],[n,n/2]); 

%# re-scale to -1..1 
x = 2*x/max(x(:))-1; 
y = 2*y/max(y(:))-1; 

%# insode-polygon check 
N = zeros(size(x)); 
for i=1:size(x,2) 
    for j=1:size(y,2) 
     p = [x(i,j) y(i,j)]; 
     IN = inpolygon(p(1),p(2),Node(:,1),Node(:,2)); 
     if IN 
      N(i,j)= rand;    
     else 
      N(i,j)= NaN; 
     end 
    end 
end 

%# make contour plot 
figure(1) 
contourf(x,y,N,'LineStyle','none'), hold on;  
xlabel('X'), ylabel('Y'), axis equal; axis off; colorbar;  
line([Node(:,1);Node(1,1)],[Node(:,2);Node(1,2)],'Color',[1 1 1],'LineWidth',2.0) 

如果你想更好的覆蓋範圍,你必須制定一個網格,覆蓋更好的區域和/或增加採樣點的數量。

對於任意的不規則區域,您可能想要嘗試不規則/隨機的網格,這些網格的分佈使得靠近邊界的點數多於該區域中間的點數。

+0

感謝您的努力。我也在朝着同一個方向思考。多邊形的邊界需要以某種方式結合到網格中。靠近邊界是不夠的。等高線圖仍然是鋸齒狀的。我正在尋找其他更直觀的方法來繪製一般形狀的輪廓。 – 2012-08-18 20:22:35

+0

一個有趣的問題,毫無疑問。我會試着再看看它。 – 2012-08-18 21:23:51

0

假設您在六角形上定義了一個函數。然後取一些包含六邊形的正方形。

一個簡單的第一個測試可能是在正方形上擴展您的函數,以獲取六邊形以外的點的值= 0。

根據您的功能範圍,這可能會或可能不會給您一個很好的答案。

如果這不起作用,然後找到使用min(min(A)))爲n×n的矩陣A,然後定義函數的六角形功能的分是min(min(A)) - 1.0外六角,但在廣場上。

然後使用contourf(x, y, z, v)其中v是輸出的值的向量,所以對於某個整數n取v(1) = min(min(A)) - 1.0v(2:n) = linspace(min(min(A)), max(max(A)), n)。你可以指定水平集min(min(A)) - 1.0的顏色爲白色,但我從來沒有這樣做過。我之前必須做這樣的事情,並且在六邊形之外設置函數= 0就足夠了。

+0

我之前嘗試過使用NaN作爲感興趣區域外的點。使用NaN時,讓MATLAB在繪製哪些圖像時會忽略這些點。如果將NaN以外的任何值指定給外部點,則這些點仍會顯示在輪廓圖中,並且還會導致鋸齒狀邊緣。 – 2012-08-18 20:11:01

+0

我做了一些類似於我的建議,它爲我工作...也許你的網格不夠好?當我將細網格上的函數應用於橢圓形區域時,我所描述的工作。另外,如果您指定了其他非NaN值,您是否(1)確保該值小於六邊形上函數的最小值,並且(2)指定要繪製哪些輪廓,如我在最後兩段我的答案?這當然有助於區分六邊形的外部和內部。這也可能是我對我的例子很幸運,而且這個方法不健壯...... – db1234 2012-08-19 09:42:46

0

如果你的功能只能評估裏面的多邊形區域,那麼我的六角形網格答案仍然存在。但是,如果你的函數可以(或修改爲)評估多邊形,你可能想使用一個作弊:

figure(1), clf, hold on 

%# External contour, square. 
x1 = [-3 -3 +3 +3 -3]/2; 
y1 = [-3 +3 +3 -3 -3]/2; 

%# internal contour, some polygon 
x2 = [1.0 0.5 -0.5 -1.0 -0.5 0.5]; 
y2 = [0 0.8660 0.8660 0 -0.8660 -0.8660]; 

%# convert to patches 
[f, v] = poly2fv({x1, x2}, {y1, y2}); 
patch(... 
    'Faces' , f,... 
    'Vertices' , v,... 
    'FaceColor', get(0, 'defaultuicontrolbackgroundcolor'), ... 
    'EdgeColor', 'none'... 
    ); 

%# Generate function for contourplot 
[x, y] = meshgrid(-2.8/2:0.1:2.8/2); 
N = rand(size(x)); 

%# make contour plot 
contourf(x,y,N,'LineStyle','none'), hold on;  
xlabel('X'), ylabel('Y'), axis equal; 
axis off; colorbar; 

基本上,它會創建一個正方形區域的輪廓圖,並覆蓋口罩帶有一個六角孔,所以它看起來像它只是六角形的輪廓。我懷疑調整你的函數以允許區域外的函數評估比較容易,然後是(重新)發明某種包含邊界的網格。