Laboratory: Geometric Art
Summary: In this laboratory, you will further explore the techniques for making geometric images.
Preparation
a. Make a copy of geometric-art-lab.rkt
.
b. Create a new 200x200 image and call it canvas
.
c. Set the brush to something relatively simple and small.
> (context-set-brush! "2. Hardness 100" 2)
Exercises
Exercise 1: Drawing Functions, Revisited
a. Make a copy of draw-sin-with-parallel-lines!
and rename it draw-func-with-parallel-lines!
. Make sure that this renamed copy still works.
b. Add a parameter, func
, which is a function that takes one numeric parameter and produces a numeric result. Revise the procedure so that it calls func
in place of sin
.
c. Use draw-func-with-parallel-lines!
to “graph” the cosine function.
d. Use draw-func-with-parallel-lines!
to “graph” the sum of sine and cosine.
e. Use draw-func-with-parallel-lines!
to graph a function of your choice.
f. Revise the function so that it draws each line in a different color (based on the column of the line or the height of the line, as you choose).
Exercise 2: Drawing Parallel Lines with Different Brush Sizes
In the reading, we considered how one might use different brush sizes for neighboring parallel lines, but never finished the procedure to do that. Here’s a header for that procedure.
(define draw-parallel-lines-with-many-thicknesses!
(lambda (image brush-sizes n start-col start-row end-col end-row hoff voff)
...))
a. Finish writing the procedure. You should look at the definition of some of the other parallel line procedures (such as draw-parallel-lines!
) to figure out what might be in the procedure.
b. What do you expect the following call to generate?
> (define some-brush-sizes
(list 1 3 5 7 9 11))
> (draw-parallel-lines-with-many-thicknesses!
canvas some-brush-sizes 12
10 10 100 10
0 15)
c. Check your answer experimentally.
d. Extend the procedure so that it varies both color and brush sizes.
Exercise 3: Decreasing Spacing, Revisited
In the reading, we explored a procedure in which each space between lines is half of the space between lines to the left. Some callers might prefer to have a different ratio, such as 3/4 or 1/3. Let’s rewrite the procedure to permit the caller to specify that parameter, which we’ll call ratio
. Here’s the start of the new procedure, with a somewhat shorter name.
(define draw-geometric-progression!
(lambda (image col start-row end-row spacing ratio close-enough)
...))
a. Write that procedure.
b. What do you expect the following set of instructions to do?
> (define new-canvas (image-new 200 200))
> (image-show new-canvas)
> (context-set-brush! "2. Hardness 075" 1)
> (draw-geometric-progression! new-canvas 5 10 190 80 0.5 2)
> (context-update-displays!)
c. Check your answer experimentally.
d. Consider the following variant of the previous instructions, using a smaller ratio. How do you expect the generated image to differ?
> (define new-canvas (image-new 200 200))
> (image-show new-canvas)
> (context-set-brush! "2. Hardness 075" 1)
> (draw-geometric-progression! new-canvas 5 10 190 80 0.4 2)
> (context-update-displays!)
e. Check your answer experimentally.
f. Consider the following variant of the previous instructions, using a larger ratio. How do you expect the generated image to differ?
> (define new-canvas (image-new 200 200))
> (image-show new-canvas)
> (context-set-brush! "2. Hardness 075" 1)
> (draw-geometric-progression! new-canvas 5 10 190 80 0.75 2)
> (context-update-displays!)
g. Check your answer experimentally.
Exercise 4: Decreasing Spacing, Re-Revisited
As you probably discovered in the final problem of the previous exercise, if the caller isn’t careful, the final lines in the progression are drawn off the side of the image.
a. Update draw-geometric-progression!
so that it stops for two reasons: the spacing is less than or equal to close-enough
(as before) or the line to be drawn is outside the right-hand boundary of the image.
b. While draw-geometric-progression!
is designed for progressions in which the spacing between subsequent lines decreases, we should also be able to make it draw progressions in which the spacing increases. Write instructions for generating a sequence of lines in which the first line appears in column 3, the next in column 5 (spacing of 2), the next in column 9 (spacing of 4), the next in column 17 (spacing of 8), and the spacing continues to double.
Exercise 5: Concentric Circles
In the introduction to the corresponding reading, after drawing three parallel lines, we then generalized that technique. However, although we drew three concentric circles, we never generalized that technique.
a. Write a procedure, (draw-bullseye! image n col row outer-radius delta-radius)
, that draws a sequence of n
concentric circles, all with the same center, in which the outermost circle is radius of outer-radius
and each subsequent circle has a radius that is delta-radius
smaller.
b. As we saw in the reading, it can also be interesting to draw a sequence of circles that do not share a center, but have a progression of centers as well as a progression of smaller radii. Write a procedure, (draw-circle-sequence! image n col row radius d-col d-row d-radius)
, that draws a sequence of n
circles, the first of which is centered at (col
,row)
with radius *radius
, and each subsequent one has the column offset by d-col
, row offset by d-row
, and radius offset by d-radius
.
c. Rewrite draw-bullseye!
so that its body is a call to draw-circle-sequence!
.
For Those With Extra Time
You need not do the extra problems in order. Read through them and decide which is most worth your time.
Extra 1: Drawing Parallel Lines Without Explicit Recursion
In the corresponding reading, we wrote a procedure, draw-parallel-lines!
, using direct recursion. It is also possible to write this procedure using a clever combination of map
or for-each
, iota
, and an anonymous function. Try rewriting draw-parallel-lines!
using this strategy.
Extra 2: Sequences of Circles with Common Edges
Consider a function, (draw-left-bounded-circles! image n col row radius delta-radius)
, that draws n
circles, each of which has a left edge at column col
, the outermost circle has radius radius
and each subsequent circle has a radius that is delta-radius
smaller than the previous circle.
a. Write this procedure using direct recursion.
b. Can you write this procedure with a call to draw-circle-sequence!
? Why or why not?
Extra 3: Sequences of Circles with Variation
Rewrite draw-circle-sequence!
so that it adds some interesting variant. It might draw the circles in different colors, using a nonlinear offset of radii or centers, or anything else you deem appropriate.
Explorations
Exploration 1: Your Own Images
Create an image that you find aesthetically appealing with a few calls to one of the variants of draw-parallel-lines!
. You should feel free to change brush and foreground color between calls.
Exploration 2: Robert Delaunay
A number of artists have created interesting images using concentric circles and other geometric shapes. One of the more famous is French artist Robert Delaunay. Find a few of Delaunay’s works and see if you can make something that resembles a portion of a work using a variant of draw-circle-sequence!
.