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

假设您在六边形上定义了一个函数。然后取一些包含六边形的正方形。

一个简单的第一个测试可能是在正方形上扩展您的函数,以将值 = 0 用于六边形之外的点。

根据您的功能范围,这可能会或可能不会给您一个很好的答案。

如果这不起作用,则使用min(min(A)))nxn 矩阵 A 在六边形上找到函数的最小值。然后将函数定义为min(min(A)) - 1.0在六边形之外但在正方形中。

然后使用contourf(x, y, z, v)where v 是输出值的向量,所以 takev(1) = min(min(A)) - 1.0v(2:n) = linspace(min(min(A)), max(max(A)), n)对于某个整数 n。您可能可以将关卡的颜色指定min(min(A)) - 1.0为白色,但我从未这样做过。我以前必须做这样的事情,并且在六边形之外设置 function = 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 回答
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 回答