АлгоритмТут по сути мы модифицируем форму ядра свретки, отбрасывая точки за пределами формы чем-нибудь типа
// Regular n-gon aperture test (inscribed in unit circle). blades<3 → circle (always inside).
inline bool insideAperture(float2 d, int blades) {
if (blades < 3) return true; // circle
float N = float(blades);
// polar angle
float a = atan2(d.y, d.x);
// sector size and half-sector
float sector = 2.0f * M_PI_F / N;
float halfSec = 0.5f * sector;
// wrap angle to [0, sector)
float m = fmod(a + M_PI_F, sector);
if (m < 0.0f) m += sector;
// offset to nearest edge normal (in [-half, half])
float delta = m - halfSec;
// allowed radius along this direction for polygon with circumradius=1
float rAllowed = cos(M_PI_F / N) / max(cos(delta), 1e-4f);
float r = length(d);
return r <= rAllowed;
}
Что можно еще "поломать":
- сделать скругление маски через SDF например
- сделать искажение формы, например неоднородным масштабом и поворотом
- исказить один из секторов лепестков
- сделать любую форму в принципе