画笔 pencil

 

/*************************************************************************************
      
作者:钟云德

     creat at 2006.3.30
      没有使用 graphics.h 库文件的图象模式
在MyTC 中编译通过
************************************************************************************
*/

#include 
< stdio.h >
#include 
< dos.h >
#include 
< ctype.h >
#include 
< conio.h >
#include 
< math.h >

 
void  setmode( int );
void  palet( int );
void  point( int  X, int  Y, int  color);
void  line( int  X1, int  Y1, int  X2, int  Y2, int  color);
void  boX( int  X1, int  Y1, int  X2, int  Y2, int  color);
void  fillboX( int  X1, int  Y1, int  X2, int  Y2, int  color);
int   getkey( void );
void  Xhair( int  X, int  Y);

void  main()
{
    union 
{
        
char c[2];
        
int i;
    }
key;
    
int X=10,Y=10,cc=2,onflag=1,palnum=1;
    
    
int X1=0,Y1=0,X2=10,Y2=150,firstpoint=1;
    
int d=1;
    setmode(
4);
    palet(
0);
    Xhair(X,Y);
    
do{
        key.i
=getkey();
        Xhair(X,Y);
        
if(!key.c[0])     /* 控制画线的方向 */
            
switch(key.c[1]){
                
case 75:if(onflag) line(X,Y,X,Y-d,cc); /*   LEFT  */
                Y
-=d;
                
break;
                
case 77:if(onflag) line(X,Y,X,Y+d,cc);/*   RIGHT  */
                Y
+=d;
                
break;
                
case 72:if(onflag) line(X,Y,X-d,Y,cc);/*    UP    */
                X
-=d;
                
break;
                
case 80:if(onflag) line(X,Y,X+d,Y,cc);/*    DOWN  */
                X
+=d;
                
break;
                
case 71:if(onflag) line(X,Y,X-d,Y+d,cc);/*HOME-UP LEFT*/
                Y
+=d;  X-=d;
                
break;
                
case 73:if(onflag) line(X,Y,X-d,Y+d,cc);/*PGUP-UP RIGHT*/
                Y
-=d;  X+=d;
                
break;
                
case 79:if(onflag) line(X,Y,X+d,Y-d,cc);/*END-DOWN LEFT*/
                Y
-=d;  X+=d;
                
break;
                
case 81:if(onflag) line(X,Y,X+d,Y+d,cc);/*PGUP-DOWN RIGHT*/
                Y
+=d;  X+=d;
                
break;
                
case 59:                               /*    F1    */
                d
=1;
                
break;
                
case 60:                               /*    F2    */
                d
=5;
                
break;
            }

        
else
            
switch(tolower(key.c[0])) {
                
case 'o':/*字母‘o ’,brush on_off,控制画笔的抬起落下*/
                onflag
=!onflag;
                
break;
                
case '1':/*color 1:浅蓝*/
                cc
=1;
                
break;
                
case '2':/*color 2:紫红*/
                cc
=2;
                
break;
                
case '3':/*color 3:白  */
                cc
=3;
                
break;
                
case '0':/*color 0:黑(背景色)*/
                cc
=0;
                
break;
                
                
case 'b':/*set box*/
                boX(X1,Y1,X2,Y2,cc);
                
break;
                
case 'f':/*set fill box*/
                fillboX(X1,Y1,X2,Y2,cc);
                
break;
                
case 'l':/*set line*/
                line(X1,Y1,X2,Y2,cc);
                
break;
                
case 'r':/* set endpoint */
                
if(firstpoint){X1=X; Y1=Y; }
                
else {X2=X; Y2=Y;}
                firstpoint 
=!firstpoint; /* 使firstpoint在真假值之间变化,设置范围的两点*/
                
break;
                
case 'p':/*set color */
                palnum 
=palnum==1?2:1;
                palet(palnum);
                
break;
            }

     Xhair(X,Y);
    }
while(key.c[0]!='q');  /*退出*/
    getch();
    
    setmode(
2);
}


void  setmode( int  mode)
{
    union REGS regs;
    regs.h.al
=mode;
    regs.h.ah
=0;
    int86(
0x10,&regs,&regs);
}


void  palet( int  pn)
{
    union REGS regs;
    regs.h.bh 
=1;
    regs.h.bl
=pn;
    regs.h.al
=11;
    int86(
0x10,&regs,&regs);
}


void  point( int  X, int  Y, int  color)
{
    union
{
        
char cc[2];
        
int i;
    }
 mask;
    
int i,index,posit;
    unsigned 
char t;
    
char Xor;
    
char far *ptr=(char far*)0Xb8000000;  /* 对不同模型的显示器的首地址取值不同                       */
                                          
/* 控制屏幕单色显示的开始地址是0xB0000,彩色显示的是0xB8000 */
                                          
/* b8000h~bffffh为80×25彩色字符模式的显示缓冲区,
                                             向此地址写入数据,写入的内容立即出现在屏幕上             
*/

    mask.i
=0xff3f;
    
if(X<0||X>199||Y<0||Y>319return;
    Xor
=color&128;
    color
=color&127;
    posit
=Y%4;
    color
<<=2*(3-posit );
    mask.i
>>=2*posit;
    index
=X*40+(Y/4);
    
if(X%2) index+=8152;
    
if(!Xor) {
        t
=*(ptr+index)&mask.cc[0];
        
*(ptr+index)=| color;
    }

    
else{
        t
=*(ptr+index) | (char)0;
        
*(ptr+index)=^ color;
    }

}


void  line( int  X1, int  Y1, int  X2, int  Y2, int  color)
{
    register 
int t,dis;  
    
int Xerr=0,Yerr=0,dX,dY;
    
int incX,incY;
    dX
=X2-X1;
    dY
=Y2-Y1;

    
if(dX>0) incX=1;
    
else if(dX==0) incX=0;
    
else incX =-1;
    
if(dY>0) incY=1;
    
else if(dY==0) incY=0;
    
else incY =-1;
    dX
=abs(dX);      
    dY
=abs(dY);
    
/*dis=dX<dY?dY:dX;*/
    dis
=(int)hypot(dX,dY); /* modify at 2006.4.8 */
    
/*已知直角三角形两个直角边长度,求斜边长度hypot(double x, double y) */
    
for(t=0;t<dis+1;t++){
        point(X1,Y1,color);
        Xerr
+=dX;
        Yerr
+=dY;
        
if(Xerr>dis){
            Xerr
-=dis;
            X1
+=incX;
        }

        
if(Yerr>dis){
            Yerr
-=dis;
            Y1
+=incY;
        }

    }

}


void  boX( int  X1, int  Y1, int  X2, int  Y2, int  color)
{
    line(X1,Y1,X2,Y1,color);
    line(X1,Y1,X1,Y2,color);
    line(X1,Y2,X2,Y2,color);
    line(X2,Y1,X2,Y2,color);
}


void  fillboX( int  X1, int  Y1, int  X2, int  Y2, int  color)
{
    register 
int i,begin,end;
    begin
=X1<X2? X1:X2;
    end
=X1>X2? X1:X2;
    
for(i=begin;i<=end;i++
      line(i,Y1,i,Y2,color);
}


void  Xhair( int  X, int  Y)
{
    line(X
-4,Y,X+3,Y,1|128);
    line(X,Y
+4,X,Y-3,1|128);
}


int  getkey( void )
{
    union REGS regs;
    regs.h.ah
=0;
    
return int86(0x16,&regs,&regs);
}

 

你可能感兴趣的:(画笔 pencil)