home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
dirs
/
projmot_453.lzh
/
ProjMot
/
src
/
graph.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-02-18
|
11KB
|
366 lines
/* Graph.c (ProjMot) *
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Libraries Used
* This Program plots the path * ~~~~~~~~~~~~~~~~~
* of a projectyle fired at * req.library
* origon o, with velocity v * intuition.library
* and angle Ø (theta), * graphics.library
* with constant acceleration * mathffp.library
* g (-9.8 m/s^2). * mathtrans.library
* *
* © Copyright 1991 Christian E. Hopps
*/
/* Functions * Global Variables
* ~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~
* GLibLoad() * IntuitionBase
* GLibUnload() * GfxBase
* Gcalc() * ReqBase
* Fire() * MathBase
* HandleIDCMP() * MathTransBase
* ReClip() * Scr
* VectorComponents(); * Win
* GetTime() * RP
* *
*/
#include <stdio.h>
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <graphics/gfx.h>
#include <proto/req.h>
#include <libraries/reqbase.h>
#include <exec/memory.h>
#include <libraries/mathffp.h>
#include "window.h"
#include "ggads.h"
#define SIGNALW (1L << Win->UserPort->mp_SigBit)
#define SIGNALG (1L << Gwin->UserPort->mp_SigBit)
#define CLIPx1 xy->clip->clipx1
#define CLIPy1 xy->clip->clipy1
#define CLIPx2 xy->clip->clipx2
#define CLIPy2 xy->clip->clipy2
extern int GLibLoad();
extern void GLibUnload();
extern int HandleIDCMP();
extern void Gcalc();
extern void Fire();
void ReClip();
struct Window *OpenWindow();
float GetTime();
void VectorComponents();
struct IntuitionBase *IntuitionBase; /* These libraries will be */
struct GfxBase *GfxBase; /* initialized by the */
struct ReqLib *ReqBase; /* external programg libload.o */
struct MathBase *MathBase;
struct MathTransBase *MathTransBase;
struct Window *Win; /* Window Pointer */
struct Window *Gwin; /* Win Pntr to Gads */
struct Screen *Scr; /* Screen Pointer */
struct RPort *RP; /* RastPort Pointer */
struct Clip /* Clipping info */
{
short clipx1;
short clipy1;
short clipx2;
short clipy2;
};
struct XY /* everything else info */
{
float voy;
float vox;
float x;
float y;
short xp;
short yp;
BOOL clipped;
int scale;
struct Clip *clip;
};
char text[] = "\nThe projectile made it %ldm. \nIt took %ld seconds.\n";
main()
{
struct IntuiMessage *msg;
struct XY *xy;
struct Clip *c;
struct GetLongStruct *GetLongStructVel, *GetLongStructAngle;
ULONG signal, sec, micro, timeo, acctime;
USHORT adone = FALSE;
int success,angle_i,vel_i, class;
float time;
BOOL timeisacc;
/* Open Up Everything and Allocate Memory */
if(!(GLibLoad()))
{
printf("\nLibraries could not open\n");
printf("Make sure req.library is in LIBS:\n");
GLibUnload();
exit(20);
}
if(!(Scr = (struct Screen *)AllocMem(sizeof(struct Screen),MEMF_PUBLIC | MEMF_CLEAR)))
{
printf("\ncould not allocatemem for screen\n");
goto exit1;
}
if(!(xy = (struct XY *)AllocMem(sizeof(struct XY),MEMF_PUBLIC | MEMF_CLEAR)))
{
printf("\ncould not allocatemem for xy\n");
goto exit1;
}
if(!(c = (struct Clip *)AllocMem(sizeof(struct Clip),MEMF_PUBLIC | MEMF_CLEAR)))
{
printf("\ncould not allocatemem for clip\n");
goto exit1;
}
/* Set up clip areas based on window size at start also modify
NewWindowStructure1 to make window as large as screen. */
xy->clip = c;
GetScreenData( Scr, sizeof(struct Screen), WBENCHSCREEN, NULL );
CLIPx2 = (NewWindowStructure1.Width = Scr->Width) - 40;
CLIPy2 = (NewWindowStructure1.Height = Scr->Height) - 20;
CLIPx1 = 10;
CLIPy1 = 10;
if(!(Win = OpenWindow(&NewWindowStructure1)))
{
printf("\nCould not open window\n");
GLibUnload();
}
if(!(Gwin = OpenWindow(&NewWindowStructure2)))
{
printf("\nCould not open window\n");
CloseWindow(Win);
GLibUnload();
}
if((success = (int)AddGList(Gwin, &Gadget1, -1, -1 ,NULL)) == -1)
goto exit;
RefreshGList(&Gadget1, Gwin, NULL, -1);
if(!(GetLongStructVel = (struct GetLongStruct *)AllocMem(sizeof(struct GetLongStruct),MEMF_PUBLIC | MEMF_CLEAR)))
{
printf("\ncould not get memory for req.struct\n");
goto exit1;
}
if(!(GetLongStructAngle = (struct GetLongStruct *)AllocMem(sizeof(struct GetLongStruct),MEMF_PUBLIC | MEMF_CLEAR)))
{
printf("\ncould not get memory for req.struct\n");
goto exit1;
}
RP = Win->RPort; /* Init some var. */
vel_i=50;
angle_i=45;
xy->clipped = 0;
SetDrMd(RP,JAM1);
class = 0;
xy->xp = CLIPx1;
xy->yp = CLIPy2;
SetAPen(RP,1);
acctime = 1;
timeisacc = FALSE;
xy->scale = 1;
/* Main Loop */
/* if close gadget is clicked then adone will be set to true */
while(!(adone))
{
Move(RP,CLIPx1,CLIPy2); /* Move to modified origin */
if(acctime != 1) timeisacc = TRUE;
signal = Wait(SIGNALW | SIGNALG);
if(signal & SIGNALG) /* Gadget Window has rec. */
{ /* a message can only be */
success = HandleIDCMP((int)1,Gwin); /* a GADGETUP */
switch(success)
{
case 5: /* velocity */
GetLongStructVel->titlebar = "Initial Velocity(m/s)";
GetLongStructVel->defaultval = vel_i;
GetLongStructVel->minlimit = 0;
GetLongStructVel->maxlimit = 100000;
GetLongStructVel->versionnumber = REQVERSION;
if(vel_i = GetLong(GetLongStructVel))
if(!(vel_i = GetLongStructVel->result))
vel_i = 50;
break;
case 1: /* angle */
GetLongStructAngle->titlebar = "Ø (theta)";
GetLongStructAngle->defaultval = angle_i;
GetLongStructAngle->minlimit = 0;
GetLongStructAngle->maxlimit = 90;
GetLongStructAngle->versionnumber = REQVERSION;
if(angle_i = GetLong(GetLongStructAngle))
if(!(angle_i = GetLongStructAngle->result))
angle_i = 45;
break;
case 3: /* Fire! */
WindowToBack(Gwin);
VectorComponents(xy,angle_i,vel_i);
CurrentTime(&timeo,µ);
/* Now we go into the secondary loop, draw motion path.*/
/* if left mouse button clicked, close gadget clicked, */
/* size is changed, or function is done, END */
while(SPFix(xy->y) >= 0 &
(!(msg = (struct IntuiMessage *)
GetMsg(Win->UserPort))))
{
time = GetTime(timeo);
if(timeisacc)
time = SPMul(time,SPFlt(acctime));
Gcalc(time,xy);
Fire(xy, RP);
} /* Done with plot */
if(msg) /* This is to check */
{ /* if Newsize was rec. */
class = msg->Class; /* if so bypass handle */
ReplyMsg(msg); /* function and do it */
if(class == NEWSIZE)/* right here otherwise*/
{ /* forget message */
ReClip(Win,xy);
SetRast(RP,0);
}
}
CurrentTime(&sec,µ);
xy->y =SPFlt(1); /* init y so it can pass */
Move(RP,CLIPx1,CLIPy2); /* while condition next */
xy->clipped = 0; /* time; reset origin */
SimpleRequest(&text,(SPFix(xy->x)*xy->scale),(acctime*(sec-timeo)));
WindowToFront(Gwin); /* and send a text req. */
break;
case 6: /* Clear */
SetRast(RP,0);
break;
case 2: /* Scale */
GetLongStructVel->titlebar = "Scale (# of m/pixel)";
GetLongStructVel->defaultval = xy->scale;
GetLongStructVel->minlimit = 1;
GetLongStructVel->maxlimit = 10000;
GetLongStructVel->versionnumber = REQVERSION;
xy->scale = GetLong(GetLongStructVel);
xy->scale = GetLongStructVel->result;
if(xy->scale == 0)
xy->scale = 1;
SetRast(RP,0);
break;
case 4: /* Acc. Time */
GetLongStructVel->titlebar = "Time Acceleration";
GetLongStructVel->defaultval = acctime;
GetLongStructVel->minlimit = 1;
GetLongStructVel->maxlimit = 100;
GetLongStructVel->versionnumber = REQVERSION;
acctime = GetLong(GetLongStructVel);
acctime = GetLongStructVel->result;
if(acctime == 0)
acctime = 1;
timeisacc = TRUE;
break;
default:
break;
}
}
if(signal & SIGNALW) /* Handle message from */
{ /* the main window */
success = HandleIDCMP((int)0,Win);
switch(success)
{
case 0:
adone = TRUE;
break;
case 5:
SetRast(RP,0);
ReClip(Win,xy);
break;
case 2:
adone = FALSE;
break;
defualt:
break;
}
}
}
exit1:
if(GetLongStructAngle)
FreeMem(GetLongStructAngle, sizeof(struct GetLongStruct));
if(GetLongStructVel)
FreeMem(GetLongStructVel, sizeof(struct GetLongStruct));
success = RemoveGList(Gwin, &Gadget1,-1);
exit:
if(Gwin) CloseWindow(Gwin);
if(Win) CloseWindow(Win);
if(Scr) FreeMem(Scr, sizeof(struct Screen));
if(xy) FreeMem(xy, sizeof(struct XY));
if(c) FreeMem(c,sizeof(struct Clip));
GLibUnload();
/* All Done */
}
void ReClip(Win,xy) /* Set up new clip values */
struct XY *xy;
struct Window *Win;
{
CLIPx2 = Win->Width - 40;
CLIPy2 = Win->Height - 30;
}
void VectorComponents(xy,angle_i,vel_i) /* Break Vector in comp. */
struct XY *xy;
int angle_i, vel_i;
{
float vel,cosx,siny,rangle,angle;
vel = SPDiv(SPFlt(xy->scale),SPFlt(vel_i));
angle = SPFlt(angle_i); /* change angle to flt */
/* Compute Radian Conversion */
/* NOTE!! there is multiple errors in commodore's */
/* Libraries and devices, they incorectly state that*/
/* the mathtrans functions are like so: */
/* f1 = SPDiv(f2,f3) => (f1 = f2 / f3) */
/* when in reality the function is equal to: */
/* f1 = f3 / f2; It took a week to find that bug!:-)*/
/* this is also true for SPSub, and I have an itchy */
/* feeling for the rest of the functions as well, */
/* it doesn't realy matter for the comunitive */
/* functions though. */
rangle = SPDiv(SPFlt((int)180), SPMul(PI,angle));
siny = SPSin(rangle);
cosx = SPCos(rangle);
xy->vox = SPMul(vel , cosx); /* calc init. x vel.*/
xy->voy = SPMul(vel , siny); /* calc inti. y vel.*/
}
float GetTime(timeo) /* Get the time in sec.micro */
long timeo; /* return a float value */
{
int sec,micro;
float m,time;
CurrentTime(&sec,µ);
m = SPDiv(SPFlt(1000000),SPFlt(micro));
time = SPAdd(SPFlt(sec - timeo), m);
return(time);
}