82 lines
2.4 KiB
C
82 lines
2.4 KiB
C
#include "SND\snddef.h"
|
|
|
|
#include "SNDinc.h"
|
|
#include "SND.h"
|
|
|
|
#include "sndvect.h"
|
|
|
|
/*
|
|
//////////////////////////////////////////////////////
|
|
// SNDVECT.CXX - Librairie SOUNDxd version 2.0 //
|
|
//////////////////////////////////////////////////////
|
|
// Definitions des fonctions de gestion //
|
|
// des vecteurs spatiaux //
|
|
//////////////////////////////////////////////////////
|
|
*/
|
|
|
|
SndReal SND_CALL SND_fn_rNormeVectorSnd(SndVector *v)
|
|
{
|
|
long sdc;
|
|
|
|
sdc=(v->x>>8)*(v->x>>8)+(v->y>>8)*(v->y>>8)+(v->z>>8)*(v->z>>8);
|
|
|
|
return sdc;
|
|
}
|
|
|
|
/*------------------------------------------------------------------*/
|
|
/* calcul_pseudo_d: calcul approximatif de la norme d'un vecteur 2D*/
|
|
/* Entrees:a,b=coordonnees du vecteur*/
|
|
/* Sortie:norme de ce vecteur*/
|
|
/**/
|
|
/*pseudo_d est une approximation de la distance entre les 2 points*/
|
|
/* droites d'equidistance avec O : y=-x/2+1 ou y=-2x+2 (selon le demi-quadrant)*/
|
|
/*------------------------------------------------------------------------*/
|
|
SndReal calcul_pseudo_d(SndReal a,SndReal b)
|
|
{
|
|
SndReal aa,bb;
|
|
aa=abs(a);bb=abs(b);
|
|
|
|
if (aa<bb)
|
|
return (bb+(aa>>1));
|
|
else
|
|
return (aa+(bb>>1));
|
|
}
|
|
|
|
/*-----------------------------------------------------------*/
|
|
/* PseudoNormeVectorSnd:calcul rapide de la norme approvee d'un vecteur 3D*/
|
|
/* Entree:v=vecteur concerne*/
|
|
/* Sortie:norme approchee de ce vecteur*/
|
|
/*-------------------------------------------------------------*/
|
|
SndReal SND_CALL SND_fn_rPseudoNormeVectorSnd(SndVector *v)
|
|
{
|
|
SndReal dx,dy,dz;
|
|
|
|
dx=abs(v->x);
|
|
dy=abs(v->y);
|
|
dz=abs(v->z);
|
|
|
|
return calcul_pseudo_d(calcul_pseudo_d(dx,dy),dz);
|
|
}
|
|
|
|
SndReal SND_CALL SND_fn_rScalaireVectorSnd(SndVector *v1,SndVector *v2)
|
|
{
|
|
return (SND_fn_rMulRealRealSnd(v1->x,v2->x)
|
|
+SND_fn_rMulRealRealSnd(v1->y,v2->y)
|
|
+SND_fn_rMulRealRealSnd(v1->z,v2->z));
|
|
}
|
|
|
|
SndReal SND_CALL SND_fn_rPseudoScalaireNormeVectorSnd(SndVector *v1,SndVector *v2)
|
|
{
|
|
return (SND_fn_rMulRealRealQuickSnd(v1->x,v2->x)
|
|
+SND_fn_rMulRealRealQuickSnd(v1->y,v2->y)
|
|
+SND_fn_rMulRealRealQuickSnd(v1->z,v2->z));
|
|
}
|
|
|
|
void SND_CALL SND_fn_vProduitVectorSnd(SndVector *v1,SndVector *v2,SndVector *v)
|
|
{
|
|
v->x=SND_fn_rMulRealRealSnd(v1->y,v2->z)-SND_fn_rMulRealRealSnd(v1->z,v2->y);
|
|
v->y=SND_fn_rMulRealRealSnd(v1->z,v2->x)-SND_fn_rMulRealRealSnd(v1->x,v2->z);
|
|
v->z=SND_fn_rMulRealRealSnd(v1->x,v2->y)-SND_fn_rMulRealRealSnd(v1->y,v2->x);
|
|
}
|
|
|