2016-06-18 22 views
2

Я использую набор данных с 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 

Я использовал центростремительных метод, чтобы найти контрольные точки кривой как показано на следующем рисунке enter image description here

Заполните мой код:

% 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 матрицы

enter image description here и вычислить N в B-сплайна мы должны использовать эти рекурсивную функцию enter image description here

Заполните мой код:

% 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 для управления результатом точек после того, как применяется обратное проектирование на этой кривой, так значение до сих пор и настолько малы, по сравнению с исходным значением точек данных enter image description here

Обновлено (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 

конец

+0

У вычисления массива центростремительных узлов не должно быть два вложенных sqrt(). Является ли это простой опечаткой или вы используете два вложенных sqrt() в вычислении? – fang

+0

@fang Я использовал его в зависимости от вышеприведенного уравнения о вычислении центростремителя с использованием евклидова расстояния, я нашел это уравнение в одной статье, поэтому я делаю код зависимым от этого уравнения! Это неправильно или что? –

+0

Я не думал прямо. Формула правильная. – fang

ответ

1

Я думаю, что есть несколько сомнительных вопросов в своем подходе:

  • Прежде всего, если вы пытаетесь создать б-сплайн кривой интерполирующую 103 точек входа (и никакие другие граничные условия налагаются), кривая б-сплайн будет независимо 103 контрольных точек в какой степени й e b-сплайновая кривая.
  • Массив U_K - это параметр, назначенный каждой входной точке. Они не совпадают с последовательностью узлов ti, используемой рекурсивной формулой Cox DeBoor. Если b-сплайновая кривая имеет степень 3, вы должны иметь (103 + 3 + 1) значения узла в последовательности узлов. Вы можете создать значения узла следующим образом:

0) Обозначить параметры как p [i], где i = 0 - (n-1), p [0] = 0.0, а n - число точки.
1) Создание значения сучков в

knot[0] = (p[1]+p[2]+p[3])/D (where D is degree) 
knot[1] = (p[2]+p[3]+p[4])/D 
knot[2] = (p[3]+p[4]+p[5])/D 
...... 

Это внутренние значения узлов. Вы должны заметить, что p [0] и p [n-1] не будут использоваться на этом этапе. У вас будут (n-D-1) внутренние узлы.

2) Теперь добавьте p [0] к фронту значений узла (D + 1) и добавьте p [n-1] в конец значений узла (D + 1), и вы сделано. В конце вы будете иметь (N + D + 1) узлов в общей сложности.

+0

Я не хочу создавать кривую B-Spline, у меня есть кривая из 200 точек, но я хочу применить обратную инженерию, чтобы получить исходные контрольные точки для этой кривой. Степень критической = 3, и я знаю, хочу ли я только 103 контрольных точек У меня должен быть 103 + p + 1 элементов в векторе узлов, но на самом деле я не буду использовать вектор узла, если я хочу применить обратную инженерию на данной кривой, чтобы найти исходные контрольные точки (если я считаю правдой) Я понимаю что вы сказали 100%, пожалуйста, быстро просмотрите эту статью https://drive.google.com/open?id=0B_2BUqaJptbqVmpXOWtJQUdPNE0 –

+0

Прочтите статью. Похоже, вы все еще хотите создать кривую B-сплайна как часть PESA. – fang

+0

Вы верны, но мы должны найти контрольные точки, затем попытаемся снова нарисовать эту кривую с наименьшим количеством контрольных точек. –

 Смежные вопросы

  • Нет связанных вопросов^_^