Henry Triff
/
ELEC2645_Project_el18ht
Graphics/Graphics.cpp@5:2d9f3c36bcb9, 2020-02-11 (annotated)
- Committer:
- HenryWTriff
- Date:
- Tue Feb 11 17:28:56 2020 +0000
- Revision:
- 5:2d9f3c36bcb9
- Parent:
- 4:9f41fc1c2ad1
- Child:
- 6:5f76dd718dc3
Off-track reduces speed, out of bounds is a thing, lap counter
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
HenryWTriff | 2:d08b6a1eaf2b | 1 | #include "Graphics.h" |
HenryWTriff | 2:d08b6a1eaf2b | 2 | |
HenryWTriff | 3:ceed6d026b8b | 3 | //*********** |
HenryWTriff | 3:ceed6d026b8b | 4 | // Sprites |
HenryWTriff | 3:ceed6d026b8b | 5 | //*********** |
HenryWTriff | 3:ceed6d026b8b | 6 | |
HenryWTriff | 3:ceed6d026b8b | 7 | int flag[8][8] = { |
HenryWTriff | 3:ceed6d026b8b | 8 | {4,1,1,1,1,1,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 9 | {4,1,1,0,1,0,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 10 | {4,1,0,1,0,1,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 11 | {4,1,1,0,1,0,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 12 | {4,1,1,1,1,1,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 13 | {4,4,4,4,4,4,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 14 | {4,4,4,4,4,4,1,1}, |
HenryWTriff | 3:ceed6d026b8b | 15 | {4,4,4,4,4,4,1,1}, |
HenryWTriff | 4:9f41fc1c2ad1 | 16 | }; |
HenryWTriff | 3:ceed6d026b8b | 17 | |
HenryWTriff | 4:9f41fc1c2ad1 | 18 | int car[8][8] = { |
HenryWTriff | 4:9f41fc1c2ad1 | 19 | {4,4,4,4,4,4,4,4}, |
HenryWTriff | 4:9f41fc1c2ad1 | 20 | {4,4,4,4,4,4,4,4}, |
HenryWTriff | 4:9f41fc1c2ad1 | 21 | {4,1,1,1,1,1,1,4}, |
HenryWTriff | 4:9f41fc1c2ad1 | 22 | {4,4,4,1,1,4,4,4}, |
HenryWTriff | 4:9f41fc1c2ad1 | 23 | {4,4,4,1,1,4,4,4}, |
HenryWTriff | 4:9f41fc1c2ad1 | 24 | {1,4,1,1,1,1,4,1}, |
HenryWTriff | 4:9f41fc1c2ad1 | 25 | {1,1,1,0,0,1,1,1}, |
HenryWTriff | 4:9f41fc1c2ad1 | 26 | {1,4,1,1,1,1,4,1}, |
HenryWTriff | 4:9f41fc1c2ad1 | 27 | }; |
HenryWTriff | 3:ceed6d026b8b | 28 | |
HenryWTriff | 2:d08b6a1eaf2b | 29 | //************************** |
HenryWTriff | 2:d08b6a1eaf2b | 30 | // MAIN GRAPHICS FUNCTION |
HenryWTriff | 2:d08b6a1eaf2b | 31 | //************************** |
HenryWTriff | 2:d08b6a1eaf2b | 32 | |
HenryWTriff | 5:2d9f3c36bcb9 | 33 | void Graphics::Draw_Map(Point_2D translation, int angle, float squish, Line_2D *Track_Lines, Line_2D *Track_Dotted_Lines, Line_2D *Track_Walls, Point_2D *Track_Flags, Map_Data map_info, N5110 &LCD) |
HenryWTriff | 2:d08b6a1eaf2b | 34 | { |
HenryWTriff | 2:d08b6a1eaf2b | 35 | |
HenryWTriff | 3:ceed6d026b8b | 36 | Line_2D Track_Lines_Transformed[map_info.number_of_track_lines]; |
HenryWTriff | 3:ceed6d026b8b | 37 | Line_2D Track_Dotted_Lines_Transformed[map_info.number_of_dotted_lines]; |
HenryWTriff | 3:ceed6d026b8b | 38 | Point_2D Transformed_Flags[map_info.number_of_flags]; |
HenryWTriff | 5:2d9f3c36bcb9 | 39 | Line_2D Transformed_Walls[map_info.number_of_walls]; |
HenryWTriff | 3:ceed6d026b8b | 40 | |
HenryWTriff | 3:ceed6d026b8b | 41 | for(int i = 0; i < map_info.number_of_track_lines; i++) { |
HenryWTriff | 2:d08b6a1eaf2b | 42 | Track_Lines_Transformed[i] = Track_Lines[i]; |
HenryWTriff | 2:d08b6a1eaf2b | 43 | //Translation |
HenryWTriff | 2:d08b6a1eaf2b | 44 | Track_Lines_Transformed[i].from = Translate_Point(Track_Lines_Transformed[i].from, Round(translation.x), Round(translation.y)); |
HenryWTriff | 2:d08b6a1eaf2b | 45 | Track_Lines_Transformed[i].to = Translate_Point(Track_Lines_Transformed[i].to, Round(translation.x), Round(translation.y)); |
HenryWTriff | 2:d08b6a1eaf2b | 46 | //Rotation |
HenryWTriff | 2:d08b6a1eaf2b | 47 | Track_Lines_Transformed[i].from = Rotate_Point(Track_Lines_Transformed[i].from, angle); |
HenryWTriff | 2:d08b6a1eaf2b | 48 | Track_Lines_Transformed[i].to = Rotate_Point(Track_Lines_Transformed[i].to, angle); |
HenryWTriff | 2:d08b6a1eaf2b | 49 | //Squish |
HenryWTriff | 2:d08b6a1eaf2b | 50 | Track_Lines_Transformed[i].from = Squish_Point(Track_Lines_Transformed[i].from, squish); |
HenryWTriff | 2:d08b6a1eaf2b | 51 | Track_Lines_Transformed[i].to = Squish_Point(Track_Lines_Transformed[i].to, squish); |
HenryWTriff | 2:d08b6a1eaf2b | 52 | } |
HenryWTriff | 2:d08b6a1eaf2b | 53 | |
HenryWTriff | 3:ceed6d026b8b | 54 | for(int i = 0; i < map_info.number_of_dotted_lines; i++) { |
HenryWTriff | 3:ceed6d026b8b | 55 | Track_Dotted_Lines_Transformed[i] = Track_Dotted_Lines[i]; |
HenryWTriff | 3:ceed6d026b8b | 56 | //Translation |
HenryWTriff | 3:ceed6d026b8b | 57 | Track_Dotted_Lines_Transformed[i].from = Translate_Point(Track_Dotted_Lines_Transformed[i].from, Round(translation.x), Round(translation.y)); |
HenryWTriff | 3:ceed6d026b8b | 58 | Track_Dotted_Lines_Transformed[i].to = Translate_Point(Track_Dotted_Lines_Transformed[i].to, Round(translation.x), Round(translation.y)); |
HenryWTriff | 3:ceed6d026b8b | 59 | //Rotation |
HenryWTriff | 3:ceed6d026b8b | 60 | Track_Dotted_Lines_Transformed[i].from = Rotate_Point(Track_Dotted_Lines_Transformed[i].from, angle); |
HenryWTriff | 3:ceed6d026b8b | 61 | Track_Dotted_Lines_Transformed[i].to = Rotate_Point(Track_Dotted_Lines_Transformed[i].to, angle); |
HenryWTriff | 3:ceed6d026b8b | 62 | //Squish |
HenryWTriff | 3:ceed6d026b8b | 63 | Track_Dotted_Lines_Transformed[i].from = Squish_Point(Track_Dotted_Lines_Transformed[i].from, squish); |
HenryWTriff | 3:ceed6d026b8b | 64 | Track_Dotted_Lines_Transformed[i].to = Squish_Point(Track_Dotted_Lines_Transformed[i].to, squish); |
HenryWTriff | 3:ceed6d026b8b | 65 | } |
HenryWTriff | 3:ceed6d026b8b | 66 | |
HenryWTriff | 3:ceed6d026b8b | 67 | for(int i = 0; i < map_info.number_of_flags; i++) { |
HenryWTriff | 3:ceed6d026b8b | 68 | Transformed_Flags[i] = Track_Flags[i]; |
HenryWTriff | 3:ceed6d026b8b | 69 | //Translation |
HenryWTriff | 3:ceed6d026b8b | 70 | Transformed_Flags[i] = Translate_Point(Transformed_Flags[i], Round(translation.x), Round(translation.y)); |
HenryWTriff | 3:ceed6d026b8b | 71 | //Rotation |
HenryWTriff | 3:ceed6d026b8b | 72 | Transformed_Flags[i] = Rotate_Point(Transformed_Flags[i], angle); |
HenryWTriff | 3:ceed6d026b8b | 73 | //Squish |
HenryWTriff | 3:ceed6d026b8b | 74 | Transformed_Flags[i] = Squish_Point(Transformed_Flags[i], squish); |
HenryWTriff | 3:ceed6d026b8b | 75 | } |
HenryWTriff | 3:ceed6d026b8b | 76 | |
HenryWTriff | 5:2d9f3c36bcb9 | 77 | for(int i = 0; i < map_info.number_of_walls; i++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 78 | Transformed_Walls[i] = Track_Walls[i]; |
HenryWTriff | 5:2d9f3c36bcb9 | 79 | //Translation |
HenryWTriff | 5:2d9f3c36bcb9 | 80 | Transformed_Walls[i].from = Translate_Point(Transformed_Walls[i].from, Round(translation.x), Round(translation.y)); |
HenryWTriff | 5:2d9f3c36bcb9 | 81 | Transformed_Walls[i].to = Translate_Point(Transformed_Walls[i].to, Round(translation.x), Round(translation.y)); |
HenryWTriff | 5:2d9f3c36bcb9 | 82 | //Rotation |
HenryWTriff | 5:2d9f3c36bcb9 | 83 | Transformed_Walls[i].from = Rotate_Point(Transformed_Walls[i].from, angle); |
HenryWTriff | 5:2d9f3c36bcb9 | 84 | Transformed_Walls[i].to = Rotate_Point(Transformed_Walls[i].to, angle); |
HenryWTriff | 5:2d9f3c36bcb9 | 85 | //Squish |
HenryWTriff | 5:2d9f3c36bcb9 | 86 | Transformed_Walls[i].from = Squish_Point(Transformed_Walls[i].from, squish); |
HenryWTriff | 5:2d9f3c36bcb9 | 87 | Transformed_Walls[i].to = Squish_Point(Transformed_Walls[i].to, squish); |
HenryWTriff | 5:2d9f3c36bcb9 | 88 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 89 | |
HenryWTriff | 3:ceed6d026b8b | 90 | for(int i = 0; i < map_info.number_of_track_lines; i++) { |
HenryWTriff | 2:d08b6a1eaf2b | 91 | Graphics_Draw_Line(Track_Lines_Transformed[i].from, Track_Lines_Transformed[i].to, true, LCD); |
HenryWTriff | 2:d08b6a1eaf2b | 92 | } |
HenryWTriff | 3:ceed6d026b8b | 93 | |
HenryWTriff | 3:ceed6d026b8b | 94 | for(int i = 0; i < map_info.number_of_dotted_lines; i++) { |
HenryWTriff | 3:ceed6d026b8b | 95 | Graphics_Draw_Line(Track_Dotted_Lines_Transformed[i].from, Track_Dotted_Lines_Transformed[i].to,false, LCD); |
HenryWTriff | 3:ceed6d026b8b | 96 | } |
HenryWTriff | 3:ceed6d026b8b | 97 | |
HenryWTriff | 3:ceed6d026b8b | 98 | for(int i = 0; i < map_info.number_of_flags; i++) { |
HenryWTriff | 3:ceed6d026b8b | 99 | Graphics_Draw_Sprite(Transformed_Flags[i], 8, 8, (int *)flag, LCD); |
HenryWTriff | 3:ceed6d026b8b | 100 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 101 | |
HenryWTriff | 5:2d9f3c36bcb9 | 102 | for(int i = 0; i < map_info.number_of_walls; i++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 103 | Graphics_Draw_Wall(Transformed_Walls[i].from, Transformed_Walls[i].to,4, LCD); |
HenryWTriff | 5:2d9f3c36bcb9 | 104 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 105 | |
HenryWTriff | 4:9f41fc1c2ad1 | 106 | Point_2D car_position = {4,0}; |
HenryWTriff | 4:9f41fc1c2ad1 | 107 | Graphics_Draw_Sprite(car_position,8,8,(int *)car, LCD); |
HenryWTriff | 2:d08b6a1eaf2b | 108 | } |
HenryWTriff | 2:d08b6a1eaf2b | 109 | |
HenryWTriff | 2:d08b6a1eaf2b | 110 | //******************* |
HenryWTriff | 2:d08b6a1eaf2b | 111 | // SCREEN SETTINGS |
HenryWTriff | 2:d08b6a1eaf2b | 112 | //******************* |
HenryWTriff | 2:d08b6a1eaf2b | 113 | |
HenryWTriff | 2:d08b6a1eaf2b | 114 | void Graphics::Change_Contrast(N5110 &LCD, Gamepad &Device) |
HenryWTriff | 2:d08b6a1eaf2b | 115 | { |
HenryWTriff | 2:d08b6a1eaf2b | 116 | LCD.setContrast((0.35 + 0.2 * Device.read_pot1())); |
HenryWTriff | 2:d08b6a1eaf2b | 117 | } |
HenryWTriff | 2:d08b6a1eaf2b | 118 | |
HenryWTriff | 5:2d9f3c36bcb9 | 119 | //******************** |
HenryWTriff | 5:2d9f3c36bcb9 | 120 | // DRAW LAP COUNTER |
HenryWTriff | 5:2d9f3c36bcb9 | 121 | //******************** |
HenryWTriff | 5:2d9f3c36bcb9 | 122 | |
HenryWTriff | 5:2d9f3c36bcb9 | 123 | void Graphics::Draw_Laps(int laps, N5110 &LCD) |
HenryWTriff | 5:2d9f3c36bcb9 | 124 | { |
HenryWTriff | 5:2d9f3c36bcb9 | 125 | if(laps == 1) { |
HenryWTriff | 5:2d9f3c36bcb9 | 126 | LCD.printString("1",0,5); |
HenryWTriff | 5:2d9f3c36bcb9 | 127 | } else if (laps == 2) { |
HenryWTriff | 5:2d9f3c36bcb9 | 128 | LCD.printString("2",0,5); |
HenryWTriff | 5:2d9f3c36bcb9 | 129 | } else if (laps == 3) { |
HenryWTriff | 5:2d9f3c36bcb9 | 130 | LCD.printString("3",0,5); |
HenryWTriff | 5:2d9f3c36bcb9 | 131 | } else if (laps == 4) { |
HenryWTriff | 5:2d9f3c36bcb9 | 132 | LCD.printString("4",0,5); |
HenryWTriff | 5:2d9f3c36bcb9 | 133 | } else if (laps == 5) { |
HenryWTriff | 5:2d9f3c36bcb9 | 134 | LCD.printString("5",0,5); |
HenryWTriff | 5:2d9f3c36bcb9 | 135 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 136 | } |
HenryWTriff | 2:d08b6a1eaf2b | 137 | |
HenryWTriff | 2:d08b6a1eaf2b | 138 | //************** |
HenryWTriff | 2:d08b6a1eaf2b | 139 | // TRANSFORM |
HenryWTriff | 2:d08b6a1eaf2b | 140 | //************** |
HenryWTriff | 2:d08b6a1eaf2b | 141 | |
HenryWTriff | 2:d08b6a1eaf2b | 142 | //ROTATE |
HenryWTriff | 2:d08b6a1eaf2b | 143 | Point_2D Graphics::Rotate_Point(Point_2D point, float angle) |
HenryWTriff | 2:d08b6a1eaf2b | 144 | { |
HenryWTriff | 2:d08b6a1eaf2b | 145 | angle = (angle * PI)/180; |
HenryWTriff | 2:d08b6a1eaf2b | 146 | float x_rotated = point.x * cos(angle) - point.y * sin(angle); |
HenryWTriff | 2:d08b6a1eaf2b | 147 | float y_rotated = point.y * cos(angle) + point.x * sin(angle); |
HenryWTriff | 2:d08b6a1eaf2b | 148 | return {x_rotated, y_rotated}; |
HenryWTriff | 2:d08b6a1eaf2b | 149 | } |
HenryWTriff | 2:d08b6a1eaf2b | 150 | //TRANSLATE |
HenryWTriff | 2:d08b6a1eaf2b | 151 | Point_2D Graphics::Translate_Point(Point_2D point, int translate_x, int translate_y) |
HenryWTriff | 2:d08b6a1eaf2b | 152 | { |
HenryWTriff | 2:d08b6a1eaf2b | 153 | float x_translated = point.x - translate_x; |
HenryWTriff | 2:d08b6a1eaf2b | 154 | float y_translated = point.y - translate_y; |
HenryWTriff | 2:d08b6a1eaf2b | 155 | return {x_translated, y_translated}; |
HenryWTriff | 2:d08b6a1eaf2b | 156 | } |
HenryWTriff | 2:d08b6a1eaf2b | 157 | //SQUISH |
HenryWTriff | 2:d08b6a1eaf2b | 158 | Point_2D Graphics::Squish_Point(Point_2D point, float squish) |
HenryWTriff | 2:d08b6a1eaf2b | 159 | { |
HenryWTriff | 2:d08b6a1eaf2b | 160 | float x_squish = point.x; |
HenryWTriff | 2:d08b6a1eaf2b | 161 | float y_squish = point.y * squish; |
HenryWTriff | 2:d08b6a1eaf2b | 162 | return {x_squish, y_squish}; |
HenryWTriff | 2:d08b6a1eaf2b | 163 | } |
HenryWTriff | 2:d08b6a1eaf2b | 164 | |
HenryWTriff | 2:d08b6a1eaf2b | 165 | //******** |
HenryWTriff | 2:d08b6a1eaf2b | 166 | // MATH |
HenryWTriff | 2:d08b6a1eaf2b | 167 | //******** |
HenryWTriff | 2:d08b6a1eaf2b | 168 | |
HenryWTriff | 2:d08b6a1eaf2b | 169 | int Graphics::Round(float number) |
HenryWTriff | 2:d08b6a1eaf2b | 170 | { |
HenryWTriff | 2:d08b6a1eaf2b | 171 | int number_int = (number * 10); |
HenryWTriff | 2:d08b6a1eaf2b | 172 | int remainder = number_int % 10; |
HenryWTriff | 2:d08b6a1eaf2b | 173 | if(remainder < 5) { |
HenryWTriff | 2:d08b6a1eaf2b | 174 | return ((number_int - remainder) / 10); |
HenryWTriff | 2:d08b6a1eaf2b | 175 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 176 | return ((number_int + (10 - remainder)) / 10); |
HenryWTriff | 2:d08b6a1eaf2b | 177 | } |
HenryWTriff | 2:d08b6a1eaf2b | 178 | } |
HenryWTriff | 2:d08b6a1eaf2b | 179 | |
HenryWTriff | 2:d08b6a1eaf2b | 180 | float Graphics::Gradient(Point_2D from, Point_2D to) |
HenryWTriff | 2:d08b6a1eaf2b | 181 | { |
HenryWTriff | 2:d08b6a1eaf2b | 182 | float change_in_y = to.y - from.y; |
HenryWTriff | 2:d08b6a1eaf2b | 183 | float change_in_x = to.x - from.x; |
HenryWTriff | 2:d08b6a1eaf2b | 184 | float gradient = change_in_y / change_in_x; |
HenryWTriff | 2:d08b6a1eaf2b | 185 | if(gradient < 0.001 && gradient > -0.001) { |
HenryWTriff | 2:d08b6a1eaf2b | 186 | return 0; |
HenryWTriff | 2:d08b6a1eaf2b | 187 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 188 | return gradient; |
HenryWTriff | 2:d08b6a1eaf2b | 189 | } |
HenryWTriff | 2:d08b6a1eaf2b | 190 | } |
HenryWTriff | 2:d08b6a1eaf2b | 191 | |
HenryWTriff | 2:d08b6a1eaf2b | 192 | bool Graphics::Gradient_Check_Infinate(Point_2D from, Point_2D to) |
HenryWTriff | 2:d08b6a1eaf2b | 193 | { |
HenryWTriff | 2:d08b6a1eaf2b | 194 | float change_in_x = to.x - from.x; |
HenryWTriff | 2:d08b6a1eaf2b | 195 | if(change_in_x < 0.001 && change_in_x > -0.001) { |
HenryWTriff | 2:d08b6a1eaf2b | 196 | return true; |
HenryWTriff | 2:d08b6a1eaf2b | 197 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 198 | return false; |
HenryWTriff | 2:d08b6a1eaf2b | 199 | } |
HenryWTriff | 2:d08b6a1eaf2b | 200 | } |
HenryWTriff | 2:d08b6a1eaf2b | 201 | |
HenryWTriff | 3:ceed6d026b8b | 202 | //************* |
HenryWTriff | 3:ceed6d026b8b | 203 | // DRAW LINE |
HenryWTriff | 3:ceed6d026b8b | 204 | //************* |
HenryWTriff | 2:d08b6a1eaf2b | 205 | |
HenryWTriff | 2:d08b6a1eaf2b | 206 | void Graphics::Graphics_Draw_Line(Point_2D from, Point_2D to, bool solid, N5110 &LCD) //Draw a line between two points on only the portion of the screen |
HenryWTriff | 2:d08b6a1eaf2b | 207 | { |
HenryWTriff | 2:d08b6a1eaf2b | 208 | |
HenryWTriff | 2:d08b6a1eaf2b | 209 | if( Gradient_Check_Infinate(from, to) == false ) { //Checking to see if the line is vertical |
HenryWTriff | 2:d08b6a1eaf2b | 210 | Point_2D plot_x_from = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 211 | Point_2D plot_x_to = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 212 | Point_2D plot_y_from = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 213 | Point_2D plot_y_to = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 214 | |
HenryWTriff | 2:d08b6a1eaf2b | 215 | float gradient = Gradient(from, to); // Calculating the gradient |
HenryWTriff | 2:d08b6a1eaf2b | 216 | float y_intercept = (from.y - gradient * from.x); // Calulating the y intercept y - mx = c |
HenryWTriff | 2:d08b6a1eaf2b | 217 | float x_intercept = (from.x - from.y / gradient); // Calculating the x intercept x - y/m = d |
HenryWTriff | 2:d08b6a1eaf2b | 218 | |
HenryWTriff | 2:d08b6a1eaf2b | 219 | if(gradient <= 1 && gradient >= -1) { |
HenryWTriff | 2:d08b6a1eaf2b | 220 | //Reordering from and to so that the for loops below can use ++ |
HenryWTriff | 2:d08b6a1eaf2b | 221 | if(to.x < from.x) { |
HenryWTriff | 2:d08b6a1eaf2b | 222 | plot_x_from = to; |
HenryWTriff | 2:d08b6a1eaf2b | 223 | plot_x_to = from; |
HenryWTriff | 2:d08b6a1eaf2b | 224 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 225 | plot_x_from = from; |
HenryWTriff | 2:d08b6a1eaf2b | 226 | plot_x_to = to; |
HenryWTriff | 2:d08b6a1eaf2b | 227 | } |
HenryWTriff | 2:d08b6a1eaf2b | 228 | if(solid == true) { |
HenryWTriff | 2:d08b6a1eaf2b | 229 | for(int x = Round(plot_x_from.x); x <= Round(plot_x_to.x); x++) { //Iterating through the x points |
HenryWTriff | 2:d08b6a1eaf2b | 230 | int y = -(Round((gradient * x) + y_intercept)); //Calculating the value of y for each x point |
HenryWTriff | 2:d08b6a1eaf2b | 231 | Point_2D plot_x = {x+42, y+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 232 | if(plot_x.x <= 84 && plot_x.x >= 0 && plot_x.y <=48 && plot_x.y >= 0) { |
HenryWTriff | 2:d08b6a1eaf2b | 233 | LCD.setPixel(plot_x.x, plot_x.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 234 | } |
HenryWTriff | 2:d08b6a1eaf2b | 235 | } |
HenryWTriff | 2:d08b6a1eaf2b | 236 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 237 | for(int x = Round(plot_x_from.x); x <= Round(plot_x_to.x); x+=2) { //Iterating through the x points |
HenryWTriff | 2:d08b6a1eaf2b | 238 | int y = -(Round((gradient * x) + y_intercept)); //Calculating the value of y for each x point |
HenryWTriff | 2:d08b6a1eaf2b | 239 | Point_2D plot_x = {x+42, y+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 240 | if(plot_x.x <= 84 && plot_x.x >= 0 && plot_x.y <=48 && plot_x.y >= 0) { |
HenryWTriff | 2:d08b6a1eaf2b | 241 | LCD.setPixel(plot_x.x, plot_x.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 242 | } |
HenryWTriff | 2:d08b6a1eaf2b | 243 | } |
HenryWTriff | 2:d08b6a1eaf2b | 244 | } |
HenryWTriff | 2:d08b6a1eaf2b | 245 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 246 | if(to.y < from.y) { |
HenryWTriff | 2:d08b6a1eaf2b | 247 | plot_y_from = to; |
HenryWTriff | 2:d08b6a1eaf2b | 248 | plot_y_to = from; |
HenryWTriff | 2:d08b6a1eaf2b | 249 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 250 | plot_y_from = from; |
HenryWTriff | 2:d08b6a1eaf2b | 251 | plot_y_to = to; |
HenryWTriff | 2:d08b6a1eaf2b | 252 | } |
HenryWTriff | 2:d08b6a1eaf2b | 253 | if(solid == true) { |
HenryWTriff | 2:d08b6a1eaf2b | 254 | for(int y = Round(plot_y_from.y); y <= Round(plot_y_to.y); y++) { //Iterating through the Y points |
HenryWTriff | 2:d08b6a1eaf2b | 255 | int x = Round((y / gradient) + x_intercept); //Calculating the value of x for every y point |
HenryWTriff | 2:d08b6a1eaf2b | 256 | Point_2D plot_y = {x+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 257 | if(plot_y.x <= 84 && plot_y.x >= 0 && plot_y.y <=48 && plot_y.y >= 0) { |
HenryWTriff | 2:d08b6a1eaf2b | 258 | LCD.setPixel(plot_y.x, plot_y.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 259 | } |
HenryWTriff | 2:d08b6a1eaf2b | 260 | } |
HenryWTriff | 2:d08b6a1eaf2b | 261 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 262 | for(int y = Round(plot_y_from.y); y <= Round(plot_y_to.y); y+=2) { //Iterating through the Y points |
HenryWTriff | 2:d08b6a1eaf2b | 263 | int x = Round((y / gradient) + x_intercept); //Calculating the value of x for every y point |
HenryWTriff | 2:d08b6a1eaf2b | 264 | Point_2D plot_y = {x+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 265 | if(plot_y.x <= 84 && plot_y.x >= 0 && plot_y.y <=48 && plot_y.y >= 0) { |
HenryWTriff | 2:d08b6a1eaf2b | 266 | LCD.setPixel(plot_y.x, plot_y.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 267 | } |
HenryWTriff | 2:d08b6a1eaf2b | 268 | } |
HenryWTriff | 2:d08b6a1eaf2b | 269 | } |
HenryWTriff | 2:d08b6a1eaf2b | 270 | } |
HenryWTriff | 2:d08b6a1eaf2b | 271 | |
HenryWTriff | 2:d08b6a1eaf2b | 272 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 273 | Point_2D plot_y_from = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 274 | Point_2D plot_y_to = {0,0}; |
HenryWTriff | 2:d08b6a1eaf2b | 275 | //Reordering from and to so that the for loops below can use ++ |
HenryWTriff | 2:d08b6a1eaf2b | 276 | if(to.y < from.y) { |
HenryWTriff | 2:d08b6a1eaf2b | 277 | plot_y_from = to; |
HenryWTriff | 2:d08b6a1eaf2b | 278 | plot_y_to = from; |
HenryWTriff | 2:d08b6a1eaf2b | 279 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 280 | plot_y_from = from; |
HenryWTriff | 2:d08b6a1eaf2b | 281 | plot_y_to = to; |
HenryWTriff | 2:d08b6a1eaf2b | 282 | } |
HenryWTriff | 2:d08b6a1eaf2b | 283 | float x_intercept = from.x; //Calculating the x_intercept |
HenryWTriff | 2:d08b6a1eaf2b | 284 | if(solid == true) { |
HenryWTriff | 2:d08b6a1eaf2b | 285 | for(int y = plot_y_from.y; y <= plot_y_to.y; y++) { |
HenryWTriff | 2:d08b6a1eaf2b | 286 | Point_2D plot_y = {x_intercept+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 287 | LCD.setPixel(plot_y.x, plot_y.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 288 | } |
HenryWTriff | 2:d08b6a1eaf2b | 289 | } else { |
HenryWTriff | 2:d08b6a1eaf2b | 290 | for(int y = plot_y_from.y; y <= plot_y_to.y; y+=2) { |
HenryWTriff | 2:d08b6a1eaf2b | 291 | Point_2D plot_y = {x_intercept+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 2:d08b6a1eaf2b | 292 | LCD.setPixel(plot_y.x, plot_y.y, true); //Plotting the points |
HenryWTriff | 2:d08b6a1eaf2b | 293 | } |
HenryWTriff | 2:d08b6a1eaf2b | 294 | } |
HenryWTriff | 2:d08b6a1eaf2b | 295 | } |
HenryWTriff | 3:ceed6d026b8b | 296 | } |
HenryWTriff | 3:ceed6d026b8b | 297 | |
HenryWTriff | 3:ceed6d026b8b | 298 | //*************** |
HenryWTriff | 3:ceed6d026b8b | 299 | // DRAW SPRITE |
HenryWTriff | 3:ceed6d026b8b | 300 | //*************** |
HenryWTriff | 3:ceed6d026b8b | 301 | |
HenryWTriff | 3:ceed6d026b8b | 302 | void Graphics::Graphics_Draw_Sprite(Point_2D point, int x_size, int y_size, int *sprite, N5110 &LCD) |
HenryWTriff | 3:ceed6d026b8b | 303 | { |
HenryWTriff | 3:ceed6d026b8b | 304 | Point_2D zeroed_point = {Round(point.x) + 42 - x_size, Round(-point.y) + 36 - y_size}; |
HenryWTriff | 3:ceed6d026b8b | 305 | if(zeroed_point.x <= 84 && zeroed_point.x >= 0 && zeroed_point.y <= 48 && zeroed_point.y >= 0) { |
HenryWTriff | 3:ceed6d026b8b | 306 | for(int y = 0; y < y_size; y++) { |
HenryWTriff | 3:ceed6d026b8b | 307 | for(int x = 0; x < x_size; x++) { |
HenryWTriff | 3:ceed6d026b8b | 308 | if(*((sprite + y*y_size)+x) == 1) { |
HenryWTriff | 3:ceed6d026b8b | 309 | LCD.setPixel((zeroed_point.x + x), (zeroed_point.y + y), true); |
HenryWTriff | 3:ceed6d026b8b | 310 | } else if(*((sprite + y*y_size)+x) == 0) { |
HenryWTriff | 3:ceed6d026b8b | 311 | LCD.setPixel((zeroed_point.x + x), (zeroed_point.y + y), false); |
HenryWTriff | 3:ceed6d026b8b | 312 | } |
HenryWTriff | 3:ceed6d026b8b | 313 | } |
HenryWTriff | 3:ceed6d026b8b | 314 | } |
HenryWTriff | 3:ceed6d026b8b | 315 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 316 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 317 | |
HenryWTriff | 5:2d9f3c36bcb9 | 318 | //*************** |
HenryWTriff | 5:2d9f3c36bcb9 | 319 | // DRAW WALL |
HenryWTriff | 5:2d9f3c36bcb9 | 320 | //*************** |
HenryWTriff | 5:2d9f3c36bcb9 | 321 | |
HenryWTriff | 5:2d9f3c36bcb9 | 322 | void Graphics::Graphics_Draw_Wall(Point_2D from, Point_2D to, int height, N5110 &LCD) //Draw a line between two points on only the portion of the screen |
HenryWTriff | 5:2d9f3c36bcb9 | 323 | { |
HenryWTriff | 5:2d9f3c36bcb9 | 324 | if(Gradient_Check_Infinate(from, to) == 0) { //Checking to see if the line is vertical |
HenryWTriff | 5:2d9f3c36bcb9 | 325 | Point_2D plot_x_from = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 326 | Point_2D plot_x_to = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 327 | Point_2D plot_y_from = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 328 | Point_2D plot_y_to = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 329 | |
HenryWTriff | 5:2d9f3c36bcb9 | 330 | float gradient = Gradient(from, to); // Calculating the gradient |
HenryWTriff | 5:2d9f3c36bcb9 | 331 | float y_intercept = (from.y - gradient * from.x); // Calulating the y intercept y - mx = c |
HenryWTriff | 5:2d9f3c36bcb9 | 332 | float x_intercept = (from.x - from.y / gradient); // Calculating the x intercept x - y/m = d |
HenryWTriff | 5:2d9f3c36bcb9 | 333 | |
HenryWTriff | 5:2d9f3c36bcb9 | 334 | if(gradient <= 1 && gradient >= -1) { |
HenryWTriff | 5:2d9f3c36bcb9 | 335 | //Reordering from and to so that the for loops below can use ++ |
HenryWTriff | 5:2d9f3c36bcb9 | 336 | if(to.x < from.x) { |
HenryWTriff | 5:2d9f3c36bcb9 | 337 | plot_x_from = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 338 | plot_x_to = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 339 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 340 | plot_x_from = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 341 | plot_x_to = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 342 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 343 | for(int x = Round(plot_x_from.x); x <= Round(plot_x_to.x); x++) { //Iterating through the x points |
HenryWTriff | 5:2d9f3c36bcb9 | 344 | int y = -(Round((gradient * x) + y_intercept)); //Calculating the value of y for each x point |
HenryWTriff | 5:2d9f3c36bcb9 | 345 | Point_2D plot_x = {x+42, y+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 5:2d9f3c36bcb9 | 346 | if(plot_x.x <= 84 && plot_x.x >= 0 && plot_x.y <=48 && plot_x.y >= 0) { |
HenryWTriff | 5:2d9f3c36bcb9 | 347 | for(int y_add = 0; y_add < height; y_add++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 348 | LCD.setPixel(plot_x.x, plot_x.y - y_add, true); |
HenryWTriff | 5:2d9f3c36bcb9 | 349 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 350 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 351 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 352 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 353 | if(to.y < from.y) { |
HenryWTriff | 5:2d9f3c36bcb9 | 354 | plot_y_from = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 355 | plot_y_to = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 356 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 357 | plot_y_from = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 358 | plot_y_to = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 359 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 360 | for(int y = Round(plot_y_from.y); y <= Round(plot_y_to.y); y++) { //Iterating through the Y points |
HenryWTriff | 5:2d9f3c36bcb9 | 361 | int x = Round((y / gradient) + x_intercept); //Calculating the value of x for every y point |
HenryWTriff | 5:2d9f3c36bcb9 | 362 | Point_2D plot_y = {x+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 5:2d9f3c36bcb9 | 363 | if(plot_y.x <= 84 && plot_y.x >= 0 && plot_y.y <=48 && plot_y.y >= 0) { |
HenryWTriff | 5:2d9f3c36bcb9 | 364 | for(int y_add = 0; y_add < height; y_add++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 365 | LCD.setPixel(plot_y.x, plot_y.y - y_add, true); |
HenryWTriff | 5:2d9f3c36bcb9 | 366 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 367 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 368 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 369 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 370 | |
HenryWTriff | 5:2d9f3c36bcb9 | 371 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 372 | Point_2D plot_y_from = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 373 | Point_2D plot_y_to = {0,0}; |
HenryWTriff | 5:2d9f3c36bcb9 | 374 | //Reordering from and to so that the for loops below can use ++ |
HenryWTriff | 5:2d9f3c36bcb9 | 375 | if(to.y < from.y) { |
HenryWTriff | 5:2d9f3c36bcb9 | 376 | plot_y_from = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 377 | plot_y_to = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 378 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 379 | plot_y_from = from; |
HenryWTriff | 5:2d9f3c36bcb9 | 380 | plot_y_to = to; |
HenryWTriff | 5:2d9f3c36bcb9 | 381 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 382 | float x_intercept = from.x; //Calculating the x_intercept |
HenryWTriff | 5:2d9f3c36bcb9 | 383 | for(int y = plot_y_from.y; y <= plot_y_to.y; y++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 384 | Point_2D plot_y = {x_intercept+42, (-y)+36}; //Assigning them to a Plot_2D variable and transforming so the centre of the screen is 0,0 |
HenryWTriff | 5:2d9f3c36bcb9 | 385 | for(int y_add = 0; y_add < height; y_add++) { |
HenryWTriff | 5:2d9f3c36bcb9 | 386 | LCD.setPixel(plot_y.x, plot_y.y - y_add, true); |
HenryWTriff | 5:2d9f3c36bcb9 | 387 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 388 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 389 | |
HenryWTriff | 5:2d9f3c36bcb9 | 390 | } |
HenryWTriff | 2:d08b6a1eaf2b | 391 | } |