![]() |
Web 2.0 Graphics |
| Alpha Compositing - Part 2 |
star methodTo draw the starburst I had to go way back to my high-school trigonometry lessons. The only thing I could remember was the Pythagorean Theorem but fortunately it was all I needed! I remembered that I could compute the coordinates of a point on the perimeter of a circle as
x = r * cos(theta) y = r * sin(theta)
where r is the radius of the circle and
theta is the inner angle. The
Magick::Draw#star method uses these equations to
compute the vertices of 2 25-sided regular polygons. One
polygon is nested inside the other, The inner polygon is
rotated such that its vertices are halfway between the vertices
of the outer polygon. Draw#star then computes the
points of the actual starburst polygon by alternating between a
vertex on the outer polygon and a vertex on the inner
polygon.
In the image below, the vertices of the red and blue polygons supply the points that form the perimeter of the starburst.
The Magick::Image#star method creates an instance of
Magick::Draw, sets up the style attributes and
calls Magick::Draw#star to compute the points of
the starburst polygon. Then it calls
Magick::Draw#draw to actually draw the
starburst.
module Magick
class Draw
def star(sides, inner_radius, outer_radius)
theta = 0.0
incr = Math::PI * 2.0 / sides
half_incr = incr / 2.0
points = []
sides.times do
points << outer_radius * Math::cos(theta)
points << outer_radius * Math::sin(theta)
points << inner_radius * Math::cos(theta + half_incr)
points << inner_radius * Math::sin(theta + half_incr)
theta += incr
end
polygon *points
end
end
class Image
def star(sides, inner_radius, outer_radius, stroke, fill)
gc = Draw.new
gc.translate columns/2.0, rows/2.0
gc.fill fill
gc.stroke stroke
gc.star sides, inner_radius, outer_radius
gc.draw self
end
end
end