我試圖計算兩條圓形曲線(黃色表面in this picture作爲簡化)之間的表面,但由於我沒有在兩條曲線的相同角度值處具有數據點,所以我有點卡住了。有任何想法嗎?圓形曲線之間的區域
感謝您的幫助!
圖片:
我試圖計算兩條圓形曲線(黃色表面in this picture作爲簡化)之間的表面,但由於我沒有在兩條曲線的相同角度值處具有數據點,所以我有點卡住了。有任何想法嗎?圓形曲線之間的區域
感謝您的幫助!
圖片:
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
,這是結果:
area = 1.989710000000001e+03
我意識到numel()在這裏實際上是錯誤的,而改爲nnz()。 –
因爲它是合乎邏輯的,你也可以只做'sum' –
是的,但是nnz更快... a = [0,0,1; 0,1,1; 1,1,0]; tic; sum(a(:)); toc 已用時間爲0.001195秒。 tic; nnz(a); toc 已用時間爲0.000149秒。 –
我假設你有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)]);
是的,沒有。這是以像素爲單位計算的,而不是實際的區域(即無論軸在說什麼)。總而言之,在'x1 = ...'前加'x = x/3; y = y/6'並修改'Area'計算 –
謝謝@Ander!沒有注意到。我已經改變了我的答案,使用'inpolygon'而不是'poly2mask'來處理那個 – user2999345
你是如何選擇黃色表面的? –
我用GIMP給它着色,因爲我不知道如何在matlab中做... XD –
10你需要的準確度是多少? –