46 const Eigen::Vector3d normal = dir.normalized();
47 using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
48 using Point_2 = Kernel::Point_2;
49 using Polygon_2 = CGAL::Polygon_2<Kernel>;
54 std::vector<Point_2> allProjected;
55 double allMaxX = -std::numeric_limits<double>::infinity();
56 double allMinX = +std::numeric_limits<double>::infinity();
58 const auto& consume = [&](
auto x,
auto y,
auto z)
60 const Eigen::Vector3d t = boxFrame.transpose() * Eigen::Vector3d{
x, y, z};
61 allProjected.emplace_back(t.y(), t.z());
62 allMinX = std::min(allMinX, t.x());
63 allMaxX = std::max(allMaxX, t.x());
65 const auto& resize = [&](
auto size) { allProjected.reserve(size); };
70 std::vector<Point_2> chullAll;
71 CGAL::convex_hull_2(allProjected.begin(), allProjected.end(), std::back_inserter(chullAll));
74 CGAL::min_rectangle_2(chullAll.begin(), chullAll.end(), std::back_inserter(polyAll));
75 const auto& polyps = polyAll.container();
78 <<
VAROUT(normal.transpose()) <<
'\n'
79 <<
VAROUT(boxFrame) <<
'\n'
80 <<
VAROUT(allProjected.size()) <<
'\n'
81 <<
VAROUT(chullAll.size()) <<
'\n'
82 <<
VAROUT(polyAll.container().size());
84 const auto v0 = polyps.at(0) - polyps.at(1);
85 const auto v1 = polyps.at(2) - polyps.at(1);
87 Eigen::Vector3d{allMinX, polyps.at(1).x(), polyps.at(1).y()},
88 Eigen::Vector3d{allMaxX - allMinX, 0, 0},
89 Eigen::Vector3d{0, v0.x(), v0.y()},
90 Eigen::Vector3d{0, v1.x(), v1.y()}
92 .transformed(boxFrame);
102 <<
VAROUT(oobb.transformation()) <<
'\n'
103 <<
VAROUT(oobb.dimensions()) <<
'\n'
104 <<
VAROUT(oobb.axis_x().transpose());
107 const Eigen::Vector3d e1 = oobb.extend(1);
108 const Eigen::Vector3d e2 = oobb.extend(2);
110 return {oobb.translation(), {e1(0), e1(1)}, {e2(0), e2(1)}, oobb.dimension(0)};
140 std::vector<float> valuesX;
141 std::vector<float> valuesY;
142 std::vector<float> valuesZ;
145 const auto& consume = [&](
auto x,
auto y,
auto z)
147 const Eigen::Vector3f ted =
transform * Eigen::Vector3f{
x, y, z};
148 valuesX.emplace_back(ted.x());
149 valuesY.emplace_back(ted.y());
150 valuesZ.emplace_back(ted.z());
152 const auto& resize = [&](
auto size)
155 valuesX.reserve(size);
156 valuesY.reserve(size);
157 valuesZ.reserve(size);
162 std::sort(valuesX.begin(), valuesX.end());
163 std::sort(valuesY.begin(), valuesY.end());
164 std::sort(valuesZ.begin(), valuesZ.end());
166 const std::size_t idxLo = sz * trimEachSideBy;
167 const std::size_t idxHi = sz - std::max(idxLo, 1ul);
168 const float loX = valuesX.at(idxLo);
169 const float hiX = valuesX.at(idxHi);
170 const float loY = valuesY.at(idxLo);
171 const float hiY = valuesY.at(idxHi);
172 const float loZ = valuesZ.at(idxLo);
173 const float hiZ = valuesZ.at(idxHi);
176 std::vector<Eigen::Vector3f> result;
178 const auto& consume = [&](
auto x,
auto y,
auto z)
180 const Eigen::Vector3f ted =
transform * Eigen::Vector3f{
x, y, z};
181 if (ted.x() <= hiX && ted.x() >= loX && ted.y() <= hiY && ted.y() >= loY &&
182 ted.z() <= hiZ && ted.z() >= loZ)
184 result.emplace_back(
x, y, z);
187 const auto& resize = [&](
auto) {};
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT > >
Convenience function (with less typing) to transform a container of type InputT into the same contain...