Я использую набор данных с 200 точками данных, которые используются для рисования кривой B-Spline, и я хочу извлечь из нее 100 исходных контрольных точек использовать его в одном алгоритме для решения одной проблемы. Результат контрольных точек слишком мал по сравнению со значением точек данных кривой B-сплайна, поэтому я не знаю, что я делаю что-то неправильно в следующем коде или нет. Мне нужна помощь, чтобы знать, что, поскольку я должен использовать эти элементы управления точки, чтобы завершить свое исследование в одном алгоритмеНайти контрольные точки из кривой B-Spline через набор точек данных в matlab
связь множества точек данных: https://drive.google.com/open?id=0B_2BUqaJptbqUkRWLWdmbmpQakk
Код:
% read data set
dataset = importdata("path of data set here");
x = dataset(:,1);
y = dataset(:,2);
for i=1:200
controlpoints(i,1) = x(i);
controlpoints(i,2) = y(i);
controlpoints(i,3) = 0;
end
% Create Q with some points from originla matrix controlpoints (I take only 103 points)
counter =1;
for i=1:200
if (i==11) || (i==20) || (i==198)
Q(counter,:) = F(i,:);
counter = counter +1;
end
if ne(mod(i,2),0)
Q(counter,:) = F(i,:);
counter = counter+1;
end
end
Я использовал центростремительных метод, чтобы найти контрольные точки кривой как показано на следующем рисунке
Заполните мой код:
% 2- Create Centripetal Nodes array from Q
CP(1) = 0;
CP(103) =1;
for i=2:102
sum = 0;
for j=2:102
sum = sum + sqrt(sqrt((Q(j,1)-Q(j-1,1))^2+(Q(j,2)-Q(j-1,2))^2));
end
CP(i) = CP(i-1) + (sqrt(sqrt((Q(i,1)-Q(i-1,1))^2+(Q(i,2)-Q(i-1,2))^2))/sum);
end
p=3; % degree
% 3- Create U_K array from CP array
for i=1:103
U_K(i) = CP(i);
end
Для расчета контрольных точек мы должны следовать этому уравнению P = Qx (R ') -> R' является инверсией R матрицы таким образом, мы должны найти R матрица, то плавники P (матрица контрольных точек) указанным выше уравнением. Следующий сценарий используется для поиска R матрицы
и вычислить N в B-сплайна мы должны использовать эти рекурсивную функцию
Заполните мой код:
% 5- Calculate R_i_p matrix
for a=1:100
for b=1:100
R_i_p(a,b) = NCalculate(b,p,U_K(a),U_K);
end
end
% 6- Find inverse of R_i_p matrix
R_i_p_invers = inv(R_i_p);
% 7- Find Control points (100 points because we have curve with 3 degree )
for i=1:100
for k=1:100
PX(i) = R_inv(i,k) * Q(k,1);
PY(i) = R_inv(i,k) * Q(k,2);
end
end
PX2 = transpose(PX);
PY2 = transpose(PY);
P = horzcat(PX2,PY2); % The final control points you can see the values is very small compared with the original data points vlaues
Мой рекурсивной функции к найти предыдущую матрицу R:
function z = NCalculate(j,k,u,U)
if (k == 1)
if ((u > U(j)) && (u <= U(j+1)))
z = 1;
else
z = 0;
end
else
z = (u-U(j)/U(j+k-1)-U(j)* NCalculate(j,k-1,u,U)) + (U(j+k)-u/U(j+k)-U(j+1) * NCalculate(j+1,k-1,u,U));
end
end
Действительно, мне нужно t О эта помощь так много, я пытался в этой задаче от одной недели :(
Обновлено: фиг.1 для основного В-сплайн кривой, рис 2 для управления результатом точек после того, как применяется обратное проектирование на этой кривой, так значение до сих пор и настолько малы, по сравнению с исходным значением точек данных
Обновлено (2): Я сделал некоторые обновления на моем коде, но теперь проблема в обратной R матрицы дает мне бесконечное во всех случаях
% 2- Create Centripetal Nodes array from Q
CP(1) = 0;
CP(100) =1;
sum = 0;
for i=2:100
sum = sum + sqrt(sqrt((Q(i,1)-Q(i-1,1))^2+(Q(i,2)-Q(i-1,2))^2));
end
for i=2:99
CP(i) = CP(i-1) + (sqrt(sqrt((Q(i,1)-Q(i-1,1))^2+(Q(i,2)-Q(i-1,2))^2))/sum);
end
% 3- Create U_K array from CP array
for i=1:100
U_K(i) = CP(i);
end
p=3;
% create Knot vector
% The first elements
for i=1:p+1
U(i) = 0;
end
% The last elements
for i=100:99+p+1
U(i) = 1;
end
% The remain elements
for j=2:96
sum = 0;
for i=j:(j+p-1)
sum = sum + U_K(i);
end
U(j+p) = (1/p)* sum;
end
% 5- Calculate R_i_p matrix
for a=1:100
for b=1:100
R_i_p(a,b) = NCalculate(b,p,U_K(a),U);
end
end
R_i_p_invers = inv(R_i_p);
% 7- Find Control points (100 points)
for i=1:100
for k=1:100
if isinf(R_inv(i,k))
R_inv(i,k) = 0;
end
PX(i) = R_inv(i,k) * Q(k,1);
PY(i) = R_inv(i,k) * Q(k,2);
end
end
PX2 = transpose(PX);
PY2 = transpose(PY);
P = horzcat(PX2,PY2);
Примечание: Я обновил свой NCalculate рекурсивную функцию, чтобы дать мне 0, если результат равен NaN (не число)
function z = NCalculate(j,k,u,U)
if (k == 1)
if ((u >= U(j)) && (u < U(j+1)))
z = 1;
else
z = 0;
end
else
z = (u-U(j)/U(j+k-1)-U(j)* NCalculate(j,k-1,u,U)) + (U(j+k)-u/U(j+k)-U(j+1) * NCalculate(j+1,k-1,u,U));
end
if isnan(z)
z =0;
end
конец
У вычисления массива центростремительных узлов не должно быть два вложенных sqrt(). Является ли это простой опечаткой или вы используете два вложенных sqrt() в вычислении? – fang
@fang Я использовал его в зависимости от вышеприведенного уравнения о вычислении центростремителя с использованием евклидова расстояния, я нашел это уравнение в одной статье, поэтому я делаю код зависимым от этого уравнения! Это неправильно или что? –
Я не думал прямо. Формула правильная. – fang