|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 3338 (0xd0a)
Types: TextFile
Names: »molecule.c«
└─⟦276d19d6e⟧ Bits:30007243 EUUGD5_I: X11R5
└─⟦af7d3f39a⟧ »./mit-2/mit-2.00«
└─⟦0abaffd9e⟧
└─⟦this⟧ »mit/demos/xgas/molecule.c«
/*
* molecule.c
* xgas: Copyright 1990 Larry Medwin: @(#)molecule.c 1.1 2/9/90
* Larry Medwin -- Dec. 18, 1989
* Larry Medwin -- Jan. 22, 1991: addMolecules()
*/
#include "xgas.h"
/*
* ADD MOLECULES
*
* Place molecules with the mouse buttons:
* MB 1: one molecule
* MB 2: as many as possible
* Pick a random angle to start trajectory.
*
* Drawing Molecules:
* This routine must guarantee that:
* Molecules are drawn exactly once in their new position.
* The "current" allPos array is updated with this position.
* nmolecules is updated consistently.
*/
void addMolecule( w, data, event)
Widget w;
LabData *data;
XEvent *event;
{
Molecule *mol;
float v;
float theta;
Coord pos;
/* Do we still have room for this one? */
if( data->nmolecules >= data->maxMolecules) {
return;
}
/* Find a place for it in the "global data" structure */
mol = &data->molecules[ data->nmolecules ];
/* Get starting point from mouse position */
/* data->scale.x has units of pixels/mm */
pos.x = event->xbutton.x / data->scale.x;
pos.y = event->xbutton.y / data->scale.y;
/* Init temperature of molecule (JUST A TEST: always set to one temp. */
mol->temperature = data->chamber[0].temperature;
/* Pick a random angle */
theta = frand( 0.0, TWO_PI);
/* Scale the velocities by the kinetic energy */
v = vEquilibrium( mol->temperature);
mol->yCoeff[1] = sin( theta ) * v;
mol->xCoeff[1] = cos( theta ) * v;
/* Form the equations of motion */
mol->xCoeff[0] = pos.x;
mol->yCoeff[0] = pos.y;
/* Fake last collision: use current location as collisionPos */
mol->collisionPos.x = pos.x;
mol->collisionPos.y = pos.y;
mol->collisionTime = data->time;
/* Which box are we in? (wall[4].end[1] is far corner of box 0) */
if( pos.x == data->chamber[0].walls[4].end[1].x) {
/* starting in hole; which way are we moving? */
if( mol->xCoeff[1] > 0.0) {
mol->thisBox = 1;
}
else {
mol->thisBox = 0;
}
}
else if( pos.x < data->chamber[0].walls[4].end[1].x) {
mol->thisBox = 0;
}
else {
mol->thisBox = 1;
}
if (mol->thisBox != 0 && mol->thisBox != 1) {
error("In addMolecule(): couldn't pick a box.", 0);
}
/* next collision? */
mol->collisionWall = NULL;
findNextCollision( mol, data);
/* Add molecule to the allPos array of all molecule positions */
data->allPos[ data->nmolecules*2 + data->timestep % 2 ].x
= (short) event->xbutton.x;
data->allPos[ data->nmolecules*2 + data->timestep % 2 ].y
= (short) event->xbutton.y;
/* Draw it in its initial position */
XFillRectangle( XtDisplay(w), XtWindow(w), data->MoleculeGC,
(int) data->allPos[ data->nmolecules*2 + data->timestep % 2 ].x,
(int) data->allPos[ data->nmolecules*2 + data->timestep % 2 ].y,
(int) MOLECULE_SIZE, (int) MOLECULE_SIZE);
/* Increment number of molecules */
data->nmolecules += 1;
}
void addMolecules( w, data, event)
Widget w;
LabData *data;
XEvent *event;
{
int i;
switch (event->xbutton.button) {
case 1: addMolecule( w, data, event);
break;
case 2: for (i=data->nmolecules; i<data->maxMolecules; i++)
addMolecule( w, data, event);
break;
default:
break;
}
}