home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Between Heaven & Hell 2
/
BetweenHeavenHell.cdr
/
500
/
470
/
rccl042
< prev
next >
Wrap
Text File
|
1987-03-02
|
3KB
|
122 lines
/*
* RCCL Version 1.0 Author : Vincent Hayward
* School of Electrical Engineering
* Purdue University
* Dir : src
* File : drive.c
* Remarks : Straight line trajectory drive function.
* Exact implementation of Paul's book.
* Usage : part of the lib
*/
#include "../h/rccl.h"
#include "../h/manip.h"
#include "../h/umac.h"
/*
* set drive parameters of a motion defined by the p1 p2 transforms
*/
setpar_n(dpt, p1, p2) /*::*/
register DRVP_PTR dpt;
register TRSF_PTR p1, p2;
{
real dot();
VECT diff; /* local vector for storing p2p - p1p */
real n1, n2, n3; /* local variables for common subexpr */
real x, y;
real lthe, lpsi;
real spsi, cpsi, vthe, cthe, sthe;
/* x y z */
diff.x = p2->p.x - p1->p.x;
diff.y = p2->p.y - p1->p.y;
diff.z = p2->p.z - p1->p.z;
dpt->dx = dot(&p1->n, &diff);
dpt->dy = dot(&p1->o, &diff);
dpt->dz = dot(&p1->a, &diff);
/* psi */
n1 = dot(&p1->o, &p2->a);
n2 = dot(&p1->n, &p2->a);
if (FABS(n1) < SMALL && FABS(n2) < SMALL) {
lpsi = dpt->dpsi = 0.;
}
else {
lpsi = dpt->dpsi = atan2(n1, n2);
}
/* theta */
y = sqrt(n2 * n2 + n1 * n1);
x = dot(&p1->a, &p2->a);
if (y < SMALL && FABS(x) < SMALL) {
lthe = dpt->dthe = 0.;
}
else {
lthe = dpt->dthe = atan2(y, x);
}
/* phi */
SINCOS(spsi, cpsi, lpsi);
SINCOS(sthe, cthe, lthe);
vthe = 1. - cthe;
n1 = - spsi * cpsi * vthe;
n2 = cpsi * cpsi * vthe + cthe;
n3 = - spsi * sthe;
y = n1 * dot(&p1->n, &p2->n) +
n2 * dot(&p1->o, &p2->n) +
n3 * dot(&p1->a, &p2->n);
x = n1 * dot(&p1->n, &p2->o) +
n2 * dot(&p1->o, &p2->o) +
n3 * dot(&p1->a, &p2->o);
if (FABS(y) < SMALL && FABS(x) < SMALL) {
dpt->dphi = 0.;
}
else {
dpt->dphi = atan2(y, x);
}
}
/*
* drive function : computes the drive transform given the drive parameters
*/
drivefn_n(t, d) /*::*/
register TRSF_PTR t;
register DRVP_PTR d;
{
real sphi, cphi, spsi, cpsi, sthe, cthe, vthe, loc;
t->p.x = d->dx;
t->p.y = d->dy;
t->p.z = d->dz;
SINCOS(sphi, cphi, d->dphi);
SINCOS(spsi, cpsi, d->dpsi);
SINCOS(sthe, cthe, d->dthe);
vthe = 1. - cthe;
t->a.x = cpsi * sthe;
t->a.y = spsi * sthe;
t->a.z = cthe;
t->o.x = - sphi * (spsi * spsi * vthe + cthe)
+ cphi * (loc = - spsi * cpsi * vthe);
t->o.y = - sphi * (loc) + cphi * (cpsi * cpsi * vthe + cthe);
t->o.z = sphi * cpsi * sthe - cphi * spsi * sthe;
Cross(&t->n, &t->o, &t->a);
}