-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathconvex_hull.h
85 lines (62 loc) · 2.65 KB
/
convex_hull.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once
#include <memory>
#include <optional>
#include <set>
#include <utility>
#include <vector>
#include "drake/geometry/optimization/convex_set.h"
namespace drake {
namespace geometry {
namespace optimization {
/** Implements the convex hull of a set of convex sets. Given sets {X₁, X₂, ...,
Xₙ}, the convex hull is the set of all convex combinations of points in the
sets, i.e. {∑ᵢ λᵢ xᵢ | xᵢ ∈ Xᵢ, λᵢ ≥ 0, ∑ᵢ λᵢ = 1}.
@ingroup geometry_optimization */
class ConvexHull final : public ConvexSet, private ShapeReifier {
public:
DRAKE_DEFAULT_COPY_AND_MOVE_AND_ASSIGN(ConvexHull)
/** Constructs the convex hull from a list of convex sets. */
explicit ConvexHull(const ConvexSets& sets);
~ConvexHull() final;
/** Returns the participating convex sets. */
const ConvexSets& sets() const { return sets_; }
/** Returns a reference to the convex set at the given index. */
const ConvexSet& element(int index) const;
/** Returns the number of convex sets constructing the convex hull. */
int num_elements() const { return sets_.size(); }
using ConvexSet::IsBounded;
/** @throws Not implemented. */
using ConvexSet::CalcVolume;
private:
std::unique_ptr<ConvexSet> DoClone() const final;
std::optional<bool> DoIsBoundedShortcut() const final;
bool DoIsEmpty() const final;
std::optional<Eigen::VectorXd> DoMaybeGetPoint() const final;
bool DoPointInSet(const Eigen::Ref<const Eigen::VectorXd>& x,
double tol) const final;
std::pair<VectorX<symbolic::Variable>,
std::vector<solvers::Binding<solvers::Constraint>>>
DoAddPointInSetConstraints(
solvers::MathematicalProgram* prog,
const Eigen::Ref<const solvers::VectorXDecisionVariable>& vars)
const final;
std::vector<solvers::Binding<solvers::Constraint>>
DoAddPointInNonnegativeScalingConstraints(
solvers::MathematicalProgram* prog,
const Eigen::Ref<const solvers::VectorXDecisionVariable>& x,
const symbolic::Variable& t) const final;
std::vector<solvers::Binding<solvers::Constraint>>
DoAddPointInNonnegativeScalingConstraints(
solvers::MathematicalProgram* prog,
const Eigen::Ref<const Eigen::MatrixXd>& A_x,
const Eigen::Ref<const Eigen::VectorXd>& b_x,
const Eigen::Ref<const Eigen::VectorXd>& c, double d,
const Eigen::Ref<const solvers::VectorXDecisionVariable>& x,
const Eigen::Ref<const solvers::VectorXDecisionVariable>& t) const final;
std::pair<std::unique_ptr<Shape>, math::RigidTransformd> DoToShapeWithPose()
const final;
ConvexSets sets_{};
};
} // namespace optimization
} // namespace geometry
} // namespace drake