matrix3d.c

来自「开发linux应用-用gtk+和gdk开发linux图形用户界面应用--的实例」· C语言 代码 · 共 322 行

C
322
字号
/* * File: matrix3d.c * Auth: Eric Harlow *  * Converted from a Java Matrix 3d class file. */#include "atom.h"#include "matrix3d.h"#include <math.h>static double pi = 3.14159265;/* * NewMatrix3D * * Create a new matrix */typMatrix3D *NewMatrix3D () {    typMatrix3D *mat;    mat = (typMatrix3D *) g_malloc (sizeof (typMatrix3D));    unit (mat);        return (mat);}/* * scale * * Scale the object */void scale (typMatrix3D *mat, double f) {    mat->xx *= f;    mat->xy *= f;    mat->xz *= f;    mat->xo *= f;    mat->yx *= f;    mat->yy *= f;    mat->yz *= f;    mat->yo *= f;    mat->zx *= f;    mat->zy *= f;    mat->zz *= f;    mat->zo *= f;}/* * scale3 * * Scale each direction by a different factor */void scale3 (typMatrix3D *mat, double xf, double yf, double zf) {    mat->xx *= xf;    mat->xy *= xf;    mat->xz *= xf;    mat->xo *= xf;    mat->yx *= yf;    mat->yy *= yf;    mat->yz *= yf;    mat->yo *= yf;    mat->zx *= zf;    mat->zy *= zf;    mat->zz *= zf;    mat->zo *= zf;}/* * translate * * Translate the point represented by the matrix by (x, y, z) */void translate (typMatrix3D *mat, double x, double y, double z) {    mat->xo += x;    mat->yo += y;    mat->zo += z;}/* * yrot * * Add in a y rotation of angle (theta) to the matrix. */void yrot (typMatrix3D *mat, double theta) {    double ct;    double st;    double Nxx;    double Nxy;    double Nxz;    double Nxo;    double Nzx;    double Nzy;    double Nzz;    double Nzo;    theta *= (pi / 180);    ct = cos (theta);    st = sin (theta);    Nxx = (double) (mat->xx * ct + mat->zx * st);    Nxy = (double) (mat->xy * ct + mat->zy * st);    Nxz = (double) (mat->xz * ct + mat->zz * st);    Nxo = (double) (mat->xo * ct + mat->zo * st);    Nzx = (double) (mat->zx * ct - mat->xx * st);    Nzy = (double) (mat->zy * ct - mat->xy * st);    Nzz = (double) (mat->zz * ct - mat->xz * st);    Nzo = (double) (mat->zo * ct - mat->xo * st);    mat->xo = Nxo;    mat->xx = Nxx;    mat->xy = Nxy;    mat->xz = Nxz;    mat->zo = Nzo;    mat->zx = Nzx;    mat->zy = Nzy;    mat->zz = Nzz;}/* * xrot * * Add in a x rotation of angle (theta) to the matrix. */void xrot (typMatrix3D *mat, double theta) {    double ct;    double st;    double Nyx;    double Nyy;    double Nyz;    double Nyo;    double Nzx;    double Nzy;    double Nzz;    double Nzo;    theta *= (pi / 180);    ct = cos (theta);    st = sin (theta);    Nyx = (double) (mat->yx * ct + mat->zx * st);    Nyy = (double) (mat->yy * ct + mat->zy * st);    Nyz = (double) (mat->yz * ct + mat->zz * st);    Nyo = (double) (mat->yo * ct + mat->zo * st);    Nzx = (double) (mat->zx * ct - mat->yx * st);    Nzy = (double) (mat->zy * ct - mat->yy * st);    Nzz = (double) (mat->zz * ct - mat->yz * st);    Nzo = (double) (mat->zo * ct - mat->yo * st);    mat->yo = Nyo;    mat->yx = Nyx;    mat->yy = Nyy;    mat->yz = Nyz;    mat->zo = Nzo;    mat->zx = Nzx;    mat->zy = Nzy;    mat->zz = Nzz;}/* * zrot * * Add in a z rotation of angle (theta) to the matrix. */void zrot (typMatrix3D *mat, double theta) {    double ct;    double st;    double Nyx;    double Nyy;    double Nyz;    double Nyo;    double Nxx;    double Nxy;    double Nxz;    double Nxo;     theta *= (pi / 180);    ct = cos(theta);    st = sin(theta);    Nyx = (double) (mat->yx * ct + mat->xx * st);    Nyy = (double) (mat->yy * ct + mat->xy * st);    Nyz = (double) (mat->yz * ct + mat->xz * st);    Nyo = (double) (mat->yo * ct + mat->xo * st);    Nxx = (double) (mat->xx * ct - mat->yx * st);    Nxy = (double) (mat->xy * ct - mat->yy * st);    Nxz = (double) (mat->xz * ct - mat->yz * st);    Nxo = (double) (mat->xo * ct - mat->yo * st);    mat->yo = Nyo;    mat->yx = Nyx;    mat->yy = Nyy;    mat->yz = Nyz;    mat->xo = Nxo;    mat->xx = Nxx;    mat->xy = Nxy;    mat->xz = Nxz;}/* * mult * * Multiply the first matrix by the second matrix. * The first matrix has the new value. */void mult (typMatrix3D *mat, typMatrix3D *rhs) {    double lxx = mat->xx * rhs->xx +                  mat->yx * rhs->xy +                  mat->zx * rhs->xz;    double lxy = mat->xy * rhs->xx +                  mat->yy * rhs->xy +                  mat->zy * rhs->xz;    double lxz = mat->xz * rhs->xx +                  mat->yz * rhs->xy +                  mat->zz * rhs->xz;    double lxo = mat->xo * rhs->xx +                  mat->yo * rhs->xy +                  mat->zo * rhs->xz + rhs->xo;    double lyx = mat->xx * rhs->yx +                  mat->yx * rhs->yy +                  mat->zx * rhs->yz;    double lyy = mat->xy * rhs->yx +                  mat->yy * rhs->yy +                  mat->zy * rhs->yz;    double lyz = mat->xz * rhs->yx +                  mat->yz * rhs->yy +                  mat->zz * rhs->yz;    double lyo = mat->xo * rhs->yx +                  mat->yo * rhs->yy +                  mat->zo * rhs->yz + rhs->yo;    double lzx = mat->xx * rhs->zx +                  mat->yx * rhs->zy +                  mat->zx * rhs->zz;    double lzy = mat->xy * rhs->zx +                  mat->yy * rhs->zy +                  mat->zy * rhs->zz;    double lzz = mat->xz * rhs->zx +                  mat->yz * rhs->zy +                  mat->zz * rhs->zz;    double lzo = mat->xo * rhs->zx +                  mat->yo * rhs->zy +                  mat->zo * rhs->zz + rhs->zo;    mat->xx = lxx;    mat->xy = lxy;    mat->xz = lxz;    mat->xo = lxo;    mat->yx = lyx;    mat->yy = lyy;    mat->yz = lyz;    mat->yo = lyo;    mat->zx = lzx;    mat->zy = lzy;    mat->zz = lzz;    mat->zo = lzo;}/* * unit * * Make the matrix be a unit matrix */void unit (typMatrix3D *mat) {    mat->xo = 0;    mat->xx = 1;    mat->xy = 0;    mat->xz = 0;    mat->yo = 0;    mat->yx = 0;    mat->yy = 1;    mat->yz = 0;    mat->zo = 0;    mat->zx = 0;    mat->zy = 0;    mat->zz = 1;}/* * Transform  * * Translate the atom's coordinates into the tranlated  * coordinates. */void Transform (typMatrix3D *mat, typAtom *atom){    double lxx = mat->xx, lxy = mat->xy, lxz = mat->xz, lxo = mat->xo;    double lyx = mat->yx, lyy = mat->yy, lyz = mat->yz, lyo = mat->yo;    double lzx = mat->zx, lzy = mat->zy, lzz = mat->zz, lzo = mat->zo;    double x = atom->x;    double y = atom->y;    double z = atom->z;    atom->tx = (x * lxx + y * lxy + z * lxz + lxo);    atom->ty = (x * lyx + y * lyy + z * lyz + lyo);    atom->tz = (x * lzx + y * lzy + z * lzz + lzo);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?