Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 35:

Рекурсия и рекурсивные алгоритмы

< Лекция 34 || Лекция 35: 1234 || Лекция 36 >

Пример 2. Задача о нахождении центра тяжести выпуклого многоугольника.

Выпуклый многоугольник задан на плоскости координатами своих вершин. Найдите его центр тяжести.

Разработаем рекурсивную триаду.

Параметризация: x, y – вещественные массивы, в которых хранятся координаты вершин многоугольника; n – это число вершин многоугольника, по условию задачи, n>1 так как минимальное число вершин имеет двуугольник (отрезок).

База рекурсии: для n=2 в качестве многоугольника рассматривается отрезок, центром тяжести которого является его середина (рис. 34А). При этом середина делит отрезок в отношении 1 : 1. Если координаты концов отрезка заданы как (x0,y0) и (x1,y1), то координаты середины вычисляются по формуле:

cx=\frac{x_0+x_1}{2},\quad cy=\frac{y_0+y_1}{2}.

Декомпозиция: если n>2, то рассмотрим последовательное нахождение центров тяжести треугольника, четырехугольника и т.д.

Для n=3 центром тяжести треугольника является точка пересечения его медиан, которая делит каждую медиану в отношении 2 : 1, считая от вершины. Но основание медианы – это середина отрезка, являющегося стороной треугольника. Таким образом, для нахождения центра тяжести треугольника необходимо: найти центр тяжести стороны треугольника (отрезка), затем разделить в отношении 2 : 1, считая от вершины, отрезок, образованный основанием медианы и третьей вершиной (рис. 34B).

Для n=4 центром тяжести четырехугольника является точка, делящая в отношении 3 : 1, считая от вершины, отрезок: он образован центром тяжести треугольника, построенного на трех вершинах, и четвертой вершиной (рис. 34C).

Примеры построения центров тяжести многоугольников

Рис. 34.4. Примеры построения центров тяжести многоугольников

Таким образом, для нахождения центра тяжести n -угольника необходимо разделить в отношении (n-1): 1, считая от вершины, отрезок: он образован центром тяжести (n-1) -угольника и n -ой вершиной рассматриваемого многоугольника. Если концы отрезка заданы координатами вершины (xn,yn) и центра тяжести (n-1) -угольника (cxn-1,cyn-1), то при делении отрезка в данном отношении получаем координаты:

cx_n=\frac{x_n+(n-1)cx_{n-1}}{n},\quad cy_n=\frac{y_n+(n-1)cy_{n-1}}{n}
#include "stdafx.h"
#include <iostream>
using namespace std;
#define max 20
void centr(int n,float *x, float *y, float *c);

int _tmain(int argc, _TCHAR* argv[]){
  int m, i=0;
  FILE *f;
  if ( ( f = fopen("in.txt", "r") ) == NULL )
    perror("in.txt");
  else {
    fscanf(f, "%d",&m);
    printf("\n%d",m);
    if ( m < 2 || m > max ) //вырожденный многоугольник
      printf ("Вырожденный многоугольник");
    else {
     float *px,*py,*pc;
      px = new float[m];
      py = new float[m]; 
      pc = new float[2]; 
      pc[0] = pc[1] = 0;
      while(i<m) {
        fscanf(f, "%f %f",&px[i], &py[i]); 
        printf("\n%f %f",px[i], py[i]); 
        i++;
      } 
      centr(m,px,py,pc);
      printf ("\nЦентр тяжести имеет координаты: 
              (%.4f, %.4f)",pc[0],pc[1]);
      delete [] pc;
      delete [] py;
      delete [] px;
    }
    fclose(f); 
  }
  system("pause");
  return 0;
}

void centr(int n,float *x, float *y, float *c){        
//n - количество вершин, 
//x,y - координаты вершин,
//c - координаты центра тяжести
  if(n==2){ //база рекурсии
           c[0]=(x[0]+x[1])/2; 
           c[1]=(y[0]+y[1])/2;
          }         
  if(n>2) { //декомпозиция
           centr(n-1,x,y,c);
           c[0]= (x[n-1] + (n-1)*c[0])/n;
           c[1]= (y[n-1] + (n-1)*c[1])/n;
         }
}

Характеристиками рассматриваемого метода оценки алгоритма будут следующие величины.

D = 4 D = n
R(D)=3 R(D)=n-1
RV(D)=1 RV(D)=n-3
RL(D)=1 RL(D)=1
HR(D)=3 HR(D)=n-1

Однако в данном случае для более достоверной оценки необходимо учитывать емкостные характеристики алгоритма.

< Лекция 34 || Лекция 35: 1234 || Лекция 36 >
Денис Курбатов
Денис Курбатов
Выполнение каких функций не изменяет позицию указателя в файле?
Владислав Нагорный
Владислав Нагорный
Высшее образование
Сергей Злобин
Сергей Злобин
Россия, Подольск
Олег Корсак
Олег Корсак
Латвия, Рига