14 const Eigen::Matrix<double,dim,1>& requested,
15 const std::vector<Eigen::Matrix<double,dim,1>>& equalities,
16 const std::vector<Eigen::Matrix<double,dim,1>>& outward)
18 using V=Eigen::Matrix<double,dim,1>;
20 const auto addNormal=[](std::vector<V>& normals,
V n)
22 for(
const auto&
q : normals)
26 const double norm=n.norm();
29 normals.push_back(n/norm);
34 for(
const auto& n : equalities)
39 double cost=requested.squaredNorm();
40 const double tolerance=1.e-12*requested.norm();
41 std::function<void(
size_t,
const std::vector<V>&)> visit;
42 visit=[&](
size_t start,
const std::vector<V>& active)
44 V candidate=requested;
45 for(
const auto& n : active)
47 candidate-=candidate.dot(n)*n;
50 for(
const auto& n : outward)
52 if(candidate.dot(n)<-tolerance)
58 const double candidateCost=(candidate-requested).squaredNorm();
59 if(feasible && candidateCost<=cost)
66 for(
size_t i=start;
i<outward.size();++
i)
69 if(addNormal(next,outward[
i]))
Eigen::Matrix< double, dim, 1 > oneSidedMotion(const Eigen::Matrix< double, dim, 1 > &requested, const std::vector< Eigen::Matrix< double, dim, 1 > > &equalities, const std::vector< Eigen::Matrix< double, dim, 1 > > &outward)