2.2. 参考程序
VB程序:
直线:
Sub 偏差计算()
偏差 = Abs(x终点) × z动点 - x动点 × Abs(z终点)
End Sub
Sub 插补()
Dim c As Integer
Select Case 象限标志
Case 1: ''第一象限插补
Do Until x动点 + z动点 >= 总步数
If 偏差 >= 0 Then
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
Else
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
End If
偏差计算
Loop
Case 2: ''第二象限插补
c = x终点: x终点= z终点: z终点= -c
c = x步长: x步长 = z步长: z步长 = -c
Do Until x动点 + z动点 >= 总步数
If 偏差 >= 0 Then
x动点 = x动点 + 1:
Line -Step(x步长, 0), vbRed
Else
z动点 = z动点 + 1:
Line -Step(0, z步长), vbRed
End If
偏差计算
Loop
Case 3: ''第三象限插补
x步长 = -x步长: z步长 = -z步长
Do Until x动点 + z动点 >= 总步数
If 偏差 >= 0 Then
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
Else
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
End If
偏差计算
Loop
Case 4: ''第四象限插补
c = x终点: x终点= -z终点: z终点 = c
c = x步长: x步长 = -z步长: z步长 = c
Do Until x动点 + z动点 >= 总步数
If 偏差 >= 0 Then
x动点 = x动点 + 1: Line -Step(x步长, 0), vbRed
Else
z动点 = z动点 + 1: Line -Step(0, z步长), vbRed
End If
偏差计算
Loop
End Select
End Sub
圆弧:
Sub 偏差计算()
偏差 = Sqr((x动点 - x圆心) 2 + (z动点 - z圆心) 2) - R
End Sub
Sub 插补()
x动点 = x起点: z动点 = z起点:
动点象限判别
xx: Select Case 象限标志
Case 1: 单步连续判断
If 顺逆标志 = "顺" Then ''第一象限插补
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
x动点 = x动点 - 1:
Line -Step(0, -x步长), vbRed
Else
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 1 Then
GoTo xx
End If
单步连续判断
Loop
ElseIf 顺逆标志 = "逆" Then
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
z动点 = z动点 - 1:
Line -Step(-z步长, 0), vbRed
Else
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
End If
DoEvents
偏差计算
动点象限判别
If 象限标志 <> 1 Then
GoTo xx
End If
Loop
End If
Case 2:单步连续判断
If 顺逆标志 = "顺" Then ''第二象限插补
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
z动点 = z动点 - 1:
Line -Step(-z步长, 0), vbRed
Else
x动点 = x动点 - 1:
Line -Step(0, -x步长), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 2 Then
GoTo xx
End If
Loop
ElseIf 顺逆标志 = "逆" Then
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
Else
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 2 Then
GoTo xx
End If
Loop
End If
Case 3: 单步连续判断
If 顺逆标志 = "顺" Then ''第三象限插补
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
Else
z动点 = z动点 - 1:
Line -Step(-z步长, 0), vbRed
End If
DoEvents
偏差计算
动点象限判别
If 象限标志 <> 3 Then
GoTo xx
End If
Loop
ElseIf 顺逆标志 = "逆" Then
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
Else
x动点 = x动点 - 1:
Line -Step(0, -x步长), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 3 Then
GoTo xx
End If
Loop
End If
Case 4: 单步连续判断
If 顺逆标志 = "顺" Then ''第三象限插补
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
z动点 = z动点 + 1:
Line -Step(z步长, 0), vbRed
Else
x动点 = x动点 + 1:
Line -Step(0, x步长), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 4 Then
GoTo xx
End If
Loop
ElseIf 顺逆标志 = "逆" Then
Do Until (x动点 - x终点) = 0 And (z动点 - z终点) = 0
If 偏差 >= 0 Then
x动点 = x动点 - 1:
Line -Step(0, -x步长), vbRed
Else
z动点 = z动点 - 1:
Line -Step(-z步长, 0), vbRed
End If
偏差计算
动点象限判别
If 象限标志 <> 4 Then
GoTo xx
End If
Loop
End If
End Select
End Sub
C程序:
#include "conio.h"
#include "graphics.h"
#include "process.h"
#define Ni_circle 0
#define Shun_circle 1
void init_graph();
void draw_Base_circle();
void draw_cabu_circle();
void close_graph();
void acrroods();
static float x0,y0;
void line_cabu(), draw_line(),draw_line_cabu();
void line_cabu() /*此函数控制直线插步两次*/
{
int i;
init_graph();
sleep(1);
for(i=0;i<2;i++)
{
line(0,120,300,120); outtextxy(310,120,"Z");
line(100,10,100,300); outtextxy(110,300,"X");
outtextxy(90,130,"O");
draw_line();
if(i==0)
draw_line_cabu(6);
else draw_line_cabu(2);
gotoxy(50,5);
getch();
cleardevice();
setcolor(WHITE);
}
}
void draw_line()/*画直线*/
{
line(100,120,600,450);
textcolor(YELLOW);
directvideo=0;
gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");
gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");
gotoxy(45,7); cprintf("Units :Pixel");
gotoxy(45,8); cprintf("Line now:");
}
void draw_line_cabu(int step)/*关键的直线插补函数*/
{
int Xe=600,Ye=450;
float Fm,Xm=100,Ym=120;
setcolor(RED);
moveto(Xm,Ym);
while(Xm<=Xe&&Ym<=Ye)
{
Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);
if(Fm>=0)
Xm=Xm+step;
else
Ym=Ym+step;
lineto(Xm,Ym);
gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120);
delay(1100);
}
}
/* 圆插补部分的函数区*/
void init_graph() /*图形系统初始化*/
{
int gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,"");
cleardevice();
}
void acrroods() /*屏幕中心坐标*/
{
x0=getmaxx()/2;
y0=getmaxy()/2;
}
void draw_Base_circle() /*画圆及写参数*/
{
line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");
line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");
outtextxy(x0-10,y0+10,"O");
circle(x0,y0,150);
textcolor(YELLOW);
directvideo=0;
gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");
gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");
gotoxy(46,4);cprintf("Units :Pixel");
gotoxy(46,5);cprintf("Circle now:");
}
void close_graph() /*关图形系统*/
{
closegraph();
}
void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/
{
int flag=0;
float Fm,Xm,Ym;
Xm=x0+150; Ym=y0;
moveto(Xm,Ym);
setcolor(RED);
while(1) /*分象限,顺圆和逆圆讨论*/
{
Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/
if(Fm>=0){
if(!Directory){ /*逆圆判断*/
if(Xm>=x0&&Ym<=y0)
{
if(flag) break; /*if语句判断象限,以下一样*/
else Xm=Xm-sstep;
}
if(Xm<=x0&&Ym<=y0)
{
flag=1; Ym=Ym+sstep;
}
if(Xm<=x0&&Ym>=y0)
Xm=Xm+sstep;
if(Xm>=x0&&Ym>=y0)
Ym=Ym-sstep;
}
else { /*it is Directory''s else*/
if(Xm>x0&&Ym
Ym=Ym+sstep;
if(Xm<=x0&&Ym<=y0)
Xm=Xm+sstep;
if(Xmy0) {
flag=1; Ym=Ym-sstep;}
if(Xm>=x0&&Ym>=y0) {
if(flag) break;
Xm=Xm-sstep;}
}
}
else{ /*it is Fm''s else*/
if(!Directory) {
if(Xm>x0&&Ym
{
if(flag) break;
else Ym=Ym-sstep;
}
if(Xm<=x0&&Ym<=y0)
{
flag=1; Xm=Xm-sstep;
}
if(Xm<=x0&&Ym>=y0)
Ym=Ym+sstep;
if(Xm>=x0&&Ym>=y0)
Xm=Xm+sstep;
}
else{
if(Xm>x0&&Ym
Xm=Xm+sstep;
if(Xm<=x0&&Ym<=y0)
Ym=Ym-sstep;
if(Xm<=x0&&Ym>=y0){
flag=1; Xm=Xm-sstep;}
if(Xm>=x0&&Ym>=y0) {
if(flag) break;
else Ym=Ym+sstep;}
}
}
lineto(Xm,Ym);
gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0);
delay(800);
}
}
void circle_demo(int Directory) /*控制圆插补两次*/
{
int i=0,sstep;
init_graph();
sleep(2);
acrroods(&x0,&y0);
for(i=0;i<2;i++)
{
draw_Base_circle(150);
if(i==0){
sstep=6;
draw_cabu_circle(sstep,Directory);}
else{
sstep=1;
draw_cabu_circle(sstep,Directory);}
getch();
cleardevice();
setcolor(WHITE);
}
}
/* 圆插补部分的函数区结束*/
main()/*主函数负责写封面和函数调用*/
{
int choice=0;
init_graph();
while(choice!=4)
{
setfillstyle(1,RED);
bar(200,30,400,80);
setcolor(GREEN);
settextstyle(3,0,10);
outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");
setcolor(WHITE);
settextstyle(0,0,1);
outtextxy(200,120,"1. Line demo.");
outtextxy(200,140,"2. Shun_Circle demo.");
outtextxy(200,160,"3. Ni_Circle demo.");
outtextxy(200,180,"4. Quit the program.");
outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13);
scanf("%d",&choice);
switch(choice)
{
case 1: line_cabu();break;
case 2: circle_demo(Ni_circle);break;
case 3: circle_demo(Shun_circle);break;
case 4: break;
default: printf("\nChoice wrong,try again!");
}
}
close_graph();
}