📄 ldrawgh.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 + -