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_ +
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_ +
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
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)
std::vector< Point > points