In this project, you'll learn how to write C code that can make drawings like these (made by the instructor):
And drawings like these (the following are actual student drawings from CS16 Fall 2009):
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
What all of these drawings have in common is that they include some kind of parameterization—that is, the same drawing (e.g. the awesome face), can be drawing at:
This is essentially an exercise in designing functions. You need to:
You'll be given some basic tools to draw in either black and white, or color:
We can also discuss, as student interests dictate, how to extend those routine to do other interesting things like
There's a program called ourDrawing.c—that's where you'll put your code for this project. All the other files—you pretty much shouldn't have to make any changes to those.
In ourDrawing.c, you'll use the functions provided in the other files to make your drawing.
What you draw is up to you—as we'll explain in lecture.
The code that does the basic underlying drawing of lines, boxes, etc. is provided for you, as well as code that copies your file to the web. However, what is good is that the vast majority of that code is code that you already have the capacity to understand at this point in your journey with the C programming language. There isn't time in a 10 week course to guide you the process of developing all that code, but we can go through some of it in lecture to explain how it works—and as time permits, we will.
By the time you have completed this project, you should:
Before starting this project, you should have completed the labs up through lab07. In particular, you should be comfortable working with arrays, structs, arrays of structs, and passing structs and arrays of structs to functions.
Work with the same partner you had in lab07/lab08—or if he/she is not available for some reason, see your TA and/or instructor about getting a new pair partner assigned.
If you do work with a new partner, please complete a new version of W01, and post your new assignment to the forum on Gauchospace.
If he/she is not available, and you are assigned a new partner, then complete a new version of worksheet W01 (html, pdf), including posting to the "Updated pair partners for proj0 forum" on Gauchospace.
Remember: don't share passwords. Instead, use scp or email to share files with each other at the end of each work session. (See previous labs for details.)
It is only necessary for one member of the pair to submit—but you are BOTH responsible for seeing that this HAS been done and that both of your names are in the ourDrawing.c file.
Log on to CSIL, create ~/cs16/proj0
The files for this project can be found here:
And here:
~pconrad/public_html/cs16/10W/projects/proj0/files/*
You can use the same techniques described in earlier labs to copy those into your ~/cs16/proj0 directory.
The following material will be covered in lecture either before, or just this project is being assigned.
What you are given is a collection of code containing three libraries:
You'll also see header files that support these C files:
You'll also see some programs that contain main programs that use these libraries:
file | what it does | sample image |
---|---|---|
testMain.c | contains only test cases, mostly for the functions in shapeFunctions.c | n/a |
drawHouse.c | draws a black and white house, using simple lines | ![]() |
drawFilledColorHouse.c | draws a filled house in color | ![]() |
drawSnowman.c | draws a single snowman in black and white | ![]() |
drawManySnowmen.c | shows how to make drawing a snowman be a function, so you can draw several snowmen of different sizes | ![]() |
drawFlags.c | shows how to draw a simple tri-color flag (in this case the GermanFlag) using filledBoxes. Another example of abstracting a drawing into a function | ![]() |
ourDrawing.c | draws whatever you want (at the moment, it's blank!) | ![]() |
We'll also go over what happens when you type "make". This week there is a Makefile that controls what happens.
You'll need to understand just two things:
To start off, type "make" (all by itself) at the Unix command prompt.
When you do you'll see output indicating that
Here's an example:
-bash-3.2$ make
gcc -c testMain.c
gcc -c drawingFunctions.c
gcc -c shapeFunctions.c
gcc -c tdd.c
gcc -lm -Wall -g drawingFunctions.o shapeFunctions.o tdd.o testMain.o -o testMain
gcc -c drawHouse.c
...
(many lines of output deleted... full transcript available in make.output.txt)
All tests passed!
-bash-3.2$.
The key line of output to look for is this one—except it will have your username, not jsmith—unless your username happens to be jsmith:
Visit http://www.cs.ucsb.edu/~jsmith/cs16/proj0 to see your picsGo to that website, and you'll see something like this:
The drawings in that directory are the ones created by the code in the files below:
GIF file | C file |
---|---|
filledHouse.gif | drawFilledColorHouse.c |
flags.gif | drawFlags.c |
house.gif | drawHouse.c |
manySnowmen.gif | drawManySnowmen.c |
ourDrawing.gif This is where your drawing will appear! |
ourDrawing.c This is where you put your code! |
snowman.gif | drawSnowman.gif |
If your files get messed up and you want to start over, the "make clean" command will get rid of all the extra files is your current directory so that you can type "make" again from scratch.
You need to log into Gauchospace and go to the discussion form near the top of the main page labeled 'register your proj0 drawings here'.
Look to see if anyone else has already registered the same item that you want to draw. You need to draw something that has not already been chosen in order to get full credit.
You may make your item unique by adding a unique "twist"—e.g. if they are drawing a "car", you can't just draw a "car", but you can draw:
To make your drawing, you put code into the file ourDrawing.c.
The first step is to set up the function call to initDrawing with the correct parameters:
initDrawing(&d, drawing_type, width, height, background_color);
The choices you'll need to make here are:
The next step is to add code into one of the two functions called drawShape1 and drawShape2. In each case, you should rename the function to a more sensible name such as:
Decide what parameters the drawing functions will take.
At a minimum, it should take a 'reference point', and at least one dimension—a width, height, or radius—something that allows you to draw your picture at different scales.
What if my drawing has hard coded points?
That's ok as a starting point.
Hard coded points can easily be converted into a formula with a little extra work—once you get the hang of it, it isn't that tough.
A drawing with hard coded points is also ok for partial credit.
What if I don't want my drawing to have "two" of something on it at different sizes?
Or what if my converting my complex drawing from hard coded points is going to be a major pain!
If you already have a drawing that you are very proud of, and you don't want to mess up the artistry, but you still want full credit, here's a work around for you.
This is also a way out if you are not feeling very creative and just want to get this assignment done.
Make a drawing function to draw a drawing consisting of just the initials of your first name, and that of your pair partner. For example, if Ian Smith were to partner with Frieda Jones, their drawing might be IF, and might have points like this:
We can label these points like this:
And then draw this with code like the following:
void drawIF(struct Drawing *d, struct Point ul, // upper left, or center bottom, or whatever double width, double height, int color) { double letWidth = width * 0.45; // width of each letter double spaceBetween = width * 0.1; // space between letters struct Point ulI, umI, urI, llI, lmI, lrI; // I upper left, middle, right, etc. struct Point ulF, mlF, llF, urF, mrF;// F upper, middle, and lower left, etc. // set points of I across the top initPoint(&ulI, ul.x, ul.y); initPoint(&umI, ul.x + letWidth/2.0, ul.y); initPoint(&urI, ul.x + letWidth, ul.y);
// set points of I across the bottom initPoint(&llI, ul.x, ul.y + height); initPoint(&lmI, ul.x + letWidth/2.0, ul.y + height); initPoint(&lrI, ul.x + letWidth, ul.y + height);
// draw the I drawLine(d, ulI, urI, color); // across the top drawLine(d, llI, lrI, color); // across the bottom drawLine(d, umI, lmI, color); // down the middle
// set points of F down the left hand side, top to bottom initPoint(&ulF, ul.x + letWidth + spaceBetween, ul.y);
etc...
}
With this in place, you can now "tag" your drawing with two tags of different sizes and colors, to create an effect something like this:
With function calls like these:
drawIF(&d,makePoint(10,20),20,80, COLOR_RED);
drawIF(&d,makePoint(265,120),30,20, COLOR_GREEN)
If you do this, then even if your main drawing is hard coded and can't be scaled, you'll get full credit for having created at least one drawing that can be scaled and relocated (i.e. your tag), and you wont have to mess up the artistic integrity of your main drawing.
Why having a drawing in two places at different sizes is so important
The reason it is so important to have a drawing element that appears at different places and with different sizes is that this shows you really understand how to apply the idea of abstraction—which is one of the central ideas in Computer Science.
Finishing up
You are ready to move on to scripting and submitting when:
To script and submit, create a script proj0.txt in which you:
Check the web site one last time to make sure that your drawing appears there under the name http://www.cs.ucsb.edu/~yourusername/cs16/proj0/ourDrawing.gif.
Then, submit the contents of your proj0 directory via:
turnin proj0@cs16a proj0
* Note that since Gauchospace currently has a maximum point value of 300, we'll compute a grade out of 300 points, and then enter it in Gauchospace twice.
For students that really want to go "beyond the call of duty": here are some extra things you may like to experiment with.
ulimit -s 1000000
at the shell prompt before running your program. Copyright 2010, Phillip T. Conrad, CS Dept, UC Santa Barbara. Permission to copy for non-commercial, non-profit, educational purposes granted, provided appropriate credit is given; all other rights reserved.