Category : C Source Code
Archive   : CADSRC.ZIP
Filename : T-6.C
t-6.c
FUNCTION: Draws cubic parametric curves in 3D.
Compatibility: Supports VGA/EGA/CGA/MCGA graphics adapters and monitors.
NOTE: You need the *.BGI files that come with Turbo-C for
this to run.
___________________________________________________________________
INCLUDE FILES */
#include
#include
#include
#include
#include
/*________________________________________________________________
DECLARATIONS */
float x=0.0,y=0.0,z=0.0;
float sx=0.0,sy=0.0;
float xa=0.0,ya=0.0,za=0.0;
float d=1200.0;
double r1=5.88319;
double r2=6.28319;
double r3=5.79778;
double sr1=0.0,sr2=0.0,sr3=0.0;
double cr1=0.0,cr2=0.0,cr3=0.0;
float mx=0.0,my=0.0,mz=-150.0;
int maxx=639,minx=0,maxy=199,miny=0;
float screen_x=639,screen_y=199;
float rx=0.0,ry=0.0;
int t1=0, h=0;
int C0=0,C1=1,C2=2,C3=3,C4=4,C5=5,C6=6,C7=7,C8=8,C9=9,C10=10,
C11=11,C12=12,C13=13,C14=14,C15=15,mode_flag=0;
int edge_clr=7;
float B11[21][2];
float B12[21][2];
float x1=-30.0,y01=0.0,x4=30.0,y4=0.0,x2=-10.0,y2=15.0,x3=10.0,y3=-35.0;
float j01=0.0,j2=0.0,j3=0.0,j4=0.0;
float t=0.0,t2=0.0,t3=0.0;
float sx1=0.0,sy1=0.0,sx2=0.0,sy2=0.0;
void keyboard(void);void quit_pgm(void);void calc_3d(void);
void rotation(void);void window(void); void graphics_setup(void);
void notice(int x, int y);void freeform(void);
/*___________________________________________________________
MAIN ROUTINE */
main()
{
graphics_setup();
setviewport(minx,miny,maxx,maxy,1);
edge_clr=C7;
setcolor(edge_clr);
rotation();
t=0;t2=t*t;t3=t*t*t;
freeform();z=30.0;calc_3d();window();
moveto(sx,sy);
putpixel(sx,sy,edge_clr);
h=0;
for (t=0;t<=1.01;t+=0.05)
{
t2=t*t;t3=t*t*t;
freeform();z=30.0;calc_3d();window();
lineto(sx,sy);B11[h][0]=sx;B11[h][1]=sy;h=h+1;
}
t=0;t2=t*t;t3=t*t*t;
freeform();z=-30.0;calc_3d();window();
moveto(sx,sy);
putpixel(sx,sy,edge_clr);
h=0;
for (t=0;t<=1.01;t+=0.05)
{
t2=t*t;t3=t*t*t;
freeform();z=-30.0;calc_3d();window();
lineto(sx,sy);B12[h][0]=sx;B12[h][1]=sy;h=h+1;
}
for (h=-20;h<=20;h+=10)
{
t=0;t2=t*t;t3=t*t*t;
freeform();z=h;calc_3d();window();
moveto(sx,sy);putpixel(sx,sy,edge_clr);
for (t=0;t<=1.01;t+=0.05)
{
t2=t*t;t3=t*t*t;
freeform();z=h;calc_3d();window();
lineto(sx,sy);
}
}
for (h=0;h<=20;h+=2)
{
sx1=B11[h][0];sy1=B11[h][1];
sx2=B12[h][0];sy2=B12[h][1];
moveto(sx1,sy1);lineto(sx2,sy2);
}
setcolor(C7);notice(0,0);
for (t1=1;t1!=2; ) keyboard();
quit_pgm();
}
/*_________________________________________________________________
FUNCTION: calculate point on free-form curve
*/
void freeform(void)
{
j01=x1*(-t3+3*t2-3*t+1);j2=x2*(3*t3-6*t2+3*t);j3=x3*(-3*t3+3*t2);
j4=x4*t3;x=j01+j2+j3+j4;
j01=y01*(-t3+3*t2-3*t+1);j2=y2*(3*t3-6*t2+3*t);j3=y3*(-3*t3+3*t2);
j4=y4*t3;y=j01+j2+j3+j4;
return;
}
/*_________________________________________________________________
FUNCTION: calculate SIN,COS factors
*/
void rotation(void)
{
sr1=sin(r1);sr2=sin(r2);sr3=sin(r3);cr1=cos(r1);cr2=cos(r2);
cr3=cos(r3);
return;
}
/*_________________________________________________________________
FUNCTION: standard 3D formulas
*/
void calc_3d(void)
{
x=(-1)*x;xa=cr1*x-sr1*z;za=sr1*x+cr1*z;x=cr2*xa+sr2*y;
ya=cr2*y-sr2*xa;z=cr3*za-sr3*ya;y=sr3*za+cr3*ya;x=x+mx;y=y+my;
z=z+mz;sx=d*x/z;sy=d*y/z;
return;
}
/*_________________________________________________________________
FUNCTION: map cartesian coords to physical screen coords.
*/
void window(void)
{
sx=sx+399;sy=sy+299;rx=screen_x/799;ry=screen_y/599;sx=sx*rx;
sy=sy*ry;
return;
}
/*____________________________________________________________________
SUBROUTINE: press any key to quit... */
void keyboard(void)
{
if (bioskey(1) == 0) return;
else quit_pgm();
}
/*____________________________________________________________________
SUBROUTINE: graceful exit from the program */
void quit_pgm(void)
{
cleardevice(); restorecrtmode();exit(0);
}
/*___________________________________________________________________
SUBROUTINE: vga/ega/cga/mcga compatibility module */
void graphics_setup(void)
{
int graphics_adapter,graphics_mode;
detectgraph(&graphics_adapter,&graphics_mode);
if (graphics_adapter==VGA) goto VGA_mode;
if (graphics_mode==EGAHI) goto EGA_ECD_mode;
if (graphics_mode==EGALO) goto EGA_SCD_mode;
if (graphics_adapter==CGA) goto CGA_mode;
if (graphics_adapter==MCGA) goto CGA_mode;
goto abort_message;
VGA_mode:
graphics_adapter=VGA;graphics_mode=VGAHI;
initgraph(&graphics_adapter,&graphics_mode,"");
maxx=639;minx=0;maxy=479;miny=0;screen_x=639;screen_y=479;
setcolor(7);moveto(0,472);
outtext("640x480 16-color VGA mode");
moveto (472,472);
outtext("Press any key to Quit");
moveto(200,0);
outtext("Using TURBO C to generate 3D curves");
return;
EGA_ECD_mode:
graphics_adapter=EGA;graphics_mode=EGAHI;
initgraph(&graphics_adapter,&graphics_mode,"");
maxx=639;minx=0;maxy=349;miny=0;screen_x=639;screen_y=349;
setcolor(7);moveto(0,342);
outtext("640x350 16-color EGA mode");
moveto (472,342);
outtext("Press any key to Quit");
moveto(200,0);
outtext("Using TURBO C to generate 3D curves");
return;
EGA_SCD_mode:
graphics_adapter=EGA;graphics_mode=EGALO;
initgraph(&graphics_adapter,&graphics_mode,"");
maxx=639;minx=0;maxy=199;miny=0;screen_x=639;screen_y=199;
setcolor(7);moveto(0,192);
outtext("640x200 16-color EGA mode");
moveto (472,192);
outtext("Press any key to Quit");
moveto(200,0);
outtext("Using TURBO C to generate 3D curves");
return;
CGA_mode:
graphics_adapter=CGA;graphics_mode=CGAC3;
initgraph(&graphics_adapter,&graphics_mode,"");
maxx=319;minx=0;maxy=199;miny=0;screen_x=319;screen_y=199;
setcolor(3);moveto(48,192);
outtext("320x200 4-color CGA & MCGA mode");
moveto(120,0);outtext("Using TURBO C ");
return;
abort_message:
printf("\n\nUnable to proceed.\n");
printf("Requires VGA/EGA/CGA/MCGA adapter\n");
printf(" with appropriate monitor.\n");
printf("Please refer to LEE ADAMS book HIGH-Performance CAD Graphics in TURBO C.\n\n");
exit(0);
}
/*__________________________________________________________
SUBROUTINE: copyright notice */
int copyright[][3]={0x7c00,0x0000,0x0000,0x8231,
0x819c,0x645e,0xba4a,0x4252,0x96d0,0xa231,0x8252,0x955e,0xba4a,
0x43d2,0xf442,0x8231,0x825c,0x945e,0x7c00,0x0000,0x0000};
void notice(int x, int y)
{
int a,b,c; int t1=0;
for (t1=0;t1<=6;t1++)
{
a=copyright[t1][0];b=copyright[t1][1];
c=copyright[t1][2];
setlinestyle(USERBIT_LINE,a,NORM_WIDTH);
moveto(x,y);lineto(x+15,y);
setlinestyle(USERBIT_LINE,b,NORM_WIDTH);
moveto(x+16,y);lineto(x+31,y);
setlinestyle(USERBIT_LINE,c,NORM_WIDTH);
moveto(x+32,y);lineto(x+47,y);y=y+1;
}
setlinestyle(USERBIT_LINE,0xFFFF,NORM_WIDTH);
return;
}
/* END */
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/