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:
UNIX> cp -r /home/jplank/cs140/Labs/Lab3/src . UNIX> cp -r /home/jplank/cs140/Labs/Lab3/include . UNIX> cp -r /home/jplank/cs140/Labs/Lab3/pgm . UNIX> cp /home/jplank/cs140/Labs/Lab3/makefile . UNIX> mkdir obj UNIX> mkdir binYou will now have five directories: include, src, obj bin and pgm. The first four mirror the lecture notes, and the last has pgm files that you can use for testing. In include/pgm.hpp, there is a definition of a PGM class. The description of the class is in the include file, so go ahead and read it:
/* Header file to define the PGM class, that lets you manipulate PGM files.
/* 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
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.