40 std::vector<Point> points;
42 for (
int i = 0; i <= 40; i++) {
44 Scalar x = a * pow(abs(cos(t)), 2 / n);
45 Scalar y =
b * pow(abs(sin(t)), 2 / n);
46 points.emplace_back(x * radius_, y * radius_);
49 static constexpr
Point reflection[4] = {{1, 1}, {-1, 1}, {-1, -1}, {1, -1}};
54 std::vector<Point> geometry;
55 geometry.reserve(1 + 4 * points.size());
56 geometry.push_back(center_);
57 for (
auto i = 0u; i < points.size(); i++) {
58 geometry.push_back(center_ + (reflection[0] * points[i]));
60 for (
auto i = 0u; i < points.size(); i++) {
61 geometry.push_back(center_ +
62 (reflection[1] * points[points.size() - i - 1]));
64 for (
auto i = 0u; i < points.size(); i++) {
65 geometry.push_back(center_ + (reflection[2] * points[i]));
67 for (
auto i = 0u; i < points.size(); i++) {
68 geometry.push_back(center_ +
69 (reflection[3] * points[points.size() - i - 1]));
72 std::vector<uint16_t> indices;
73 indices.reserve(geometry.size() * 3);
74 for (
auto i = 2u; i < geometry.size(); i++) {
76 indices.push_back(i - 1);
81 return GeometryResult{
85 .vertex_buffer = host_buffer.Emplace(
86 geometry.data(), geometry.size() *
sizeof(
Point),
88 .index_buffer = host_buffer.Emplace(
89 indices.data(), indices.size() *
sizeof(uint16_t),
91 .vertex_count = indices.size(),
98 std::optional<Rect> SuperellipseGeometry::GetCoverage(
101 Size(radius_ * 2, radius_ * 2));
105 const Rect& rect)
const {