⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldrawgh.cpp

📁 ldraw_DOS游戏开发包
💻 CPP
字号:
#include <ldraw.h>
#include <math.h>
#include <stdlib.h>
short ld_fillMode=0, ld_workColor=7, ld_workBColor=0,
      ld_x=0, ld_y=0;

void lgotoxy(short x,short y) { ld_x=x; ld_y=y; } 
void lsetColor(uchar color) { ld_workColor=color; }
void lsetBColor(uchar color) { ld_workBColor=color; }
void lcircle(short x,short y,short r);
void lline(short x1,short y1,short x2,short y2);
void poly(short fill,short num,short *points);
static void l_p_zoom(short sx,short sy,short ex,short ey,short *bx);
////////////////////////////////////////////////////////////////////////////
static void lHFillLine(short x,short y,short len,uchar c);
void lpoly(short fill,short num,short *points)
{ short j, color=ld_workColor;
  if (num<=0) return;
  if (num==1) { lpixel(points[0],points[1],color); return; }
  if (num==2) { lline(points[0],points[1],points[2],points[3]); return; }
  for (j=0;j<(num-1)*2;j+=2) 
    lline(points[j],points[j+1],points[j+2],points[j+3]);
  lline(points[0],points[1],points[j],points[j+1]);
}
void lcircle(short x0,short y0,short r)
{ short cx=0, cy=r, df=1-r,d_e=3,d_se=-2*r+5,
        x,y,xmax,i;
  int   tn;
  uchar color=ld_workColor;
  switch (ld_fillMode)
   {  case 0: y=r; x=0; xmax=(double)r*sin(3.1415926/4);
              tn=(1-r*2);
              while (x<xmax)
               { if (tn>=0) {  
                    tn+=( 6 + ((x-y)<<2) );
                    y--;
                 } else tn+=( (x<<2) + 2 );
                 lpixel(x0+y,y0+x,color);
                 lpixel(x0+x,y0+y,color);
                 lpixel(x0-x,y0+y,color);
                 lpixel(x0-y,y0+x,color);
                 lpixel(x0-y,y0-x,color);
                 lpixel(x0-x,y0-y,color);
                 lpixel(x0+x,y0-y,color);
                 lpixel(x0+y,y0-x,color);
                 x++;
               }
              break;
      case 1: do {
                lHFillLine(x0-cy,y0-cx,(cy<<1)+1,color);
                if (cx) lHFillLine(x0-cy,y0+cx,(cy<<1)+1,color);
                if (df<0) {
                   df+=d_e; d_e+=2; d_se+=2;
                } else 
                { if (cx!=cy) { 
                     lHFillLine(x0-cx,y0-cy,(cx<<1)+1,color);
                     if (cy) lHFillLine(x0-cx,y0+cy,(cx<<1)+1,color);
                   }
                  df+=d_se; d_e+=2; d_se+=4;
                  cy--; 
                } 
                cx++;
              } while(cx<=cy);
              break;
   }
}
void lline(short x1,short y1,short x2,short y2)
{
  int   i,x,y,p,n,tn;
  uchar c=ld_workColor;

  if (y1==y2)
      { if (x1>x2) { x=x1; x1=x2; x2=x; }
	for (x=x1;x<=x2;x++) lpixel(x,y1,c);
	return;
      }
  if (x1==x2)
      { if (y1>y2) { y=y2; y2=y1; y1=y; }
	for (y=y1;y<=y2;y++) lpixel(x1,y,c);
	return;
      }

  if ( abs(y2-y1) <= abs(x2-x1) )
       {
       if ( (y2<y1&&x2<x1) || (y1<=y2&&x1>x2) )
	  {
	  x=x2; y=y2; x2=x1; y2=y1; x1=x; y1=y;
	  }
       if ( y2>=y1 && x2>=x1 )
	  {
	  x=x2-x1; y=y2-y1;
	  p=2*y; n=2*x-2*y; tn=x;
	  while (x1<=x2) {
	      if (tn>=0) tn-=p;
	      else { tn+=n; y1++; }
	      lpixel(x1,y1,c);
	      x1++;
	      }
	  }
       else
	  {
	  x=x2-x1; y=y2-y1;
	  p=-2*y; n=2*x+2*y; tn=x;
	  while (x1<=x2) {
		if (tn>=0) tn-=p;
		else { tn+=n; y1--; }
		lpixel(x1,y1,c);
		x1++;
		}
	  }
       }
  else
       {
       x=x1; x1=y2; y2=x; y=y1; y1=x2; x2=y;
       if ( (y2<y1&&x2<x1) || (y1<=y2&&x1>x2) )
	    {
	    x=x2; y=y2; x2=x1; x1=x; y2=y1; y1=y;
	    }
       if ( y2>=y1 && x2>=x1 )
	    {
	    x=x2-x1; y=y2-y1;
	    p=2*y; n=2*x-2*y; tn=x;
	    while (x1<=x2)  {
		if (tn>=0) tn-=p;
		else { tn+=n; y1++; }
		lpixel(y1,x1,c);
		x1++;
		}
	    }
       else
	    {
	    x=x2-x1; y=y2-y1;
	    p=-2*y; n=2*x+2*y; tn=x;
	    while (x1<=x2) {
		if (tn>=0) tn-=p;
		else { tn+=n; y1--; }
		lpixel(y1,x1,c);
		x1++;
		}
	    }
       }

}
void llineto(short x,short y)
{ lline(ld_x,ld_y,x,y); 
}
void lbar(short x1,short y1,short x2,short y2)
{ uchar c=ld_workColor;
  short x,y,len;
  if (x1>x2) { x=x1; x1=x2; x2=x; }
  if (y1>y2) { x=y1; y1=y2; y2=x; }
  len=x2-x1+1;
  for (y=y1;y<=y2;y++) lFillLine(x1,y,len,c);
}
void lrectangle(short x1,short y1,short x2,short y2)
{ switch (ld_fillMode)
   { case 0: lline(x1,y1,x2,y1); lline(x1,y1,x1,y2);
             lline(x2,y1,x2,y2); lline(x1,y2,x2,y2);
             break;
     case 1: lbar(x1,y1,x2,y2); break;
   }
}
static void l_p_zoom(short sx,short sy,short ex,short ey,short *bx)
{ short t,distance;
  short x=0,y=0,dx,dy;
  short incx,incy;
  dx=ex-sx; dy=ey-sy;
  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);
  if (dx>dy) distance=dx;
     else distance=dy;
  for (t=0;t<distance+1;t++)
    { bx[sy]=sx;
      x+=dx; y+=dy;
      if (x>distance) {
	 x-=distance;
	 sx+=incx;
      }
      if (y>distance) {
	 y-=distance;
	 sy+=incy;
      }
    }
}
static void lHFillLine(short x,short y,short len,uchar c)
{ switch (ld_fillMode)
   { case 1: lFillLine(x,y,len,c); break;
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -