greg@bluemtn.uucp (Greg Richter (2XS)) (07/02/90)
In response to various requests, attached is a simple grid projection
in Turbo C.
#include <graphics.h>
#include <alloc.h>
#include "colors.h"
#define XSTEP 82 /* Grid densities (82,180) */
#define YSTEP 160
#define VPX XMIN+(XMAX-XMIN)/2 /* Viewpoint (82,165) */
#define VPY 90
#define VPZ 165
#define ORIGX (XMIN + (XMAX-XMIN)/2) /* Three space origin for rotation*/
#define ORIGY 75
#define ORIGZ (ZMAX + (YMAX-ZMAX)/2)
/*** X3D and Y3D transform a 3 space point
*** to its image on the XY plane.
***/
/***
NAME
x3d
SYNOPSIS
int x3d(px,py,pz,vx,vy,vz)
float px, py, pz, vx, vy, vz;
DESCRIPTION
X3d computes the 2-dimensional x-value of a three dimensional
point (px,py,pz) with viewpoint (vx,vy,vz). The integer value
of the x-value is returned.
***/
x3d(px,py,pz, vx,vy,vz)
float px,py,pz, vx,vy,vz;
{
return( (int) (px - ( (vx-px) / (vz-pz) ) * pz) );
}
/***
NAME
y3d
SYNOPSIS
int y3d(px,py,pz,vx,vy,vz)
float px, py, pz, vx, vy, vz;
DESCRIPTION
Y3d computes the 2-dimensional y-value of a three dimensional
point (px,py,pz) with viewpoint (vx,vy,vz). The integer value
of the y-value is returned.
***/
y3d(px,py,pz, vx,vy,vz)
float px,py,pz, vx,vy,vz;
{
return( (int) YMAX + (py + ( (vy-py) / (vz-pz) ) * pz) );
}
/***
NAME
draw_grid
SYNOPSIS
void draw_grid(pitch,roll,foreground)
int pitch, roll, foreground;
DESCRIPTION
Draw_grid draws a 3 dimensional grid as a 2 dimensional projection
inside a boxed area. If foreground is 0, the previously drawn
grid is erased, otherwise a new grid is drawn. Pitch and Roll are
given in degrees and they determine the pitch and roll of the grid.
***/
draw_grid(pitch,roll,foreground)
/*** Draw a three space grid as a two space projection inside a boxed area
***
***/
int pitch,roll,foreground;
{
float vpx=(float)VPX,vpy=(float)VPY,vpz=(float)VPZ;
int i,j;
int goplot;
int cx,cy,ex,ey,dx,dy,fx,fy;
float x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4;
vpy -= pitch/4;
setlinestyle(4,0x5555,1);
if (vpy < 0) return(0); /* no grid if not visible or underneath */
for(i=XMIN;i<=XMAX+2;i+=XSTEP)
{
x1 = x2 = i; /* grid corners to match flight box */
z1 = z4 = ZMAX;
x3 = x4 = i;
z2 = z3 = ZMIN;
y1 = y2 = y3 = y4 = 0;
ex = x3d(x1,y1,z1, vpx,vpy,vpz); ey = y3d(x1,y1,z1, vpx,vpy,vpz);
cx = x3d(x2,y2,z2, vpx,vpy,vpz); cy = y3d(x2,y2,z2, vpx,vpy,vpz);
/* change to new coordinate system */
ex -= ORIGX; ey -= ORIGY;
cx -= ORIGX; cy -= ORIGY;
/* rotate */
rot(ex,ey,&ex,&ey,roll);
rot(cx,cy,&cx,&cy,roll);
/* restore coordinate system */
ex += ORIGX; ey += ORIGY;
cx += ORIGX; cy += ORIGY;
if (foreground)
if (i == XMIN || i == XMAX+2) setcolor(GRIDEDGE);
else setcolor(GRID);
else setcolor(ATTITUDE_BACKGROUND);
goplot=clipper(&ex,&ey,&cx,&cy,XMIN,XMAX,YMIN,YMAX);
if(goplot==0) line(ex,ey,cx,cy);
}
for(j=ZMAX;j<=ZMIN;j+=YSTEP)
{
x1 = x2 = XMIN; /* grid corners to match flight box */
z1 = z4 = j;
x3 = x4 = XMAX;
z2 = z3 = j;
y1 = y2 = y3 = y4 = 0;
cx = x3d(x2,y2,z2, vpx,vpy,vpz); cy = y3d(x2,y2,z2, vpx,vpy,vpz);
dx = x3d(x3,y3,z3, vpx,vpy,vpz); dy = y3d(x3,y3,z3, vpx,vpy,vpz);
/* change to new coordinate system */
dx -= ORIGX; dy -= ORIGY;
cx -= ORIGX; cy -= ORIGY;
/* rotate */
rot(dx,dy,&dx,&dy,roll);
rot(cx,cy,&cx,&cy,roll);
/* restore coordinate system */
dx += ORIGX; dy += ORIGY;
cx += ORIGX; cy += ORIGY;
goplot=clipper(&cx,&cy,&dx,&dy,XMIN,XMAX,YMIN,YMAX);
if(goplot == 0) line(cx,cy,dx,dy); /* draw this line */
if (i > YMIN && foreground) setcolor(GRID);
else setcolor(ATTITUDE_BACKGROUND);
}
setlinestyle(0,0,1);
} /* drawgrid */
--
"Nothing to say, no place to say it." | Greg Richter
| ..{uunet,emory}!bluemtn!greg
-------------------------------------------------------------------------