2

私は長い間この問題に悩まされています。多角形の領域(たとえば、六角形)があります。ポリゴン内の任意のポイントで特定の関数の値を計算できます。次に、このデータの塗りつぶされた等高線を作成する必要があります(MATLABのcontourfを使用)。どうすればいいですか。以下のリンク(121ページ)でこのトピックに関するいくつかの議論を見つけました

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
4

3 に答える 3

0

正方形のグリッドを使用して、六角形の領域をサンプリングしています。これは確かに境界の問題につながります。

より良い解決策 (ただし、まだ最適ではありません) は、六角形のグリッドを使用することです。

%# 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)

さらに良いカバレッジが必要な場合は、エリアをより適切にカバーするグリッドを考案するか、サンプル ポイントの数を増やす必要があります。

任意の不規則な領域では、不規則な/ランダムなグリッドを試して、領域の中央よりも境界に近い点が多くなるように分散したい場合があります。

于 2012-08-17T08:43:22.610 に答える
0

六角形で定義された関数があるとします。次に、六角形を含む正方形を取ります。

簡単な最初のテストは、正方形の関数を拡張して、六角形の外側の点の値 = 0 を取ることです。

関数の範囲に応じて、これで良い答えが得られる場合とそうでない場合があります。

これが機能しない場合はmin(min(A)))、nxn 行列 A を使用して六角形の関数の最小値を見つけます。次に、関数をmin(min(A)) - 1.0六角形の外側で正方形に定義します。

次にcontourf(x, y, z, v)、v が出力の値のベクトルであるため、v(1) = min(min(A)) - 1.0を使用v(2:n) = linspace(min(min(A)), max(max(A)), n)し、整数 n を使用します。おそらく、レベル セットの色をmin(min(A)) - 1.0白に指定できますが、私はこれを行ったことがありません。私は以前にこのようなことをしなければなりませんでしたが、六角形の外側で関数 = 0 を設定するだけで十分でした。

于 2012-08-17T11:45:04.137 に答える
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; 

基本的には、正方形の領域に輪郭プロットを作成し、六角形の穴のあるマスクをオーバーレイするため、六角形の輪郭にすぎないように見えます。関数を微調整して、領域外で関数を評価できるようにする方がはるかに簡単だと思います。次に、境界を含むある種のグリッドを (再) 発明します。

于 2012-08-19T07:14:17.090 に答える