Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement