2017-05-09 102 views
1

我试图计算两条圆形曲线(黄色表面in this picture作为简化)之间的表面,但由于我没有在两条曲线的相同角度值处具有数据点,所以我有点卡住了。有任何想法吗?圆形曲线之间的区域

感谢您的帮助!

图片: https://i.stack.imgur.com/w1tI7.jpg

+0

你是如何选择黄色表面的? –

+1

我用GIMP给它着色,因为我不知道如何在matlab中做... XD –

+0

10你需要的准确度是多少? –

回答

1
function area = area_between_curves(initial,corrected) 

    interval = 0.1; 
    x = -80:interval:80; 
    y = -80:interval:80; 
    [X,Y] = meshgrid(x,y); 

    in_initial = inpolygon(X,Y,initial(:,1),initial(:,2)); 
    in_corrected = inpolygon(X,Y,corrected(:,1),corrected(:,2)); 
    in_area = xor(in_initial,in_corrected); 

    area = interval^2*nnz(in_area); 

    % visualization 
    figure 
    hold on 
    plot(X(in_area),Y(in_area),'r.') 
    plot(X(~in_area),Y(~in_area),'b.') 

end 

,这是结果:

figure

area = 1.989710000000001e+03 
+1

我意识到numel()在这里实际上是错误的,而改为nnz()。 –

+1

因为它是合乎逻辑的,你也可以只做'sum' –

+1

是的,但是nnz更快... a = [0,0,1; 0,1,1; 1,1,0]; tic; sum(a(:)); toc 已用时间为0.001195秒。 tic; nnz(a); toc 已用时间为0.000149秒。 –

2

我假设你有X,您使用的情节y坐标。我在这里使用imfreehand获得它们。我以前inpolygon生成每个曲线的二元掩模,然后将它们应用xor以获得所需的区域的面具:如果我使用的问题的线条

% x,y were obtained using imfreehand on 100x100 image and getPosition() 
x = [21;22;22;22;22;22;22;23;23;23;23;23;23;24;25;25;26;26;27;28;29;30;30;31;32;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;79;80;80;81;81;81;82;82;82;82;83;83;83;84;84;85;85;86;86;86;86;86;86;85;84;84;83;82;81;80;79;78;77;76;75;74;73;72;71;70;69;68;67;66;65;64;63;62;61;60;59;58;57;56;55;54;53;52;51;50;49;48;47;46;45;44;43;42;41;40;39;38;37;36;35;34;33;32;31;30;29;28;27;26;25;25;24;24;23;22;21;21;21;21;21;21;21;21;21;21;21;21;21]; 
y = [44;43;42;41;40;39;38;37;36;35;34;33;32;31;30;29;28;27;26;25;24;23;22;21;20;19;18;18;17;17;17;17;17;16;16;16;16;16;16;15;15;14;14;14;14;14;14;15;15;15;16;16;17;17;17;17;18;18;18;19;20;20;21;22;23;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;56;57;57;58;59;59;60;61;61;61;61;61;60;60;60;59;58;57;56;56;55;55;54;54;54;54;54;54;54;54;54;55;55;55;55;56;57;58;59;60;61;61;62;63;63;64;64;65;65;66;66;66;66;66;66;65;64;63;62;61;60;59;58;57;56;55;54;53;52;51;50;49;48;47;46;45;44]; 
% generate arbitrary xy 
x1 = (x - 50)./10; y1 = (y - 50)./10; 
x2 = (x - 50)./10; y2 = (y - 40)./10; 
% generate binary masks using poly2mask 
pixelSize = 0.01; % resolution 
xx = min([x1(:);x2(:)]):pixelSize:max([x1(:);x2(:)]); 
yy = min([y1(:);y2(:)]):pixelSize:max([y1(:);y2(:)]); 
[xg,yg] = meshgrid(xx,yy); 
mask1 = inpolygon(xg,yg,x1,y1); 
mask2 = inpolygon(xg,yg,x2,y2); 
% add both masks (now their common area pixels equal 2) 
combinedMask = mask1 + mask2; 
% XOR on both of them 
xorMask = xor(mask1,mask2); 
% compute mask area in units (rather than pixels) 
Area = bwarea(xorMask)*pixelSize^2; 
% plot 
subplot(131); 
plot(x1,y1,x2,y2,'LineWidth',2); 
title('Curves'); 
axis square 
set(gca,'YDir','reverse'); 
subplot(132); 
imshow(combinedMask,[]); 
title('Combined Mask'); 
subplot(133); 
imshow(xorMask,[]); 
title(['XNOR Mask, Area = ' num2str(Area)]); 

enter image description here

+0

是的,没有。这是以像素为单位计算的,而不是实际的区域(即无论轴在说什么)。总而言之,在'x1 = ...'前加'x = x/3; y = y/6'并修改'Area'计算 –

+1

谢谢@Ander!没有注意到。我已经改变了我的答案,使用'inpolygon'而不是'poly2mask'来处理那个 – user2999345