如何使用正交或任何其他方法找到由八度音程中的点包围的区域

问题描述 投票:0回答:1

我有两组坐标(正值和负值,不一定按升序排列,在很多情况下,对于相同的x值,y有不同的y值),我可以加载到两个相等大小的行向量中。

我想计算曲线所包围的面积。用八度音程怎么做?

我尝试了这个answer,但它不起作用,因为它似乎打印的区域(204.64)太高(见图)。

我试过这段代码:

function showdata(fName)
    M = dlmread(fName);
    H = M(2:end, 1); % starting row number is 2
    B = M(2:end, 2);
    aux = figure();

    plot(H, B,'linewidth',2);
    xlabel ("Auxilary field H (A/m)"); 
    ylabel ("Magnetic Field B (Tesla)");
    area = polyarea(H,B)

    axis([min(H), max(H), min(B), max(B)]);
    grid on;
    grid minor on;
    title (area,"fontsize",20);

然后我在Octave打电话给showdata('data.txt')。数据点的图片:enter image description here

This是我正在使用的数据文件。

octave area points
1个回答
1
投票

在Octave中有一个计算凸壳的功能叫做“convhull”。它返回形成凸包数据的点的索引。

M = dlmread("data.txt"); #I removed the header in data.txt 
x = M(:,1);
y = M(:,2);
k = convhull(x,y);
plot (x(k), y(k), "r-", x, y, "b+");
n = rows(k);
x_prime = vertcat(x(k(n)), x(k(1:n-1)));
y_prime = vertcat(y(k(n)), y(k(1:n-1)));
A = .5*abs(x_prime'*y(k)-y_prime'*x(k)); #80.248
polyarea(x(k), y(k)) == A and true

enter image description here也许凸包对面积估计不好,因为左上角和右下角距离点有点远。还有其他方法可以从数据中形成多边形 ,其中一个可能是alpha形状。然而,alpha形状更复杂,并且在Octave中没有相应的预建功能。

更新:每个x对应至少一个y坐标。我在同一个x上标出了最高点和最低点并再次估算了该区域。有代码:

[uni, ~] = sort(unique(x));
n = rows(uni);
outline = [];
for i = 1:n
  y_list = y(x==uni(i));
  [y_max, ~] = max(y_list);
  outline(i, :)= [uni(i), y_max];
  [y_min, ~] = min(y_list);
  outline(2*n-i+1,:)= [uni(i), y_min];
endfor
figure;
plot (x(k), y(k), "r-", x, y, "b+", outline(:,1), outline(:,2), "g-", "linewidth", 3);
polyarea(outline(:,1), outline(:,2)) #74.856

enter image description here顺便说一句,如果函数polyarea的参数不形成一个接近的曲线函数,polyarea会返回错误的区域。单位平方上的四点:[(0,0),(1,0),(1,1),(0,1)],[(0,0),(1,1),(1,0 ),(0,1)]

polyarea([0,1,1,0],[0,0,1,1])!==polyarea([0,1,1,0],[0,1,0,1])

© www.soinside.com 2019 - 2024. All rights reserved.