BWAPI
|
00001 // Copyright (c) 1999 Utrecht University (The Netherlands), 00002 // ETH Zurich (Switzerland), Freie Universitaet Berlin (Germany), 00003 // INRIA Sophia-Antipolis (France), Martin-Luther-University Halle-Wittenberg 00004 // (Germany), Max-Planck-Institute Saarbruecken (Germany), RISC Linz (Austria), 00005 // and Tel-Aviv University (Israel). All rights reserved. 00006 // 00007 // This file is part of CGAL (www.cgal.org); you can redistribute it and/or 00008 // modify it under the terms of the GNU Lesser General Public License as 00009 // published by the Free Software Foundation; version 2.1 of the License. 00010 // See the file LICENSE.LGPL distributed with CGAL. 00011 // 00012 // Licensees holding a valid commercial license may use this file in 00013 // accordance with the commercial license agreement provided with the software. 00014 // 00015 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00016 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00017 // 00018 // $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.5-branch/Kernel_23/include/CGAL/determinant.h $ 00019 // $Id: determinant.h 42811 2008-04-09 13:35:34Z spion $ 00020 // 00021 // 00022 // Author(s) : Sylvain Pion 00023 // Stefan Schirra 00024 00025 #ifndef CGAL_DETERMINANT_H 00026 #define CGAL_DETERMINANT_H 00027 00028 CGAL_BEGIN_NAMESPACE 00029 00030 template <class RT> 00031 inline 00032 RT 00033 determinant( 00034 const RT& a00, const RT& a01, 00035 const RT& a10, const RT& a11) 00036 { 00037 // First compute the det2x2 00038 const RT m01 = a00*a11 - a10*a01; 00039 return m01; 00040 } 00041 00042 template <class RT> 00043 CGAL_KERNEL_MEDIUM_INLINE 00044 RT 00045 determinant( 00046 const RT& a00, const RT& a01, const RT& a02, 00047 const RT& a10, const RT& a11, const RT& a12, 00048 const RT& a20, const RT& a21, const RT& a22) 00049 { 00050 // First compute the det2x2 00051 const RT m01 = a00*a11 - a10*a01; 00052 const RT m02 = a00*a21 - a20*a01; 00053 const RT m12 = a10*a21 - a20*a11; 00054 // Now compute the minors of rank 3 00055 const RT m012 = m01*a22 - m02*a12 + m12*a02; 00056 return m012; 00057 } 00058 00059 template <class RT> 00060 CGAL_KERNEL_LARGE_INLINE 00061 RT 00062 determinant( 00063 const RT& a00, const RT& a01, const RT& a02, const RT& a03, 00064 const RT& a10, const RT& a11, const RT& a12, const RT& a13, 00065 const RT& a20, const RT& a21, const RT& a22, const RT& a23, 00066 const RT& a30, const RT& a31, const RT& a32, const RT& a33) 00067 { 00068 // First compute the det2x2 00069 const RT m01 = a10*a01 - a00*a11; 00070 const RT m02 = a20*a01 - a00*a21; 00071 const RT m03 = a30*a01 - a00*a31; 00072 const RT m12 = a20*a11 - a10*a21; 00073 const RT m13 = a30*a11 - a10*a31; 00074 const RT m23 = a30*a21 - a20*a31; 00075 // Now compute the minors of rank 3 00076 const RT m012 = m12*a02 - m02*a12 + m01*a22; 00077 const RT m013 = m13*a02 - m03*a12 + m01*a32; 00078 const RT m023 = m23*a02 - m03*a22 + m02*a32; 00079 const RT m123 = m23*a12 - m13*a22 + m12*a32; 00080 // Now compute the minors of rank 4 00081 const RT m0123 = m123*a03 - m023*a13 + m013*a23 - m012*a33; 00082 return m0123; 00083 } 00084 00085 template <class RT> 00086 CGAL_KERNEL_LARGE_INLINE 00087 RT 00088 determinant( 00089 const RT& a00, const RT& a01, const RT& a02, const RT& a03, const RT& a04, 00090 const RT& a10, const RT& a11, const RT& a12, const RT& a13, const RT& a14, 00091 const RT& a20, const RT& a21, const RT& a22, const RT& a23, const RT& a24, 00092 const RT& a30, const RT& a31, const RT& a32, const RT& a33, const RT& a34, 00093 const RT& a40, const RT& a41, const RT& a42, const RT& a43, const RT& a44) 00094 { 00095 // First compute the det2x2 00096 const RT m01 = a10*a01 - a00*a11; 00097 const RT m02 = a20*a01 - a00*a21; 00098 const RT m03 = a30*a01 - a00*a31; 00099 const RT m04 = a40*a01 - a00*a41; 00100 const RT m12 = a20*a11 - a10*a21; 00101 const RT m13 = a30*a11 - a10*a31; 00102 const RT m14 = a40*a11 - a10*a41; 00103 const RT m23 = a30*a21 - a20*a31; 00104 const RT m24 = a40*a21 - a20*a41; 00105 const RT m34 = a40*a31 - a30*a41; 00106 // Now compute the minors of rank 3 00107 const RT m012 = m12*a02 - m02*a12 + m01*a22; 00108 const RT m013 = m13*a02 - m03*a12 + m01*a32; 00109 const RT m014 = m14*a02 - m04*a12 + m01*a42; 00110 const RT m023 = m23*a02 - m03*a22 + m02*a32; 00111 const RT m024 = m24*a02 - m04*a22 + m02*a42; 00112 const RT m034 = m34*a02 - m04*a32 + m03*a42; 00113 const RT m123 = m23*a12 - m13*a22 + m12*a32; 00114 const RT m124 = m24*a12 - m14*a22 + m12*a42; 00115 const RT m134 = m34*a12 - m14*a32 + m13*a42; 00116 const RT m234 = m34*a22 - m24*a32 + m23*a42; 00117 // Now compute the minors of rank 4 00118 const RT m0123 = m123*a03 - m023*a13 + m013*a23 - m012*a33; 00119 const RT m0124 = m124*a03 - m024*a13 + m014*a23 - m012*a43; 00120 const RT m0134 = m134*a03 - m034*a13 + m014*a33 - m013*a43; 00121 const RT m0234 = m234*a03 - m034*a23 + m024*a33 - m023*a43; 00122 const RT m1234 = m234*a13 - m134*a23 + m124*a33 - m123*a43; 00123 // Now compute the minors of rank 5 00124 const RT m01234 = m1234*a04 - m0234*a14 + m0134*a24 - m0124*a34 + m0123*a44; 00125 return m01234; 00126 } 00127 00128 template <class RT> 00129 RT 00130 determinant( 00131 const RT& a00, const RT& a01, const RT& a02, const RT& a03, const RT& a04, 00132 const RT& a05, 00133 const RT& a10, const RT& a11, const RT& a12, const RT& a13, const RT& a14, 00134 const RT& a15, 00135 const RT& a20, const RT& a21, const RT& a22, const RT& a23, const RT& a24, 00136 const RT& a25, 00137 const RT& a30, const RT& a31, const RT& a32, const RT& a33, const RT& a34, 00138 const RT& a35, 00139 const RT& a40, const RT& a41, const RT& a42, const RT& a43, const RT& a44, 00140 const RT& a45, 00141 const RT& a50, const RT& a51, const RT& a52, const RT& a53, const RT& a54, 00142 const RT& a55) 00143 { 00144 // First compute the det2x2 00145 const RT m01 = a00*a11 - a10*a01; 00146 const RT m02 = a00*a21 - a20*a01; 00147 const RT m03 = a00*a31 - a30*a01; 00148 const RT m04 = a00*a41 - a40*a01; 00149 const RT m05 = a00*a51 - a50*a01; 00150 const RT m12 = a10*a21 - a20*a11; 00151 const RT m13 = a10*a31 - a30*a11; 00152 const RT m14 = a10*a41 - a40*a11; 00153 const RT m15 = a10*a51 - a50*a11; 00154 const RT m23 = a20*a31 - a30*a21; 00155 const RT m24 = a20*a41 - a40*a21; 00156 const RT m25 = a20*a51 - a50*a21; 00157 const RT m34 = a30*a41 - a40*a31; 00158 const RT m35 = a30*a51 - a50*a31; 00159 const RT m45 = a40*a51 - a50*a41; 00160 // Now compute the minors of rank 3 00161 const RT m012 = m01*a22 - m02*a12 + m12*a02; 00162 const RT m013 = m01*a32 - m03*a12 + m13*a02; 00163 const RT m014 = m01*a42 - m04*a12 + m14*a02; 00164 const RT m015 = m01*a52 - m05*a12 + m15*a02; 00165 const RT m023 = m02*a32 - m03*a22 + m23*a02; 00166 const RT m024 = m02*a42 - m04*a22 + m24*a02; 00167 const RT m025 = m02*a52 - m05*a22 + m25*a02; 00168 const RT m034 = m03*a42 - m04*a32 + m34*a02; 00169 const RT m035 = m03*a52 - m05*a32 + m35*a02; 00170 const RT m045 = m04*a52 - m05*a42 + m45*a02; 00171 const RT m123 = m12*a32 - m13*a22 + m23*a12; 00172 const RT m124 = m12*a42 - m14*a22 + m24*a12; 00173 const RT m125 = m12*a52 - m15*a22 + m25*a12; 00174 const RT m134 = m13*a42 - m14*a32 + m34*a12; 00175 const RT m135 = m13*a52 - m15*a32 + m35*a12; 00176 const RT m145 = m14*a52 - m15*a42 + m45*a12; 00177 const RT m234 = m23*a42 - m24*a32 + m34*a22; 00178 const RT m235 = m23*a52 - m25*a32 + m35*a22; 00179 const RT m245 = m24*a52 - m25*a42 + m45*a22; 00180 const RT m345 = m34*a52 - m35*a42 + m45*a32; 00181 // Now compute the minors of rank 4 00182 const RT m0123 = m012*a33 - m013*a23 + m023*a13 - m123*a03; 00183 const RT m0124 = m012*a43 - m014*a23 + m024*a13 - m124*a03; 00184 const RT m0125 = m012*a53 - m015*a23 + m025*a13 - m125*a03; 00185 const RT m0134 = m013*a43 - m014*a33 + m034*a13 - m134*a03; 00186 const RT m0135 = m013*a53 - m015*a33 + m035*a13 - m135*a03; 00187 const RT m0145 = m014*a53 - m015*a43 + m045*a13 - m145*a03; 00188 const RT m0234 = m023*a43 - m024*a33 + m034*a23 - m234*a03; 00189 const RT m0235 = m023*a53 - m025*a33 + m035*a23 - m235*a03; 00190 const RT m0245 = m024*a53 - m025*a43 + m045*a23 - m245*a03; 00191 const RT m0345 = m034*a53 - m035*a43 + m045*a33 - m345*a03; 00192 const RT m1234 = m123*a43 - m124*a33 + m134*a23 - m234*a13; 00193 const RT m1235 = m123*a53 - m125*a33 + m135*a23 - m235*a13; 00194 const RT m1245 = m124*a53 - m125*a43 + m145*a23 - m245*a13; 00195 const RT m1345 = m134*a53 - m135*a43 + m145*a33 - m345*a13; 00196 const RT m2345 = m234*a53 - m235*a43 + m245*a33 - m345*a23; 00197 // Now compute the minors of rank 5 00198 const RT m01234 = m0123*a44 - m0124*a34 + m0134*a24 - m0234*a14 + m1234*a04; 00199 const RT m01235 = m0123*a54 - m0125*a34 + m0135*a24 - m0235*a14 + m1235*a04; 00200 const RT m01245 = m0124*a54 - m0125*a44 + m0145*a24 - m0245*a14 + m1245*a04; 00201 const RT m01345 = m0134*a54 - m0135*a44 + m0145*a34 - m0345*a14 + m1345*a04; 00202 const RT m02345 = m0234*a54 - m0235*a44 + m0245*a34 - m0345*a24 + m2345*a04; 00203 const RT m12345 = m1234*a54 - m1235*a44 + m1245*a34 - m1345*a24 + m2345*a14; 00204 // Now compute the minors of rank 6 00205 const RT m012345 = m01234*a55 - m01235*a45 + m01245*a35 - m01345*a25 00206 + m02345*a15 - m12345*a05; 00207 return m012345; 00208 } 00209 00210 CGAL_END_NAMESPACE 00211 00212 #endif // CGAL_DETERMINANT_H