Переразбить замкнутый контур
От: Аноним  
Дата: 25.01.06 06:30
Оценка:
Имеется замкнутый контур G, представленный системой n точек. Точки делят кривую на неравные по длине дуги части. Нужно найти новую систему точек, которая делит кривую G на равные по длине дуги части.

Воспользовался линейной интерполяцией y1[m]=(y[k+1]-y[k])/(x[k+1]-x[k])*(x[m]-x[k])+y[k].

Но, на картинке наблюдается "заусенец", при многократном переразбиении меняющегося контура G,
то есть что-то не работает в нижеприведенном коде, не могу найти что:
void interp(std::vector<point> & G){
  size_t n = G.size();
  double L = 0;
  std::vector<double> Delta_L(n+1);
  std::vector<point> G1(n);
  // Вспомагательный массив Delta_L
  Delta_L[0] = 0;
  for( size_t m=1; m<n; ++m){
       L += sqrt( pow(G[m].x-G[m-1].x,2.0) + pow(G[m].y-G[m-1].y,2.0) );
       Delta_L[m] = L;
  }
  L += sqrt( pow(G[0].x-G[n-1].x,2.0) + pow(G[0].y-G[n-1].y,2.0) );
  Delta_L[n] = L;
  // Равномерный шаг
  double dl = L / n;
  // Первые точки совпадают
  G1[0].x = G[0].x;
  G1[0].y = G[0].y;
  // Вычисляем оставшиеся точки 1,2...n-1
  for( size_t m=1; m<n; ++m ){
       for( size_t k=0; k<n; ++k ){
             //ищю между какими x[k]..x[k+1] должен быть x[m]
            if( Delta_L[k]<m*dl && m*dl<=Delta_L[k+1] ){
                double temp = ( m*dl-Delta_L[k] ) /
                          sqrt(1+pow((G[k+1].y-G[k].y)/(G[k+1].x-G[k].x),2));
                if( G[k].x == G[k+1].x )
                    G1[m].x = G[k].x;
                else if( G[k].x < G[k+1].x )
                    G1[m].x = temp + G[k].x;
                else
                    G1[m].x = - temp + G[k].x;
                G1[m].y = ( G[k+1].y-G[k].y ) / ( G[k+1].x-G[k].x ) *
                      ( G1[m].x-G[k].x ) + G[k].y;
            }
       }
  }
  G.swap(G1);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.