// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "cross.h" // http://www.antisphere.com/Wiki/tools:anttweakbar IGL_INLINE void igl::cross( const double *a, const double *b, double *out) { out[0] = a[1] * b[2] - a[2] * b[1]; out[1] = a[2] * b[0] - a[0] * b[2]; out[2] = a[0] * b[1] - a[1] * b[0]; } template < typename DerivedA, typename DerivedB, typename DerivedC> IGL_INLINE void igl::cross( const Eigen::PlainObjectBase &A, const Eigen::PlainObjectBase &B, Eigen::PlainObjectBase &C) { assert(A.cols() == 3 && "#cols should be 3"); assert(B.cols() == 3 && "#cols should be 3"); assert(A.rows() == B.rows() && "#rows in A and B should be equal"); C.resize(A.rows(), 3); for (int d = 0; d < 3; d++) { C.col(d) = A.col((d + 1) % 3).array() * B.col((d + 2) % 3).array() - A.col((d + 2) % 3).array() * B.col((d + 1) % 3).array(); } } #ifdef IGL_STATIC_LIBRARY template void igl::cross, Eigen::Matrix, Eigen::Matrix>(Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> &); template void igl::cross, Eigen::Matrix, Eigen::Matrix>(Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> &); template void igl::cross, Eigen::Matrix, Eigen::Matrix>(Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> &); template void igl::cross, Eigen::Matrix, Eigen::Matrix>(Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> const &, Eigen::PlainObjectBase> &); #endif