面積と距離の両方を維持することは不可能だと思います。x と y が x-元の形状の座標と y 座標)、または距離のみ。以下に例を示します。
編集:もう少し考えてみました。以下のコードには、外側の円の半径のパラメーターがあり、線の長さを変更せずに領域に影響を与えるように自由に変更できます。もちろん、領域を拡大縮小する部分を省略して、以下のコードを関数に変換し、最適化関数の 1 つを使用して、同じ線の長さで最も近い領域を取得する外側の円の半径を見つける必要があります。
% 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) と同様です。極座標で作業すると、元の形状全体が収まる円が生成されます。元の円の距離を維持するために、2 番目の円の内側の点が計算されます。必要に応じて、新しい形状と元の形状の面積の比率で全体をスケーリングします。
プロットの例:
元の形状

生成された形状
