![]() |
The Computer Graphics Companion Online Edition Damian Scattergood 1999-2001 |
|
ADDITIONAL SAMPLE CODE |
| DegreesToRadians( a ) |
float DegreesToRadians ( a )
float a;
{
return (( a * PI ) / 180.0) ;
}
| RadiansToDegress( a ) |
float RadiansToDegrees ( a )
float a;
{
return ((a * 180.0 ) / PI ) ;
}
| DrawPoly ( int n, int *p) Draws a given polygon. |
void drawpoly(int n,int *P)
{
int i;
int x,y;
x=P[0];
y=P[1];
for (i=0; i<(n*2); i+=2)
{
DrawLine(P[i],P[i+1],P[i+2],P[i+3]);
}
i-=2;
DrawLine(P[i],P[i+1],x,y);
}
| ClipLine (x1, y1, x2, y2) Clips a given line to the screen dimensions |
int ClipLine(x1,y1,x2,y2)
int *x1;
int *y1;
int *x2;
int *y2;
{
int dx,dy;
if ((*x1>XMAX) && (*x2>XMAX)) return(0);
if ((*x1<XMIN) && (*x2<XMIN)) return(0);
if ((*y1<YMIN) && (*y2<YMIN)) return(0);
if ((*y1>YMAX) && (*y2>YMAX)) return(0);
dx= (*x2-*x1);
dy= (*y2-*y1);
if (*x1>XMAX) { *x2=*x1=XMAX;}
if (*x2<XMIN) { *x1=*x2=XMIN; }
if (*x1<XMIN) { *y1=*y1+(long)(XMIN-*x1)*(dy)/(dx); *x1=XMIN; }
if (*y1<YMIN) { *x1=(long)(YMIN-*y1)*(dx)/(dy)+*x1; *y1=YMIN; }
if (*y1>YMAX) { *x1=(long)(YMAX-*y1)*(dx)/(dy)+*x1; *y1=YMAX; }
if (*x2<0) { *x1=*x2=0; }
if (*x2>XMAX) { *y2=*y1+(long)(XMAX-*x1)*(dy)/(dx); *x2=XMAX; }
if (*y2<YMIN) { *x2=(long)(YMIN-*y1)*(dx)/(dy)+*x1; *y2=YMIN; }
if (*y2>YMAX) { *x2=(long)(YMAX-*y1)*(dx)/(dy)+*x1; *y2=YMAX; }
return(1);
}
| Angle ( x1, y1, x2, y2) Returns the angle between 2 points |
int Angle(x1,y1,x2,y2)
{
float a;
float xc,yc,x,y;
float dx,dy;
xc=(float)x1;
yc=(float)y1;
x=(float)x2;
y=(float)y2;
if (x==xc)
{
if (y>yc) a=PI/2;
else a=3*PI/2;
}
else {
dx=xc-x;
dy=yc-y;
a=atan(dy/dx);
}
if ((x>xc) && (y<yc)) {
a=a+2*PI;
} else {
if (x<xc) a=a+PI;
}
a=a*180/PI;
return((int)a);
}
| HitBox ( x1, y1, x2, y2, mx, my) Check if mx, my falls within the hitbox x1,y1,x2,y2 |
char HitBox (x1, y1, x2, y2, mx, my)
float x1, y1, x2, y2, mx, my;
{
if ( (mx >= x1) && (mx <= x2) && (my >= y1) && (my <= y2) ) return (1);
else return (0);
}
| GridSnap ( x1, y1) Snap a point x,y to a given Grid X,Y distance apart. |
void GridSnap ( x1, y1 )
float *x1;
float *y1;
{
*x = round (*x/Grid_Step_X ) * Grid_Step_X;
*y = round (*y/Grid_Step_Y ) * Grid_Step_Y;
}
| PolyArea2D Calculate the area of a given 2D polygon *Note Vertx array must be closed by last point being equal to first point. x[n] = x[0] y[n] = y[0] |
float PolyArea2D ( x, y, n )
float *x[ ]; //Vertex arrays;
float *y[ ];
int n; //Number of vertices.
{
float area = 0;
int i;
for ( i = 0; i < n; i++ ) {
area = area + ( x [ i+1] - x [ i ] ) * ( y [ i ] + y [ i+1] ) ;
}
area = - area / 2;
return (area);
}