![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /*=========================================================================
00002 Original version -- Copyright (c) 2006 Sandia Corporation.
00003 All rights reserved.
00004 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00005
00006 This software is distributed WITHOUT ANY WARRANTY; without even
00007 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00008 PURPOSE. See the above copyright notice for more information.
00009
00010 =========================================================================*/
00011
00012 #ifndef VERDICT_VECTOR
00013 #define VERDICT_VECTOR
00014
00015 #include "moab/verdict.h"
00016 #include
00017 #include
00018
00019 // computes the dot product of 3d vectors
00020 inline double dot_product( double vec1[], double vec2[] )
00021 {
00022 double answer = vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2];
00023 return answer;
00024 }
00025
00026 // normalize a vector
00027 inline void normalize( double vec[] )
00028 {
00029 double x = sqrt( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
00030
00031 vec[0] /= x;
00032 vec[1] /= x;
00033 vec[2] /= x;
00034 }
00035
00036 // computes the cross product
00037 inline double* cross_product( double vec1[], double vec2[], double answer[] )
00038 {
00039 answer[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
00040 answer[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
00041 answer[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
00042 return answer;
00043 }
00044
00045 // computes the length of a vector
00046 inline double length( double vec[] )
00047 {
00048 return sqrt( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
00049 }
00050
00051 // computes the square length of a vector
00052 inline double length_squared( double vec[] )
00053 {
00054 return ( vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2] );
00055 }
00056
00057 // computes the interior angle between 2 vectors in degrees
00058 inline double interior_angle( double vec1[], double vec2[] )
00059 {
00060 double cosAngle, angleRad;
00061 double length1 = length( vec1 );
00062 double length2 = length( vec2 );
00063 assert( ( length1 > 0.0 && length2 > 0.0 ) );
00064
00065 cosAngle = dot_product( vec1, vec2 ) / ( length1 * length2 );
00066
00067 if( ( cosAngle > 1.0 ) && ( cosAngle < 1.0001 ) )
00068 {
00069 cosAngle = 1.0;
00070 }
00071 else if( cosAngle < -1.0 && cosAngle > -1.0001 )
00072 {
00073 cosAngle = -1.0;
00074 }
00075 else
00076 {
00077 assert( cosAngle < 1.0001 && cosAngle > -1.0001 );
00078 }
00079
00080 angleRad = acos( cosAngle );
00081 return ( ( angleRad * 180. ) / VERDICT_PI );
00082 }
00083
00084 #endif