diff --git a/Cartesian_kernel/include/CGAL/Cartesian/function_objects.h b/Cartesian_kernel/include/CGAL/Cartesian/function_objects.h index 85f198f3af1..e87523f9281 100644 --- a/Cartesian_kernel/include/CGAL/Cartesian/function_objects.h +++ b/Cartesian_kernel/include/CGAL/Cartesian/function_objects.h @@ -804,6 +804,40 @@ namespace CartesianKernelFunctors { { return t.area(); } }; + template + class Compute_determinant_2 + { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + typedef Arity_tag< 2 > Arity; + + result_type + operator()(const Vector_2& v, const Vector_2& w) const + { + return det2x2_by_formula(v.x(), v.y(), w.x(), w.y()); + } + }; + + template + class Compute_determinant_3 + { + typedef typename K::FT FT; + typedef typename K::Vector_3 Vector_3; + public: + typedef FT result_type; + typedef Arity_tag< 3 > Arity; + + result_type + operator()(const Vector_3& v, const Vector_3& w, const Vector_3& t) const + { + return det3x3_by_formula(v.x(), v.y(), v.z(), + w.x(), w.y(), w.z(), + t.x(), t.y(), t.z()); + } + }; + template class Compute_scalar_product_2 { diff --git a/Homogeneous_kernel/include/CGAL/Homogeneous/function_objects.h b/Homogeneous_kernel/include/CGAL/Homogeneous/function_objects.h index 130dd846efc..7f6252e356c 100644 --- a/Homogeneous_kernel/include/CGAL/Homogeneous/function_objects.h +++ b/Homogeneous_kernel/include/CGAL/Homogeneous/function_objects.h @@ -1235,6 +1235,42 @@ namespace HomogeneousKernelFunctors { { return t.area(); } }; + template + class Compute_determinant_2 + { + typedef typename K::FT FT; + typedef typename K::Vector_2 Vector_2; + public: + typedef FT result_type; + typedef Arity_tag< 2 > Arity; + + result_type + operator()(const Vector_2& v, const Vector_2& w) const + { + return det2x2_by_formula(v.hx(), v.hy(), + w.hx(), w.hy()) / FT(v.hw() * w.hw()); + } + }; + + template + class Compute_determinant_3 + { + typedef typename K::FT FT; + typedef typename K::Vector_3 Vector_3; + public: + typedef FT result_type; + typedef Arity_tag< 3 > Arity; + + result_type + operator()(const Vector_3& v, const Vector_3& w, const Vector_3& t) const + { + return det3x3_by_formula(v.hx(), v.hy(), v.hz(), + w.hx(), w.hy(), w.hz(), + t.hx(), t.hy(), t.hz()) + / FT(v.hw() * w.hw() * t.hw()); + } + }; + template class Compute_scalar_product_2 { diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_2.tex new file mode 100644 index 00000000000..849672ae161 --- /dev/null +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_2.tex @@ -0,0 +1,17 @@ +\begin{ccRefFunctionObjectConcept}{Kernel::ComputeDeterminant_2} +A model for this must provide: + +\ccCreationVariable{fo} + +\ccMemberFunction{Kernel::FT operator()(const Kernel::Vector_2& v, + const Kernel::Vector_2& w);} + {returns the determinant of the two vectors $v$ and $w$. } + +\ccRefines +AdaptableFunctor (with two arguments) + +\ccSeeAlso +\ccRefIdfierPage{CGAL::Vector_2} \\ +\ccRefIdfierPage{CGAL::determinant} \\ + +\end{ccRefFunctionObjectConcept} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_3.tex new file mode 100644 index 00000000000..51706c70dfc --- /dev/null +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ComputeDeterminant_3.tex @@ -0,0 +1,18 @@ +\begin{ccRefFunctionObjectConcept}{Kernel::ComputeDeterminant_3} +A model for this must provide: + +\ccCreationVariable{fo} + +\ccMemberFunction{Kernel::FT operator()(const Kernel::Vector_2& u, + const Kernel::Vector_2& v, + const Kernel::Vector_2& w);} + {returns the determinant of the three vectors $u$, $v$ and $w$. } + +\ccRefines +AdaptableFunctor (with three arguments) + +\ccSeeAlso +\ccRefIdfierPage{CGAL::Vector_3} \\ +\ccRefIdfierPage{CGAL::determinant} \\ + +\end{ccRefFunctionObjectConcept} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructCrossProductVector_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructCrossProductVector_3.tex index 6fd9417dda4..1bd9ee2fe9f 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructCrossProductVector_3.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructCrossProductVector_3.tex @@ -14,5 +14,6 @@ AdaptableFunctor (with two arguments) \ccSeeAlso \ccRefIdfierPage{CGAL::cross_product}\\ +\ccRefIdfierPage{CGAL::determinant}\\ \end{ccRefFunctionObjectConcept} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDifferenceOfVectors_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDifferenceOfVectors_2.tex index 0265ebc1c33..1b7f2aac70a 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDifferenceOfVectors_2.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDifferenceOfVectors_2.tex @@ -3,13 +3,10 @@ A model for this must provide: \ccCreationVariable{fo} - - \ccMemberFunction{Kernel::Vector_2 operator()(const Kernel::Vector_2 &v1, const Kernel::Vector_2 &v2);} {introduces the vector $v1 - v2$.} - \ccRefines AdaptableFunctor (with two arguments) diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDividedVector_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDividedVector_2.tex index e0ca89eeccb..485dddc1226 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDividedVector_2.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructDividedVector_2.tex @@ -3,8 +3,6 @@ A model for this must provide: \ccCreationVariable{fo} - - \ccMemberFunction{Kernel::Vector_2 operator()(const Kernel::Vector_2 &v, const Kernel::RT s);} {introduces the vector $v/s$.} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructOrthogonalVector_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructOrthogonalVector_3.tex index 7531b229e45..0b41b8ec887 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructOrthogonalVector_3.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructOrthogonalVector_3.tex @@ -19,4 +19,5 @@ AdaptableFunctor (with one argument) \ccSeeAlso \ccRefIdfierPage{CGAL::Plane_3} \\ \ccRefIdfierPage{Kernel::ConstructCrossProductVector_3}\\ + \end{ccRefFunctionObjectConcept} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_2.tex index 734e51c7dee..1876ff96886 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_2.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_2.tex @@ -3,7 +3,6 @@ A model for this must provide: \ccCreationVariable{fo} - \ccMemberFunction{ Kernel::Vector_2 operator()(const Kernel::Vector_2 &v, const Kernel::RT& scale);} @@ -14,7 +13,6 @@ Kernel::Vector_2 operator()(const Kernel::Vector_2 &v, const Kernel::FT& scale);} {produces the vector \ccc{v} scaled by a factor \ccc{scale}.} - \ccRefines AdaptableFunctor (with two arguments) diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_3.tex index e3f8535b134..d96554ab420 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_3.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructScaledVector_3.tex @@ -3,7 +3,6 @@ A model for this must provide: \ccCreationVariable{fo} - \ccMemberFunction{ Kernel::Vector_3 operator()(const Kernel::Vector_3 &v, const Kernel::RT& scale);} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructSumOfVectors_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructSumOfVectors_2.tex index 2015e875334..62bc43aaab9 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructSumOfVectors_2.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_ConstructSumOfVectors_2.tex @@ -3,8 +3,6 @@ A model for this must provide: \ccCreationVariable{fo} - - \ccMemberFunction{Kernel::Vector_2 operator()(const Kernel::Vector_2 &v1, const Kernel::Vector_2 &v2);} {introduces the vector $v1 + v2$.} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_2.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_2.tex index ae2eba13353..9d23b2ab3aa 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_2.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_2.tex @@ -7,6 +7,7 @@ CopyConstructible, Assignable, DefaultConstructible \ccSeeAlso \ccRefIdfierPage{CGAL::Vector_2} \\ +\ccRefConceptPage{Kernel::ComputeDeterminant_2} \\ \ccRefConceptPage{Kernel::ComputeX_2} \\ \ccRefConceptPage{Kernel::ComputeY_2} \\ \ccRefConceptPage{Kernel::ComputeHx_2} \\ diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_3.tex index e404bfa66b9..c4bde6e9c9a 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_3.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Kernel_Vector_3.tex @@ -7,6 +7,7 @@ CopyConstructible, Assignable, DefaultConstructible \ccSeeAlso \ccRefIdfierPage{CGAL::Vector_3} \\ +\ccRefConceptPage{Kernel::ComputeDeterminant_3} \\ \ccRefConceptPage{Kernel::ConstructCrossProductVector_3} \\ \ccRefConceptPage{Kernel::ConstructDirection_3} \\ \ccRefConceptPage{Kernel::ConstructOppositeVector_3} \\ diff --git a/Kernel_23/doc_tex/Kernel_23_ref/Vector_3.tex b/Kernel_23/doc_tex/Kernel_23_ref/Vector_3.tex index 580d3ff5fb2..ed20471d30b 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/Vector_3.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/Vector_3.tex @@ -147,5 +147,6 @@ The following operations can be applied on vectors: \ccSeeAlso \ccRefConceptPage{Kernel::Vector_3} \\ \ccRefIdfierPage{CGAL::cross_product} \\ +\ccRefIdfierPage{CGAL::determinant} \\ \end{ccRefClass} diff --git a/Kernel_23/doc_tex/Kernel_23_ref/determinant.tex b/Kernel_23/doc_tex/Kernel_23_ref/determinant.tex new file mode 100644 index 00000000000..934ed5d2421 --- /dev/null +++ b/Kernel_23/doc_tex/Kernel_23_ref/determinant.tex @@ -0,0 +1,22 @@ +%\ccHtmlNoRefLinks +\begin{ccRefFunction}{determinant} + +\ccHtmlNoLinks +\ccFunction{Kernel::FT determinant(const Vector_2& v, + const Vector_2& w);} +{returns the determinant of $v$ and $w$.} + +\ccHtmlNoLinks +\ccFunction{Kernel::FT determinant(const Vector_3& u, + const Vector_3& v, + const Vector_3& w);} +{returns the determinant of $u$, $v$ and $w$.} + +\ccSeeAlso +\ccRefIdfierPage{CGAL::orientation} +\ccRefIdfierPage{CGAL::collinear} +\ccRefIdfierPage{CGAL::left_turn} +\ccRefIdfierPage{CGAL::right_turn} + +\end{ccRefFunction} + diff --git a/Kernel_23/doc_tex/Kernel_23_ref/main.tex b/Kernel_23/doc_tex/Kernel_23_ref/main.tex index 851923b15e4..961c1d0348a 100644 --- a/Kernel_23/doc_tex/Kernel_23_ref/main.tex +++ b/Kernel_23/doc_tex/Kernel_23_ref/main.tex @@ -176,6 +176,7 @@ in the kernel. \input{Kernel_23_ref/coplanar_orientation.tex} \input{Kernel_23_ref/coplanar_side_of_bounded_circle.tex} \input{Kernel_23_ref/cross_product.tex} +\input{Kernel_23_ref/determinant.tex} \input{Kernel_23_ref/do_intersect.tex} \input{Kernel_23_ref/do_overlap.tex} \input{Kernel_23_ref/enum_cast.tex} @@ -259,6 +260,8 @@ in the kernel. \input{Kernel_23_ref/Kernel_ComputeC_2.tex} \input{Kernel_23_ref/Kernel_ComputeArea_2.tex} \input{Kernel_23_ref/Kernel_ComputeArea_3.tex} +\input{Kernel_23_ref/Kernel_ComputeDeterminant_2.tex} +\input{Kernel_23_ref/Kernel_ComputeDeterminant_3.tex} \input{Kernel_23_ref/Kernel_ComputeScalarProduct_2.tex} \input{Kernel_23_ref/Kernel_ComputeScalarProduct_3.tex} \input{Kernel_23_ref/Kernel_ComputeSquaredArea_3.tex} diff --git a/Kernel_23/include/CGAL/Kernel/global_functions_2.h b/Kernel_23/include/CGAL/Kernel/global_functions_2.h index 8f7cafba5e9..226a3f8c7d0 100644 --- a/Kernel_23/include/CGAL/Kernel/global_functions_2.h +++ b/Kernel_23/include/CGAL/Kernel/global_functions_2.h @@ -445,6 +445,14 @@ compare_yx(const Point_2 &p, const Point_2 &q) return CGALi::compare_yx(p, q, K()); } +template < class K > +inline +typename K::FT +determinant(const Vector_2 &v0, const Vector_2 &v1) +{ + return CGALi::determinant(v0, v1, K()); +} + template inline bool diff --git a/Kernel_23/include/CGAL/Kernel/global_functions_3.h b/Kernel_23/include/CGAL/Kernel/global_functions_3.h index a3d7dfe9c0b..7f7191204d7 100644 --- a/Kernel_23/include/CGAL/Kernel/global_functions_3.h +++ b/Kernel_23/include/CGAL/Kernel/global_functions_3.h @@ -314,6 +314,15 @@ cross_product(const Vector_3 &v, const Vector_3 &w) return CGALi::cross_product(v, w, K()); } +template < class K > +inline +typename K::FT +determinant(const Vector_3 &v0, const Vector_3 &v1, + const Vector_3 &v2) +{ + return CGALi::determinant(v0, v1, v2, K()); +} + template < class K > inline bool diff --git a/Kernel_23/include/CGAL/Kernel/global_functions_internal_2.h b/Kernel_23/include/CGAL/Kernel/global_functions_internal_2.h index eb16a7331c9..0eb83b35df2 100644 --- a/Kernel_23/include/CGAL/Kernel/global_functions_internal_2.h +++ b/Kernel_23/include/CGAL/Kernel/global_functions_internal_2.h @@ -447,6 +447,15 @@ compare_y_at_x(const typename CGAL_WRAP(K)::Line_2 &l1, return k.compare_y_at_x_2_object()(l1, l2, h1, h2); } +template < class K > +inline +typename K::FT +determinant(const typename CGAL_WRAP(K)::Vector_2 &v0, + const typename CGAL_WRAP(K)::Vector_2 &v1, const K &k) +{ + return k.compute_determinant_2_object()(v0, v1); +} + template inline bool diff --git a/Kernel_23/include/CGAL/Kernel/global_functions_internal_3.h b/Kernel_23/include/CGAL/Kernel/global_functions_internal_3.h index 578b921e709..91bc1348aad 100644 --- a/Kernel_23/include/CGAL/Kernel/global_functions_internal_3.h +++ b/Kernel_23/include/CGAL/Kernel/global_functions_internal_3.h @@ -333,6 +333,16 @@ cross_product(const typename CGAL_WRAP(K)::Vector_3 &v, return k.construct_cross_product_vector_3_object()(v, w); } +template < class K > +inline +typename K::FT +determinant(const typename CGAL_WRAP(K)::Vector_3 &v0, + const typename CGAL_WRAP(K)::Vector_3 &v1, + const typename CGAL_WRAP(K)::Vector_3 &v2, const K &k) +{ + return k.compute_determinant_3_object()(v0, v1, v2); +} + template < class K > inline bool diff --git a/Kernel_23/include/CGAL/Kernel/interface_macros.h b/Kernel_23/include/CGAL/Kernel/interface_macros.h index 2ad8e783974..a6d764c60bd 100644 --- a/Kernel_23/include/CGAL/Kernel/interface_macros.h +++ b/Kernel_23/include/CGAL/Kernel/interface_macros.h @@ -151,6 +151,10 @@ CGAL_Kernel_cons(Compute_area_2, compute_area_2_object) CGAL_Kernel_cons(Compute_area_3, compute_area_3_object) +CGAL_Kernel_cons(Compute_determinant_2, + compute_determinant_2_object) +CGAL_Kernel_cons(Compute_determinant_3, + compute_determinant_3_object) CGAL_Kernel_cons(Compute_scalar_product_2, compute_scalar_product_2_object) CGAL_Kernel_cons(Compute_scalar_product_3, diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_2.h index a1311fae04d..06155150b56 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_2.h @@ -60,6 +60,12 @@ _test_fct_vector_2(const R& ) assert( orientation(v1, v2) == CGAL::RIGHT_TURN ); assert( orientation(v2, v1) == CGAL::LEFT_TURN ); + assert( determinant(v0, v0) == 0 ); + assert( determinant(v1, v1) == 0 ); + assert( determinant(v1, v0) == 0 ); + assert( determinant(v1, v2) == -30 ); + assert( determinant(v2, v1) == 30 ); + assert( v1 + v2 == v3 ); assert( v1 - v2 == v4 ); assert( v3 - v1 == v2 ); diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_3.h index 672e2c4a46f..b1131602164 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_fct_vector_3.h @@ -66,6 +66,15 @@ _test_fct_vector_3(const R& ) assert( orientation(v1, v2, v12) == CGAL::POSITIVE ); assert( orientation(v1, v12, v2) == CGAL::NEGATIVE ); + assert( determinant(v0, v0, v0) == 0 ); + assert( determinant(v1, v1, v1) == 0 ); + assert( determinant(v1, v1, v2) == 0 ); + assert( determinant(v1, v2, v1) == 0 ); + assert( determinant(v2, v1, v1) == 0 ); + assert( determinant(v1, v2, v3) == 0 ); + assert( determinant(v1, v2, v12) == 180 ); + assert( determinant(v1, v12, v2) == -180 ); + assert( v1 + v2 == v3 ); assert( v1 - v2 == v4 ); assert( v3 - v1 == v2 ); diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h index 1360718461d..ad6cb0a806c 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_2.h @@ -343,15 +343,19 @@ test_new_2(const R& rep) tmp22a = compute_area_2(rec2); tmp22a = compute_area_2(p3, p4, p5); + typename R::Compute_determinant_2 compute_determinant_2 + = rep.compute_determinant_2_object(); + FT tmp22b = compute_determinant_2(v3, v4); + typename R::Compute_scalar_product_2 Compute_scalar_product = rep.compute_scalar_product_2_object(); - FT tmp22b = Compute_scalar_product(v3, v4); + FT tmp22c = Compute_scalar_product(v3, v4); typename R::Compute_squared_distance_2 Compute_squared_distance = rep.compute_squared_distance_2_object(); - FT tmp22c = Compute_squared_distance(p1, p2); - tmp22c = Compute_squared_distance(p1, r2); - tmp22c = Compute_squared_distance(p1, t2); + FT tmp22d = Compute_squared_distance(p1, p2); + tmp22d = Compute_squared_distance(p1, r2); + tmp22d = Compute_squared_distance(p1, t2); typename R::Compute_squared_length_2 Compute_squared_length = rep.compute_squared_length_2_object(); diff --git a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h index 6db617abf83..7b590919460 100644 --- a/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h +++ b/Kernel_23/test/Kernel_23/include/CGAL/_test_new_3.h @@ -391,6 +391,10 @@ test_new_3(const R& rep) (void) tmp12a; (void) tmp12b; + typename R::Compute_determinant_3 compute_determinant_3 + = rep.compute_determinant_3_object(); + FT tmp12aa = compute_determinant_3(v3, v4, v5); + typename R::Compute_scalar_product_3 Compute_scalar_product = rep.compute_scalar_product_3_object(); FT tmp12bb = Compute_scalar_product(v3, v4); @@ -708,7 +712,7 @@ test_new_3(const R& rep) use(tmp3); use(tmp3a); use(tmp9); use(tmp14a); use(tmp5); use(tmp6); use(tmp7); use(tmp71); use(sp1a); use(tmp72); - use(tmp12a); use(tmp12b); + use(tmp12a); use(tmp12aa); use(tmp12b); use(bb1); use(bb2); use(bb3); use(bb4); use(bb5); use(bb6); use(r4); use(r5); use(l7); use(l8); use(v7); use(v8); use(v9); use(h8); use(cccit);