Разработка алгоритма линейно-круговой интерполяции методом оценочной функции

 

Сущность метода оценочной функции

 

При линейно-круговой интерполяции с разделенными шагами по координатам в плоскости XY (рисунок 1) окружность, на которой расположен интерполируемый отрезок дуги, разделяет плоскость на две области: F>0, лежащую вне окружности (на самой окружности F=0), и область F<0 внутри окружности. Интерполируемый отрезок дуги имеет координаты начальной точки x, y, конечной точки xК, yК (начало относительных координат находится в центре окружности ).

При интерполяции дуги окружности, расположенной в первом квадранте в направлении против часовой стрелки, при шаге величиной d по оси X в направлении «минус» (из точки с координатами xI, yJ в точку с координатами xI+1, yJ) координата x промежуточной точки траектории интерполяции уменьшается на величину d: xI+1 = xI – d

Величина оценочной функции определяется выражением:

При шаге по оси Y из точки с координатами из точки с координатами xI, yJ в точку с координатами xI, yJ+1 координата y промежуточной точки траектории интерполяции уменьшается на величину d: yJ+1 = yJ – d. Величина оценочной функции определяется выражением:

       
 
   
X
 

 

 


Рисунок 1 – Линейно-круговая интерполяция методом оценочной функции с разделенными шагами по координатам.

Алгоритм линейно-круговой интерполяции методом оценочной функции разработан на языке программирования «С++». Блок-схема работы основной программы изображена на рисунке 2, а блок-схема работы функции на построение на рисунке 3.

 
 

 

 


Рисунок 2 – Блок-схема основной программы

 
 

 


Рисунок 3 – Блок-схема функции построения

 

Программа линейно-круговой интерполяции

 

Программа осуществляет построение кривой при помощи метода линейно-круговой интерполяции. Причем направление дуги определяется последовательностью введения значений начального и конечного углов. Если а2 > а1, то направление против часовой стрелки. Если а2 < а1, то направление по часовой стрелке.

Так как программа написана в приложении под DOS, то затруднений в работе под более современными операционными системами (Windows95, Windows98, Windows2000, Windows NT) не будет. В программе осуществлен графический вывод результата, при дальнейшей доработки вывод можно осуществлять на согласующий с другим устройством контроллер.

Листинг программы представлен ниже. Исполнительный файл прилагается к пояснительной записке.

 

Листинг программы

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <iostream.h>

 

int midx, midy, rad, naprav, flag, a1, a2, x, y, xk, yk, d, raz, F;

 

void osnova(int x,int y,int xk,int yk,int a1,int a2,int d,int rad,int raz,int flag,int F,int midx,int midy,int naprav)

{while (flag)

{

if (naprav==1) {if ((a2>=0&&a2<90)&&(x<=xk&&y<=yk)) {flag=0;}}

else {if ((a2>=0&&a2<90)&&(x>=xk&&y>=yk)) {flag=0;}};

if (naprav==1) {if ((a2>=90&&a2<=180)&&(x<=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=90&&a2<180)&&(x>=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>180&&a2<=270)&&(x>=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=180&&a2<270)&&(x<=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>270&&a2<=360)&&(x>=xk&&y<=yk)) {flag=0;}}

else {if ((a2>270&&a2<=360)&&(x<=xk&&y>=yk)) {flag=0;}};

if (!flag) {return;}

if ((x<=240&&x>=0)&&(y>=(-240)&&y<=0))

{if (a1<a2) {if (F<=0) {F=F-2*y*d+d*d;

/*первая четверть*/ line (midx+x,midy+y,midx+x,midy+y-d);

y=y-d;}

else {F=F-2*x*d+d*d;

line (midx+x,midy+y,midx+x-d,midy+y);

x=x-d;}}

else {if (F<=0) {F=F+2*x*d+d*d;

line (midx+x,midy+y,midx+x+d,midy+y);

x=x+d;}

else {F=F+2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y+d);

y=y+d;}}};

if (naprav==1) {if ((a2>=0&&a2<90)&&(x<=xk&&y<=yk)) {flag=0;}}

else {if ((a2>=0&&a2<90)&&(x>=xk&&y>=yk)) {flag=0;}};

if (naprav==1) {if ((a2>=90&&a2<=180)&&(x<=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=90&&a2<180)&&(x>=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>180&&a2<=270)&&(x>=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=180&&a2<270)&&(x<=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>270&&a2<=360)&&(x>=xk&&y<=yk)) {flag=0;}}

else {if ((a2>270&&a2<=360)&&(x<=xk&&y>=yk)) {flag=0;}};

if (!flag) {return;}

if ((x<240&&x>=0) && (y<=240&&y>0))

{if (a1<a2) {if (F<=0) {F=F+2*x*d+d*d;

/*четвертая четверть*/ line (midx+x,midy+y,midx+x+d,midy+y);

x=x+d;}

else {F=F-2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y-d);

y=y-d;}}

else {if (F<=0) {F=F+2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y+d);

y=y+d;}

else {F=F-2*x*d+d*d;

line (midx+x,midy+y,midx+x-d,midy+y);

x=x-d;}}};

if (naprav==1) {if ((a2>=0&&a2<90)&&(x<=xk&&y<=yk)) {flag=0;}}

else {if ((a2>=0&&a2<90)&&(x>=xk&&y>=yk)) {flag=0;}};

if (naprav==1) {if ((a2>=90&&a2<=180)&&(x<=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=90&&a2<180)&&(x>=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>180&&a2<=270)&&(x>=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=180&&a2<270)&&(x<=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>270&&a2<=360)&&(x>=xk&&y<=yk)) {flag=0;}}

else {if ((a2>270&&a2<=360)&&(x<=xk&&y>=yk)) {flag=0;}};

if (!flag) {return;}

if ((x>=-240&&x<0) && (y>=(-240)&&y<0))

{if (a1<a2) {if (F<=0) {F=F-2*x*d+d*d;

/*вторая четверть*/ line (midx+x,midy+y,midx+x-d,midy+y);

x=x-d;}

else {F=F+2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y+d);

y=y+d;}}

else {if (F<=0) {F=F-2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y-d);

y=y-d;}

else {F=F+2*x*d+d*d;

line (midx+x,midy+y,midx+x+d,midy+y);

x=x+d;}}};

if (naprav==1) {if ((a2>=0&&a2<90)&&(x<=xk&&y<=yk)) {flag=0;}}

else {if ((a2>=0&&a2<90)&&(x>=xk&&y>=yk)) {flag=0;}};

if (naprav==1) {if ((a2>=90&&a2<=180)&&(x<=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=90&&a2<180)&&(x>=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>180&&a2<=270)&&(x>=xk&&y>=yk)) {flag=0;}}

else {if ((a2>=180&&a2<270)&&(x<=xk&&y<=yk)) {flag=0;}};

if (naprav==1) {if ((a2>270&&a2<=360)&&(x>=xk&&y<=yk)) {flag=0;}}

else {if ((a2>270&&a2<=360)&&(x<=xk&&y>=yk)) {flag=0;}};

if (!flag) {return;}

if ((x>=-240&&x<0) && (y<240&&y>=0))

{if (a1<a2) {if (F<=0) {F=F+2*y*d+d*d;

/*третья четверть*/ line (midx+x,midy+y,midx+x,midy+y+d);

y=y+d;}

else {F=F+2*x*d+d*d;

line (midx+x,midy+y,midx+x+d,midy+y);

x=x+d;}}

else {if (F<=0) {F=F-2*x*d+d*d;

line (midx+x,midy+y,midx+x-d,midy+y);

x=x-d;}

else {F=F-2*y*d+d*d;

line (midx+x,midy+y,midx+x,midy+y-d);

y=y-d;}}};

};

};

void main()

{void osnova(int,int,int,int,int,int,int,int,int,int,int,int,int,int);

clrscr();

/* авто определение граф.режима */

int gdriver = DETECT, gmode;

cout<<"Введите начальный угол (от 0 до 360) а1=";

cin>>a1;

cout<<"Введите конечный угол (от 0 до 360) а2=";

cin>>a2;

cout<<"Введите радиус дуги (до 240) R=";

cin>>rad;

cout<<"Введите величину дискреты d=";

cin>>d;

flag=1;

/* инициализация графического режима */

initgraph(&gdriver, &gmode, "");

midx = getmaxx()/2;

midy = getmaxy()/2;

line (0, midy, getmaxx(), midy);

line (midx, 0, midx, getmaxy());

raz=abs(a2-a1);

if (a2>a1) {naprav=1;arc(midx, midy, a1, a2, rad);}

else {naprav=-1;arc(midx, midy, a2, a1, rad);}

if (raz>180) {a2=a1+naprav*180;

xk=rad*cos(a2*3.14/180);

yk=-rad*sin(a2*3.14/180);

x=rad*cos(a1*3.14/180);

y=-rad*sin(a1*3.14/180);

osnova(x,y,xk,yk,a1,a2,d,rad,raz,flag,F,midx,midy,naprav);

a1=a2;

а2=а2+naprav*raz-naprav*180;

xk=rad*cos(a2*3.14/180);

yk=-rad*sin(a2*3.14/180);

x=rad*cos(a1*3.14/180);

y=-rad*sin(a1*3.14/180);

flag=1;

osnova(x,y,xk,yk,a1,a2,d,rad,raz,flag,F,midx,midy,naprav);

}

else {xk=rad*cos(a2*3.14/180);

yk=-rad*sin(a2*3.14/180);

x=rad*cos(a1*3.14/180);

y=-rad*sin(a1*3.14/180);

flag=1;

osnova(x,y,xk,yk,a1,a2,d,rad,raz,flag,F,midx,midy,naprav);

};

/* закрытие гафического режима */

getch();

closegraph();

};

 

 

Список литературы

 

1. Ратмиров В.А., «Основы программного управления станками». – М.: Машиностроение, 1978. – 240 с., ил.

 

2. Подбельский В.В., «Язык С++»: Учебное пособие. – М.: Финансы и статистика, 1996. – 560 с., ил.

<== предыдущая лекция | следующая лекция ==>
Изменение оформления карт | СВЯЗЬ МЕТОДА ГАУССА С РАЗЛОЖЕНИЕМ

Дата добавления: 2020-10-25; просмотров: 366;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.022 сек.