1

在此处输入图像描述

上图显示了具有一组已知像素坐标的两条曲线。有没有办法将外部曲线转换为圆形,然后重新映射内部曲线,从而保留两条曲线之间所有点的距离以及两条曲线之间的面积?

我认为我会这样做的一种方法是将两条曲线之间的区域分成更小的四边形部分。四边形的顶部和底部将是具有预定长度的外部和内部曲线。四边形的边在两条曲线之间横向延伸,应该是直的。变换后,外曲线为圆弧,内曲线根据变换前的距离进行调整,以保持距离。为了保留面积,四边形的侧线将调整它们所定向的角度,但仍保持笔直,以保留面积。

问题是我想不出一种方法来对此进行编码或如何将区域分成更小的部分。

如果对如何解决我的问题有任何其他建议,我愿意接受。

4

1 回答 1

1

我认为不可能同时保留区域和距离。如果 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)。在极坐标下工作,会生成一个圆形,其中整个原始形状都适合。计算第二个圆的内部点以保持原始距离。如果需要,然后按新形状和原始形状的面积比对整个事物进行缩放。

示例图:

原来的形状

原来的形状

生成的形状

生成的形状

于 2013-03-19T15:09:26.977 回答