Я не думаю, что можно сохранить как площадь, так и расстояние. Можно сохранить площадь и пропорциональное расстояние (от центра внешнего круга в исходном чертеже - т. Е. Точка (среднее (x), среднее (y)), если 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));
В этом коде, пара кругов возмущенных некоторой фильтрованной случайный шум генерируется - похожий на ваш оригинальный рисунок (МОГ). Работая в полярных координатах, создается круг, в котором подходит вся оригинальная форма. Внутренние точки второго круга рассчитываются для сохранения расстояний в оригинале. При желании все это затем масштабируется соотношением площадей новой и оригинальной формы.
Пример участков:
Оригинальная форма
Original shape http://i47.tinypic.com/nmyrg5.jpg
Сформирован Форма
Generated shape http://i50.tinypic.com/35ivxn4.jpg
Я думаю, что это будет очень трудно определить, как сохраняется расстояние между точками на две кривые после преобразования кривых. Но, поскольку область сохранена, вы точно знаете, какой радиус круга будет находиться на внешней кривой на изображении справа. Вы могли бы начать с этого. – Justin
Есть ли способ пойти по пикселям на одну из линий и найти векторы между пикселями на одной строке и пикселем на другом? – user2183777
Вы можете попробовать 'bwboundaries', а затем пройти через точки. Но на внешней границе больше точек, чем внутренних, поэтому подход кажется бесполезным. – Justin