Main Page Class Hierarchy Compound List File List Compound Members File Members

MatUtil.cc

Go to the documentation of this file.
00001 /*
00002 File: MatUtil.cc
00003 
00004 Function: Provides useful matrix utilities
00005 
00006 Author: Andrew Willmott
00007 
00008 Notes: 
00009 */
00010 
00011 #include "gcl/MatUtil.h"
00012 
00013 // --- image/matrix routines --------------------------------------------------
00014 
00015  Void ImageToMat(const Image &img, Matf &mat, ImgChannel chn)
00016 {
00017 Int i;
00018 
00019 mat.SetSize(img.Height(), img.Width());
00020 
00021 for (i = 0; i < mat.Rows(); i++)
00022 img.GetRealSpan(i, 0, mat.Cols(), mat[i].Ref(), chn);
00023 }
00024 
00025  Void MatToImage(const Matf &mat, Image &img, ImgChannel chn)
00026 {
00027 Int i;
00028 
00029 if (img.Height() != mat.Rows() || img.Width() != mat.Cols())
00030 img.SetSize(mat.Cols(), mat.Rows());
00031 
00032 for (i = 0; i < mat.Rows(); i++)
00033 img.SetRealSpan(i, 0, mat.Cols(), mat[i].Ref(), chn);
00034 }
00035 
00036  Void MakeAbs(Matf &mat)
00037 {
00038 Int i, j;
00039 
00040 for (i = 0; i < mat.Rows(); i++)
00041 for (j = 0; j < mat.Cols(); j++)
00042 mat[i][j] = abs(mat[i][j]);
00043 }
00044 
00045  Void ClipToZeroOne(Matf &mat)
00046 {
00047 Int i, j;
00048 
00049 for (i = 0; i < mat.Rows(); i++)
00050 for (j = 0; j < mat.Cols(); j++)
00051 if (mat[i][j] < 0.0)
00052 mat[i][j] = 0.0;
00053 else if (mat[i][j] > 1.0)
00054 mat[i][j] = 1.0;
00055 }
00056 
00057  Void MakeRandomRotation(Vector x, Mat3d &M)
00059 {
00060 Double a, b, c, d, s;
00061 Double z, r, theta, omega; 
00062 Double bb, cc, dd;
00063 Double ab, ac, ad;
00064 Double bc, bd, cd;
00065 
00066 /* Use the random variables x[0] and x[1] to determine the axis of */
00067 /* rotation in cylindrical coordinates and the random variable x[2] */
00068 /* to determine the amount of rotation, omega, about this axis. */
00069 
00070 z = x[0];
00071 r = sqrt(1.0 - z * z);
00072 theta = 2.0 * vl_pi * x[1];
00073 omega = vl_pi * x[2];
00074 
00075 /* Compute the unit quaternion (a,b,c,d) where a is the cosine of */
00076 /* half the rotation angle and the axis vector (b,c,d) is determined */
00077 /* by "r", "theta" and "z" computed above. */
00078 
00079 s = sin(omega);
00080 a = cos(omega);
00081 b = s * cos(theta) * r;
00082 c = s * sin(theta) * r;
00083 d = s * z;
00084 
00085 /* Compute all the pairwise products of a, b, c, and d, except a * a. */
00086 
00087 bb = b * b; cc = c * c; dd = d * d;
00088 ab = a * b; ac = a * c; ad = a * d;
00089 bc = b * c; bd = b * d; cd = c * d;
00090 
00091 /* Construct an orthogonal matrix corresponding to */
00092 /* the unit quaternion (a,b,c,d). */
00093 
00094 M[0][0] = 1.0 - 2.0 * (cc + dd);
00095 M[0][1] = 2.0 * (bc + ad);
00096 M[0][2] = 2.0 * (bd - ac);
00097 
00098 M[1][0] = 2.0 * (bc - ad);
00099 M[1][1] = 1.0 - 2.0 * (bb + dd);
00100 M[1][2] = 2.0 * (cd + ab);
00101 
00102 M[2][0] = 2.0 * (bd + ac);
00103 M[2][1] = 2.0 * (cd - ab);
00104 M[2][2] = 1.0 - 2.0 * (bb + cc);
00105 }

Generated at Sat Aug 5 00:17:00 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /