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 {
HostBuffer & GetTransientsBuffer() const
Retrieve the currnent host buffer for transient storage.
Matrix GetShaderTransform(const RenderPass &pass) const
Get the vertex shader transform used for drawing this Entity.
Render passes encode render commands directed as one specific render target into an underlying comman...
bool IsAxisAlignedRect() const override
SuperellipseGeometry(const Point ¢er, Scalar radius, Scalar degree, Scalar alpha, Scalar beta)
bool CoversArea(const Matrix &transform, const Rect &rect) const override
Determines if this geometry, transformed by the given transform, will completely cover all surface ar...
~SuperellipseGeometry() override
A 4x4 matrix using column-major storage.
constexpr static TRect MakeOriginSize(const TPoint< Type > &origin, const TSize< Type > &size)