class RDS_TrapShapeNestedCircles(common.ulb:TrapShape) { public: import "common.ulb" func RDS_TrapShapeNestedCircles(Generic pparent) TrapShape.TrapShape(pparent) endfunc float func Iterate(complex pz) TrapShape.Iterate(pz) pz = pz * (0,1) ^ 0.5 float d = cabs(pz) - @p_radius; if (d > 0) return d else d = -d endif complex bottomleft = -@p_radius / sqrt(2.0) + flip(-@p_radius / sqrt(2.0)) int n = 2 float cur_radius = @p_radius / 2.0 int level = 1 while (level < @p_levels) float delta = cur_radius * sqrt(2.0) complex circle_pos = bottomleft - (cur_radius / sqrt(2.0) + flip(cur_radius / sqrt(2.0))) complex newp = (pz - circle_pos) / delta complex newf = newp - trunc(newp) ; End if point is outside all circles at this level if (real(newp) < 0 || real(newp) > n+1 || imag(newp) < 0 || imag(newp) > n+1) return d endif ; Check bottom left circle if (real(newp) > 1 && imag(newp) > 1) float newd = abs(delta * cabs(newf) - cur_radius) if (newd < d) d = newd endif endif ; check bottom right circle if (real(newp) < n && imag(newp) > 1) float newd = abs(delta * cabs(newf - (1,0)) - cur_radius) if (newd < d) d = newd endif endif ; check top left circle if (real(newp) > 1 && imag(newp) < n) float newd = abs(delta * cabs(newf - (0,1)) - cur_radius) if (newd < d) d = newd endif endif ; check top right circle if (real(newp) < n && imag(newp) < n) float newd = abs(delta * cabs(newf - (1,1)) - cur_radius) if (newd < d) d = newd endif endif n = n * 2 cur_radius = cur_radius / 2.0 level = level + 1 endwhile return d endfunc default: title = "Nested Circles" int param v_rds_trapshapenestedcircles caption = "Version (RDS_TrapShapeNestedCircles)" default = 100 hint = "This version parameter is used to detect when a change has been made to the formula that is incompatible with the previous version. When that happens, this field will reflect the old version number to alert you to the fact that an alternate rendering is being used." visible = @v_rds_trapshapenestedcircles < 100 endparam float param p_radius caption = "Radius" default = 1.0 min = 0.1 hint = "Radius of outer circle" endparam int param p_levels caption = "Levels" default = 6 min = 1 max = 10 hint = "How many levels of nesting to use." endparam }