contrib/champ/chiral.c (67 lines of code) (raw):
#include"os_std.h"
#include"sort.h"
#include"chiral.h"
static int chirality_lookup[256];
#define chi(a,b,c,d) (0xFF&(a<<6|b<<4|c<<2|d))
void ChiralInit(void)
{
int a;
for(a=0;a<256;a++) {
chirality_lookup[a]=0;
}
/* these orderings have input chirality
(equivalent to 0,1,2,3) */
chirality_lookup[chi(0,1,2,3)]=1;
chirality_lookup[chi(0,2,3,1)]=1;
chirality_lookup[chi(0,3,1,2)]=1;
chirality_lookup[chi(1,0,3,2)]=1;
chirality_lookup[chi(1,3,2,0)]=1;
chirality_lookup[chi(1,2,0,3)]=1;
chirality_lookup[chi(2,0,1,3)]=1;
chirality_lookup[chi(2,1,3,0)]=1;
chirality_lookup[chi(2,3,0,1)]=1;
chirality_lookup[chi(3,2,1,0)]=1;
chirality_lookup[chi(3,1,0,2)]=1;
chirality_lookup[chi(3,0,2,1)]=1;
/* these orderings have reverse chirality
(opposite to 0,1,3,2) */
chirality_lookup[chi(0,1,3,2)]=-1;
chirality_lookup[chi(0,2,1,3)]=-1;
chirality_lookup[chi(0,3,2,1)]=-1;
chirality_lookup[chi(1,0,2,3)]=-1;
chirality_lookup[chi(1,3,0,2)]=-1;
chirality_lookup[chi(1,2,3,0)]=-1;
chirality_lookup[chi(2,0,3,1)]=-1;
chirality_lookup[chi(2,1,0,3)]=-1;
chirality_lookup[chi(2,3,1,0)]=-1;
chirality_lookup[chi(3,2,0,1)]=-1;
chirality_lookup[chi(3,1,2,0)]=-1;
chirality_lookup[chi(3,0,1,2)]=-1;
}
int ChiralHandedness(int *a)
{
int idx[4],ord[4];
int result;
SortIntIndex(4,a,idx);
ord[idx[0]]=0;
ord[idx[1]]=1;
ord[idx[2]]=2;
ord[idx[3]]=3;
result = chirality_lookup[chi(ord[0],ord[1],ord[2],ord[3])];
/* printf("%d %d %d %d => %d\n",ord[0],ord[1],ord[2],ord[3],result);*/
return(result);
}
#if 0
main()
{
int a;
int val[][4] = {
{1,10,50,60},
{2,9,6,12},
{12,1,2,7},
{2,10,6,9},
{1,12,6,3},
};
ChiralInit();
for(a=0;a<5;a++) {
printf("%d %d %d %d => %d\n\n",
val[a][0],val[a][1],val[a][2],val[a][3],
ChiralHandedness(val[a]));
}
}
#endif