Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }