chabu.c
来自「一个关于指向插补和曲线插补的程序」· C语言 代码 · 共 495 行
C
495 行
#include "conio.h"
#include "graphics.h"
#include "process.h"
#include "time.h"
#include "stdio.h"
#include "stdlib.h"
#include <alloc.h>
#include <math.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();
void flash();
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,200,500,200); outtextxy(510,200,"Z");
line(200,10,200,450); outtextxy(210,450,"X");
outtextxy(190,220,"O");
draw_line();
if(i==0)
draw_line_cabu(16); /*步长为16*/
else draw_line_cabu(8); /*步长为8*/
gotoxy(50,5);
getch();
cleardevice();
setcolor(WHITE);
}
}
void draw_line()/*画原始直线*/
{
line(200,200,500,350);
textcolor(GREEN);
directvideo=0;
gotoxy(44,2); cprintf("Line from:X0 Y0 Z0 ");
gotoxy(44,3); cprintf("Line to :X300 Y0 Z150");
gotoxy(44,4); cprintf("Units :Pixel");
gotoxy(44,5); cprintf("Line now:");
gotoxy(44,6); cprintf("Time Used:") ;
gotoxy(60,6); cprintf("ms") ;
}
void draw_line_cabu(int step)/*关键的直线插补函数*/
{
int Xe=500,Ye=350;
int start,stop;
int time;
float Fm,Xm=200,Ym=200;
setcolor(RED);
setlinestyle(0,0,2);
moveto(Xm,Ym);
start = clock( );
while(Xm<=Xe&&Ym<=Ye)
{
Fm=(Ym-200)*(Xe-200)-(Xm-200)*(Ye-200);
if(Fm>=0)
Xm=Xm+step;
else
Ym=Ym+step;
lineto(Xm,Ym);
gotoxy(54,5); printf("X:%3.0f Y0 Z:%3.0f",Xm-200,Ym-200);
delay(50000000);
} start = clock( );
time = ((double) (stop - start));
gotoxy(54,6);printf("%d",time) ;
}
/*------------------------ 圆插补部分的函数区--------------------------------------------------------*/
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(GREEN);
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<y0)
Ym=Ym+sstep;
if(Xm<=x0&&Ym<=y0)
Xm=Xm+sstep;
if(Xm<x0&&Ym>y0) {
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<y0)
{
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<y0)
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(50000000);
}
}
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=16;
draw_cabu_circle(sstep,Directory);}
else{
sstep=8;
draw_cabu_circle(sstep,Directory);}
getch();
cleardevice();
setcolor(WHITE);
}
}
/* 圆插补部分的函数区结束*/
main()/*主函数负责写封面和函数调用*/
{
void * ptr;
int gd=DETECT,gm,choice=0;
float i;
init_graph();
while(choice!=4)
{
setfillstyle(1,GREEN);
bar(200,30,440,200);
setcolor(RED);
settextstyle(3,0,10);
outtextxy(220,50,"DEMO PROGRAM BY TangPeng");
outtextxy(240,100," CLASS: Auto0606");
outtextxy(240,120," NO. : 0901060612");
outtextxy(240,140," NAME : TANGPENG");
outtextxy(240,160," TIME : 2009.4.10");
setcolor(WHITE);
settextstyle(0,0,1);
outtextxy(200,220,"1. Line demo.");
outtextxy(200,240,"2. Clockwise demo.");
outtextxy(200,260,"3. Unclockwise demo.");
outtextxy(200,280,"4. Quit the program.");
outtextxy(160,300,"Please enter your choice:"); gotoxy(47,20);
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!");
}
} initgraph(&gd,&gm,"d:\\tc");
setactivepage(1);
setcolor(RED);
setfillstyle(1,14);
fillellipse(10,10,10,10);
ptr=malloc(imagesize(0,0,20,20));
getimage(0,0,20,20,ptr);
randomize();
setactivepage(0);
for(i=0;i<3000;i++)
putpixel(random(640),random(480),random(15));
for(i=0;i<6.28*4;i=i+0.005)
{putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT);
putimage(300+8*(cos(i)+(i)*sin(i)),240+6*(sin(i)-(i)*cos(i)),ptr,COPY_PUT);
if(kbhit()) break;
delay(10);
}
close_graph();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?