У Адриена определенно правильная идея : определите параметрическую координату, а затем выполните линейную интерполяцию по координатам x и y отдельно.
Я хотел бы добавить еще один способ определить параметрическую координату, чтобы вы могли создавать равномерно расположенные точки интерполяции вокруг всей фигуры за один проход. Первое, что вы хотите сделать, если вы еще этого не сделали, это убедиться, что последняя координатная точка повторно соединяется с первой, реплицируя первую точку и добавляя ее в конец:
B = [B; B(1,:)];
Затем, вычислив общее расстояние между последующими точками, а затем взяв кумулятивную сумму, вы можете получить параметрическую координату, которая делает маленькие шаги для точек, расположенных близко друг к другу, и большие шаги для точек, расположенных далеко друг от друга:
distance = sqrt(sum(diff(B,1,1).^2,2)); %# Distance between subsequent points
s = [0; cumsum(distance)]; %# Parametric coordinate
Теперь вы можете интерполировать новый набор точек, равномерно распределенных по краю вдоль прямых, соединяющих ваши точки, с помощью функции INTERP1Q :
sNew = linspace(0,s(end),100).'; %'# 100 evenly spaced points from 0 to s(end)
xNew = interp1q(s,B(:,1),sNew); %# Interpolate new x values
yNew = interp1q(s,B(:,2),sNew); %# Interpolate new y values
Эти новые наборы точек не обязательно будут включать исходные точки, поэтому, если вы хотите убедиться, что исходные точки также появляются в новом наборе, вы можете сделать следующее:
[sAll,sortIndex] = sort([s; sNew]); %# Sort all the parametric coordinates
xAll = [B(:,1); xNew]; %# Collect the x coordinates
xAll = xAll(sortIndex); %# Sort the x coordinates
yAll = [B(:,2); yNew]; %# Collect the y coordinate
yAll = yAll(sortIndex); %# Sort the y coordinates
Пример:
Вот пример, показывающий, как работает вышеуказанный код (я использую 11 пар координат x и y, одна из которых повторяется для полного примера):
B = [0.1371 0.1301; ... %# Sample data
0.0541 0.5687; ...
0.0541 0.5687; ... %# Repeated point
0.0588 0.5863; ...
0.3652 0.8670; ...
0.3906 0.8640; ...
0.4090 0.8640; ...
0.8283 0.7939; ...
0.7661 0.3874; ...
0.4804 0.1418; ...
0.4551 0.1418];
%# Run the above code...
plot(B(:,1),B(:,2),'b-*'); %# Plot the original points
hold on; %# Add to the plot
plot(xNew,yNew,'ro'); %# Plot xNew and yNew
![alt text](https://i.stack.imgur.com/iJMZs.png)