我认为不可能同时保留区域和距离。如果 x 和 y 是 x-原始形状的坐标和 y 坐标),或仅距离。以下是一个说明性示例:
编辑:我想了想,在下面的代码中,你有外圆半径的参数,可以在不改变线长的情况下自由改变影响区域。您应该将下面的代码变成一个函数,当然,省略缩放区域的部分,并使用其中一个优化函数来找到获得具有相同线长的最近区域的外圆的半径。
% Area normalisation flag
norm_area = true;
% Start with two circles, perturb them randomly
N = 100;
phi = linspace(0, 2*pi, N)';
% Set radii
r = [2 4];
% Generate data
r_pert = repmat(r, N, 1);
% Filter some random data (so it's smoothish)
filtOrd = 20;
b = ones(1, filtOrd) / filtOrd;
randData = filter(b, 1, randn(size(r_pert)));
randData = bsxfun(@minus, randData, mean(randData));
r_pert = r_pert + randData;
% Initial plot
close all;
polar(phi, r_pert(:, 2));
hold on;
polar(phi, r_pert(:, 1));
% Generate circle that encloses all radii
r_pureCirc = max(r_pert(:));
% Line lengths
lens = abs(r_pert(:, 2) - r_pert(:, 1));
r_pertCirc = r_pureCirc - lens;
% Calculate area of new and old shapes
% Elemental area is a pie slice between phi(n) - dphi/2 and phi + dphi/2
dphi = phi(2) - phi(1);
dA_orig = dphi * (r_pert(:, 2) .^ 2 - r_pert(:, 1) .^ 2) / 2;
dA_new = dphi * (r_pureCirc .^ 2 - r_pertCirc .^ 2) / 2;
A_orig = sum(dA_orig);
A_new = sum(dA_new);
r_new = [r_pertCirc repmat(r_pureCirc, N, 1)];
if norm_area
% Normalise to same area
r_new = sqrt(A_orig / A_new) * r_new;
end
% Plot again
figure;
polar(phi, r_new(:, 2));
hold on;
polar(phi, r_new(:, 1));
在此代码中,生成了一对被一些过滤的随机噪声干扰的圆圈 - 类似于您的原始绘图(ish)。在极坐标下工作,会生成一个圆形,其中整个原始形状都适合。计算第二个圆的内部点以保持原始距离。如果需要,然后按新形状和原始形状的面积比对整个事物进行缩放。
示例图:
原来的形状
生成的形状