home *** CD-ROM | disk | FTP | other *** search
-
- /**********************************************************
-
- Relative position module. This is used for patterns:
- when an object intersection is found, its location is
- passed to one of these routines, which returns two
- object-relative coordinates.
-
- **********************************************************/
-
-
- #include "qrt.h"
-
- /* #define RELPOSDEBUG 1 */
-
- /**********************************************************
-
- Finds relative coords on plane given position in space.
- object should be parallelogram or ring.
- loc is point in space.
- pos1, pos2 are set to relative coords.
-
- **********************************************************/
-
- Plane_Pos(obj,loc,pos1,pos2)
- OBJ_PTR obj;
- VECT_PTR loc;
- float *pos1, *pos2;
- {
- VECTOR delta;
- register float len1, len2;
-
- # ifdef ROBUST
- if (!((obj->type == RING) ||
- (obj->type == PARALLELOGRAM) ||
- (obj->type == RING) ||
- (obj->type == TRIANGLE)))
- Error(INTERNAL_ERROR,701);
- # endif
-
- VecSubtract(&delta,loc,&(obj->loc));
-
- len1 = sqrt(DotProd(obj->vect1,obj->vect1));
- len2 = sqrt(DotProd(obj->vect2,obj->vect2));
-
- *pos1 = DotProd(delta,obj->vect1)/len1;
- *pos2 = DotProd(delta,obj->vect2)/len2;
-
- # ifdef RELPOSDEBUG
- printf("PLANEPOS: len1,2 = %f %f\n",len1,len2);
- printf(" pos1,2 = %f %f\n",*pos1,*pos2);
- # endif
-
- }
-
-
- /**********************************************************
-
- Finds relative coords on sphere given position in space
- obj->vect1.x = radius of sphere
-
- **********************************************************/
-
- Sphere_Pos(obj,loc,pos1,pos2)
- OBJ_PTR obj;
- VECT_PTR loc;
- float *pos1, *pos2;
- {
- float atan2w();
- VECTOR delta;
-
- # ifdef ROBUST
- if (obj->type!=SPHERE) Error(INTERNAL_ERROR,702);
- # endif
-
- VecSubtract(&delta,loc,&(obj->loc));
-
- # ifdef ROBUST
- if (delta.x==0 && delta.y==0 && delta.z==0)
- Error(INTERNAL_ERROR,703);
- # endif
-
- *pos1 = atan2w(delta.x,delta.y) * obj->vect1.x;
- *pos2 = atan2w(sqrt(sqr(delta.x)+sqr(delta.y)),delta.z) *
- obj->vect1.x;
-
- # ifdef RELPOSDEBUG
- printf("SPHEREPOS: pos1,2 = %f %f\n",*pos1,*pos2);
- # endif
-
- }
-
-
- /**********************************************************
-
- Finds relative coords on quadratic given position in space
-
- **********************************************************/
-
- Quadratic_Pos(obj,loc,pos1,pos2)
- OBJ_PTR obj;
- VECT_PTR loc;
- float *pos1, *pos2;
- {
- VECTOR newpos;
-
- VecSubtract(&newpos,loc,&(obj->loc));
-
- *pos1 = newpos.x; /** This isn't right! **/
- *pos2 = newpos.y; /** fix it later **/
-
- # ifdef RELPOSDEBUG
- printf("QUADRATICPOS: pos1,2 = %f %f\n",*pos1,*pos2);
- # endif
- }
-
-
-