Основы числового программного управления. Хитров А.И - 37 стр.

UptoLike

Составители: 

37
x = x_n;
y = y_n;
codx = x;
cody = y;
f = 0; /* Установка начальных значений внутренних
переменных */
/* Вычисление начального угла по значениям x_n, y_n, I, J */
if(x_n == I && y_n > J)
a_n = PI / 2;
if(x_n == I && y_n < J)
a_n = 3 * PI / 2;
if(x_n > I)
a_n = atan((y_n - J) / (x_n - I));
if(x_n < I)
a_n = PI + atan((y_n - J) / (x_n - I));
/* Вычисление конечного угла по значениям x_k, y_k, I, J */
if(x_k == I && y_k > J)
a_k = PI / 2;
if(x_k == I && y_k < J)
a_k = 3 * PI / 2;
if(x_k > I)
a_k = atan((y_k - J) / (x_k - I));
if(x_k < I)
a_k = PI + atan((y_k - J) / (x_k - I));
da = a_n - a_k; /* Вычисление угла поворота */
L = floor(4 * r * fabs(da) / PI + 0.5); /* Вычисление длины
пути по дуге */
l = 0; /* Установка текущей длины пути в 0 */
printf("init: r=%d, a_n=%f, a_k=%f, da=%f, L=%d\n", r, a_n,
a_k, da, L); /* Вывод на экран результатов инициализации */
}
/* Функция расчета очередного шага алгоритма оценочной функции
*/
void circle() {
/* Вычисление разницы между текущими координатами и центром
окружности */
X = x – I;
Y = y - J;
/* Вычисление нового значения оценочной функции и перемещение по
соответствующим осям в зависимости от текущих координат и
текущего значения оценочной функции */
if(abs(X) >= abs(Y) && SGN(f) * SGN(X) * SGN(Y) == SGN(da))
{
y = y - SGN(X) * SGN(da); /* Изменение координаты
y */
f = f - 2 * Y * SGN(X) * SGN(da) + 1; /* Изменение
значения оценочной функции */
     x = x_n;
     y = y_n;
     codx = x;
     cody = y;
     f = 0;    /* Установка начальных значений внутренних
переменных */

/* Вычисление начального угла по значениям x_n, y_n, I, J */
     if(x_n == I && y_n > J)
          a_n = PI / 2;
     if(x_n == I && y_n < J)
          a_n = 3 * PI / 2;
     if(x_n > I)
          a_n = atan((y_n - J) / (x_n - I));
     if(x_n < I)
          a_n = PI + atan((y_n - J) / (x_n - I));

/* Вычисление конечного угла по значениям x_k, y_k, I, J */
     if(x_k == I && y_k > J)
          a_k = PI / 2;
     if(x_k == I && y_k < J)
          a_k = 3 * PI / 2;
     if(x_k > I)
          a_k = atan((y_k - J) / (x_k - I));
     if(x_k < I)
          a_k = PI + atan((y_k - J) / (x_k - I));

     da = a_n - a_k;     /* Вычисление угла поворота */
     L = floor(4 * r * fabs(da) / PI + 0.5); /* Вычисление длины
пути по дуге */
     l = 0; /* Установка текущей длины пути в 0 */
     printf("init: r=%d, a_n=%f, a_k=%f, da=%f, L=%d\n", r, a_n,
a_k, da, L);   /* Вывод на экран результатов инициализации */
}


/* Функция расчета очередного шага алгоритма оценочной функции
*/
void circle() {
/* Вычисление разницы между текущими координатами и центром
окружности */
     X = x – I;
     Y = y - J;

/* Вычисление нового значения оценочной функции и перемещение по
соответствующим осям в зависимости от текущих координат и
текущего значения оценочной функции */
     if(abs(X) >= abs(Y) && SGN(f) * SGN(X) * SGN(Y) == SGN(da))
{
          y = y - SGN(X) * SGN(da);     /* Изменение координаты
y */
          f = f - 2 * Y * SGN(X) * SGN(da) + 1; /* Изменение
значения оценочной функции */

                               37