BWAPI
SPAR/AIModule/BWTA/vendors/CGAL/CGAL/determinant.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines