Разработка алгоритма линейно-круговой интерполяции методом оценочной функции
Сущность метода оценочной функции
При линейно-круговой интерполяции с разделенными шагами по координатам в плоскости 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. Величина оценочной функции определяется выражением:
| |||
Рисунок 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;