home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
applications
/
xlispstat
/
src
/
src2.lzh
/
XLisp-Stat
/
makerotation.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-10-02
|
2KB
|
72 lines
/* makerotation - Construct rotation from x to y by alpha. */
/* XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
/* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
/* You may give out copies of this software; for conditions see the */
/* file COPYING included with this distribution. */
#include "xlisp.h"
#include "osdef.h"
#ifdef ANSI
#include "xlsproto.h"
#else
#include "xlsfun.h"
#endif ANSI
#ifdef ANSI
double inner_product(int,RVector,RVector);
#else
double inner_product();
#endif ANSI
static double inner_product(n, x, y)
int n;
RVector x, y;
{
double result = 0.0;
for (; n > 0; n--, x++, y++) result += *x * *y;
return(result);
}
#define NORM(n, x) (sqrt(inner_product(n, x, x)))
void make_rotation(n, rot, x, y, use_alpha, alpha)
int n, use_alpha;
RMatrix rot;
RVector x, y;
double alpha;
{
double nx, ny, xy, c, s;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) rot[i][j] = 0.0;
rot[i][i] = 1.0;
}
nx = NORM(n, x);
ny = NORM(n, y);
if (nx == 0.0 || ny == 0.0) return;
for (i = 0; i < n; i++) x[i] /= nx;
for (i = 0; i < n; i++) y[i] /= ny;
xy = inner_product(n, x, y);
c = (use_alpha) ? cos(alpha) : xy;
s = (use_alpha) ? sin(alpha) : sqrt(1 - c * c);
for (i = 0; i < n; i++) y[i] -= xy * x[i];
ny = NORM(n, y);
if (ny == 0.0) return;
for (i = 0; i < n; i++) y[i] /= ny;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
rot[i][j] = x[j] * ( x[i] * (c - 1.0) + y[i] * s)
+ y[j] * (- x[i] * s + y[i] * (c - 1.0));
rot[i][i] += 1.0;
}
}