The structure of this lab is like the structure of the lecture notes on Classes, Header/Source/Object/Executable Files. What I want you to do is the following, in the directory in which you are working (this assumes you are on a lab machine):
cp -r /home/jplank/cs202/Labs/Lab3/src . cp -r /home/jplank/cs202/Labs/Lab3/include . cp -r /home/jplank/cs202/Labs/Lab3/pgm . cp /home/jplank/cs202/Labs/Lab3/makefile . mkdir obj mkdir bin
touch bin/.keep touch obj/.keep cp /home/jplank/cs202/Labs/Lab3/.gitignore . git add .gitignore obj/.* bin/.* src/* include/* pgm/* makefile
/* Header file to define the PGM class, that lets you manipulate PGM files. The files themselves are simply stored in a vector of vectors of ints. All of the methods return true if they succeed and false if they fail. Write() needs to produce files in a specific format: - P2 on its own line, no spaces. - cols rows on the next line, separated by a space, no additional spaces - 255 on its own line, no spaces. - Then the pixels: 20 pixels per line, one space between pixels, no additional spaces. - You don't print additional newlines at the end of each row of pixels -- just start the next row of pixels. - The last line is the only one that can have fewer than 20 pixels. - To give an example, if the picture has two rows and 11 columns, and all of the pixels have values of 5, then the pixels will look like: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 */ #pragma once #include <vector> class Pgm { public: bool Read(const std::string &file); // Reads a PGM file bool Write(const std::string &file) const; // Writes a PGM file bool Create(size_t r, size_t c, size_t pv); // Creates a rxc PGM with the given pixel value bool Clockwise(); // Rotates 90 degrees clockwise bool Cclockwise(); // Rotates 90 degrees counterclockwise bool Pad(size_t w, size_t pv); // Adds a border of w pixels with the given value bool Panel(size_t r, size_t c); // Makes rxc copies of the PGM bool Crop(size_t r, size_t c, size_t rows, size_t cols); // Crops from r:c to (r+rows):(c+cols) protected: std::vector < std::vector <int> > Pixels; }; |
This is all straightforward. Your job in this lab is to implement all of the methods, with the exception of Read(), which is already written for you in src/pgm.cpp. Pay attention to the format of Write(), which is specified in the opening comments at the beginning of the file.
As in the Tic-Tac-Toe lecture, there is a separate testing program, in src/pgm_tester.cpp. I'm not going to include it here because it is so straightforward. The testing program allows you to test each method:
UNIX> echo '?' | bin/pgm_tester usage: pgm_editor [prompt] - commands on standard input READ filename - Read the PGM file WRITE filename - Write the stored PGM to the file CREATE rows cols pixvalue - Call Create() CW - Call Clockwise() CCW - Call Cclockwise() PAD pixels pixvalue - Call Pad() PANEL r c - Call Panel() CROP r c rows cols - Call Crop() Q - Quit ? - Print commands UNIX>The makefile allows you to compile everything, putting object files in the obj directory, and putting the binary in bin/pgm_tester. Let me give you some examples. Under each example, I have the picture that is created:
UNIX> bin/pgm_tester 'PGM>' PGM> CREATE 50 200 0 PGM> WRITE pgm/example_create.pgm PGM> PGM> PGM> READ pgm/Red.pgm PGM> CW PGM> WRITE pgm/example_cw.pgm PGM> PGM> PGM> READ pgm/Red.pgm PGM> CCW PGM> WRITE pgm/example_ccw.pgm PGM> PGM> PGM> READ pgm/Rodney.pgm PGM> PAD 30 0 PGM> WRITE pgm/example_pad_1.pgm PGM> PGM> PGM> PAD 30 255 PGM> PAD 1 0 PGM> WRITE pgm/example_pad_2.pgm PGM> PGM> PGM> READ pgm/Red.pgm PGM> PANEL 2 4 PGM> WRITE pgm/example_panel_1.pgm PGM> PGM> PGM> READ pgm/Rodney.pgm PGM> PAD 6 0 PGM> PAD 3 255 PGM> PANEL 3 5 PGM> WRITE pgm/example_panel_2.pgm PGM> PGM> PGM> READ pgm/Red.pgm PGM> CROP 45 60 50 100 PGM> WRITE pgm/example_crop.pgm PGM> PGM> PGM> READ pgm/Red.pgm PGM> CROP 45 60 50 100 PGM> PAD 2 0 PGM> PAD 1 255 PGM> PANEL 4 9 PGM> WRITE pgm/example_crop_panel.pgm PGM> PGM> PGM> Q UNIX>
The gradescript assumes that you program is in bin/pgm_tester
To reiterate, the only think you should submit is src/pgm.cpp.
BTW, in 2019, the TA's Kody Bloodworth and ChaoHui Zheng wrote up some supplementary information. I have linked it here, in the file Supplement.pdf. One issue -- under "crop", it should say "top left" where it says "top right".