您的当前位置:首页正文

C语言模拟直线插补与圆弧插补程序设计

2021-03-28 来源:个人技术集锦
数控技术课程设计

设计题目

说明书

直线插补与圆弧插补程序设计 机械设计以及自动化专业 机械工程学院 机械102

设计者 青岛理工大学

2013年6月20

目 录

1. 设计题目………………………………………………………1

2.目录……………………………………………………………2

3.直线插补流程图………………………………………………3

4.直线插补程序…………………………………………………4

5.程序结果………………………………………………………8

6.圆弧插补流程图………………………………………………9

7.圆弧插补程序…………………………………………………10

8.程序结果………………………………………………………21

一.直线插补

1.直线插补程序流程图

开始 置FM=0 输入XE、YE、XOY、NXY Y FM≥0? XOR=1或4? N XOR=1或2? N Y ZF=1 ZF=2 ZF=3 Y N ZF=4 FM=FM-YE FM=FM+YE 调用走步控制程序 NXY=NXY-1 NXY=0? N Y 结束

2.直线插补程序设计

#include \"stdio.h\"

int i,X,Y,X0,Y0,Xe,Ye,F,N; int a[30][2]; void main() {

int m;

int menu(); void yi(); void er(); void san(); void si(); void te();

void shuchu();

m=menu(); a[0][0]=X0; a[0][1]=Y0;

switch(m) {

case 1:yi();shuchu();break; case 2:er();shuchu();break; case 3:san();shuchu();break; case 4:si();shuchu();break; case 5:te();shuchu();break; default:printf(\"无法插补\\n\"); } }

int menu() {

int t;

printf(\"输入起点坐标\\n\"); scanf(\"%d,%d\ printf(\"输入终点坐标\\n\"); scanf(\"%d,%d\ if (Xe>=X0&&Ye>=Y0) t=1;

else if (Xe<=X0&&Ye>=Y0) t=2;

else if (Xe<=X0&&Ye<=Y0) t=3;

else if (Xe>=X0&&Ye<=Y0) t=4;

else if (Xe==X0&&((Ye>Y0&&Y0>=0)||(Yereturn(t); }

void yi() {

F=0;

N=Xe-X0+Ye-Y0; X=X0; Y=Y0;

for(i=1;i<=N;i++) { if(F>=0) {X++; a[i][0]=X; a[i][1]=Y; F-=Ye-Y0;} else {Y++; a[i][0]=X; a[i][1]=Y; F+=Xe-X0; } } }

void er() {

F=0;

N=X0-Xe+Ye-Y0; X=X0; Y=Y0;

for(i=1;i<=N;i++) {if(F>=0) { X--;

a[i][0]=X; a[i][1]=Y; F-=Ye-Y0;} else {Y++; a[i][0]=X; a[i][1]=Y; F+=X0-Xe; }

} } void san() {

F=0;

N=X0-Xe+Y0-Ye; X=X0; Y=Y0;

for(i=1;i<=N;i++) {if(F>=0) {X--;

a[i][0]=X; a[i][1]=Y; F-=Y0-Ye;} else { Y--;

a[i][0]=X; a[i][1]=Y; F+=X0-Xe; } } }

void si() {

F=0;

N=Xe-X0+Y0-Ye; X=X0; Y=Y0;

for(i=1;i<=N;i++) {if(F>=0) {X++; a[i][0]=X; a[i][1]=Y; F-=Y0-Ye;} else { Y--;

a[i][0]=X; a[i][1]=Y; F+=Xe-X0;} } }

void te() {

N=Ye-Y0; for(i=1;i<=N;i++) {

if(Ye>0) {Y++; a[i][0]=X; a[i][1]=Y;} else if(Ye<0) {Y--;

a[i][0]=X; a[i][1]=Y;} } }

void shuchu() {

for(i=0;i<=N;i++) { printf(\"%d \

printf(\"%d,%d\\n\ } }

3.程序结果

例如 起点(0,0)终点(6,4) 步数 坐标 1 1,0 2 1,1 3 2,1 4 2,2 5 3,2 6 4,2 7 4,3 8 5,3 9 6,3

10 6,4 二.圆弧插补

1.圆弧插补程序流程图

输入X0、Y0、NXY、RNS 置FM=0、XM=X0、YM=Y0 N N FM≥0? RNS=1,2,6,8? Y Y FM≥0? Y N RNS=2,5? RNS=2,7? N ZF=4 ZF=3 Y N ZF=2 Y ZF=1 N RNS=1,8? RNS=1,6? N Y ZF=3 ZF=4 Y ZF=2 ZF=1 FM=FM+2YM+1 FM=FM-2XM=1 FM=FM+2XM=1 FM=FM-2YM=1 YM=YM+1 YM=XM-1 YM=XM+1 YM=YM-1 调用走步控制程序 NXY=NXY-1 NXY=0? N 结束

2.圆弧插补程序 #include \"stdio.h\" #include \"math.h\"

int X0,Y0,X1,Y1,X2,Y2,X3,Y3,X4,Y4; int i=1,r,f,s; void main() {

int m;

int menu();

void yishun(); void yini();

void ershun(); void erni();

void sanshun(); void sanni(); void sishun(); void sini(); void shuchu(); m=menu(); switch(m) {

case 1:yishun();break; case 2:yini();break; case 3:ershun();break; case 4:yini();break; case 5:sanshun();break; case 6:yini();break; case 7:sishun();break; case 8:yini();break;

default:printf(\"无法插补\\n\"); } }

int menu() {

int t;

printf(\"输入原点坐标\\n\"); scanf(\"%d,%d\ printf(\"输入起点坐标\\n\"); scanf(\"%d,%d\ printf(\"输入终点坐标\\n\"); scanf(\"%d,%d\ printf(\"1:顺时针圆弧\\n\"); printf(\"2:逆时针圆弧\\n\"); scanf(\"%d\

X1=X3-X0; Y1=Y3-Y0; X2=X4-X0; Y2=Y4-Y0;

r=X1*X1+Y1*Y1;

if (X1>=0&&Y1>0&&s==1) t=1;

else if (X1>0&&Y1>=0&&s==2) t=2;

else if (X1<0&&Y1>=0&&s==1) t=3;

else if (X1<=0&&Y1<0&&s==2) t=4;

else if (X1<=0&&Y1<0&&s==1) t=5;

else if (X1<0&&Y1<=0&&s==2) t=6;

else if (X1>0&&Y1<=0&&s==1) t=7;

else if (X1>=0&&Y1<0&&s==2) t=8; else t=9;

return(t); }

void yishun() {

do {

f=X1*X1+Y1*Y1-r; if(f>=0) { Y1--;

f-=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

X1++;

f+=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0) {

void sishun(); sishun(); } }

void yini() { do {

f=X1*X1+Y1*Y1-r; if(f>=0) { X1--;

f-=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

Y1++;

f+=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(X1!=0&&(X1!=X2||Y1!=Y2));

if(X1==0) {

void erni(); erni(); } }

void ershun() { do

{

f=X1*X1+Y1*Y1-r; if(f>=0) { X1++;

f+=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

Y1++;

f+=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(X1!=0&&(X1!=X2||Y1!=Y2));

if(X1==0) {

void yishun(); yishun(); } }

void erni() { do {

f=X1*X1+Y1*Y1-r; if(f>=0) { Y1--;

f-=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

X1--;

f-=2*X1+1;

i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0) {

void sanni(); sanni(); } }

void sanshun() { do {

f=X1*X1+Y1*Y1-r; if(f>=0) { Y1++;

f+=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

X1--;

f-=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0) {

void ershun(); ershun(); } }

void sanni() { do

{

f=X1*X1+Y1*Y1-r; if(f>=0) { X1++;

f+=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

Y1--;

f+=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0) {

void sini(); sini(); } }

void sishun() { do {

f=X1*X1+Y1*Y1-r; if(f>=0) { X1--;

f-=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

Y1--;

f-=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0) {

void sanshun(); sanshun(); } }

void sini() { do {

f=X1*X1+Y1*Y1-r; if(f>=0) { Y1++;

f+=2*Y1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } else {

X1++;

f+=2*X1+1; i++;

printf(\"%d \

printf(\"%d,%d\\n\ } }

while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0) {

void yini(); yini(); } }

3.程序结果

例如 圆心(0,0)起点(4,3)终点(4,3) 步数 坐标 0 4,3 1 3,3 2 3,4 3 2,4 4 2,5 5 1,5 6 0,5 7 0,4 8 -1,4 9 -2,4 10 -3,4 11 -3,3 12 -4,3 13 -4,2 14 -5,2 15 -5,1 16 -5,0 17 -4,0 18 -4,-1 19 -4,-2

20 -4,-3 21 -3,3 22 -3,-4 23 -2,-4 24 -2,-5 25 -1,-5 26 0,-5 27 0,-4 28 1,-4 29 2,-4 30 3,-4 31 3,-3 32 4,-3 33 4,-2 34 5,-2 35 5,-1 36 5,0 37 4,0 38 4,1 39 4,2 40 4,3

因篇幅问题不能全部显示,请点此查看更多更全内容