Henry Triff / Mbed 2 deprecated ELEC2645_Project_el18ht

Dependencies:   mbed

Committer:
HenryWTriff
Date:
Tue Feb 11 17:28:56 2020 +0000
Revision:
5:2d9f3c36bcb9
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 5:2d9f3c36bcb9 1 #include "Mechanics.h"
HenryWTriff 5:2d9f3c36bcb9 2
HenryWTriff 5:2d9f3c36bcb9 3 bool Mechanics::Is_Offtrack(Point_2D position, Square_2D offtrack_square[], Triangle_2D offtrack_triangle[], Map_Data map_info)
HenryWTriff 5:2d9f3c36bcb9 4 {
HenryWTriff 5:2d9f3c36bcb9 5 return (Is_Offtrack_Square(offtrack_square, map_info.number_of_off_track_triangles, position) || Is_Offtrack_Triangle(offtrack_triangle, map_info.number_of_off_track_triangles, position));
HenryWTriff 5:2d9f3c36bcb9 6 }
HenryWTriff 5:2d9f3c36bcb9 7
HenryWTriff 5:2d9f3c36bcb9 8 bool Mechanics::Is_Out_Of_Bounds(Point_2D position, Square_2D offtrack_square[], Triangle_2D offtrack_triangle[], Map_Data map_info)
HenryWTriff 5:2d9f3c36bcb9 9 {
HenryWTriff 5:2d9f3c36bcb9 10 return (Is_Out_Of_Bounds_Square(offtrack_square, map_info.number_of_out_of_bounds_squares, position) || Is_Out_Of_Bounds_Triangle(offtrack_triangle, map_info.number_of_out_of_bounds_triangles, position));
HenryWTriff 5:2d9f3c36bcb9 11 }
HenryWTriff 5:2d9f3c36bcb9 12
HenryWTriff 5:2d9f3c36bcb9 13 //*************
HenryWTriff 5:2d9f3c36bcb9 14 // OFF TRACK
HenryWTriff 5:2d9f3c36bcb9 15 //*************
HenryWTriff 5:2d9f3c36bcb9 16
HenryWTriff 5:2d9f3c36bcb9 17 bool Mechanics::Is_Offtrack_Square(Square_2D offtrack[], int size, Point_2D position)
HenryWTriff 5:2d9f3c36bcb9 18 {
HenryWTriff 5:2d9f3c36bcb9 19 for(int i = 0; i < size; i++) {
HenryWTriff 5:2d9f3c36bcb9 20 if(position.x > offtrack[i].TL.x && position.x < offtrack[i].BR.x && position.y < offtrack[i].TL.y && position.y > offtrack[i].BR.y ) {
HenryWTriff 5:2d9f3c36bcb9 21 return true;
HenryWTriff 5:2d9f3c36bcb9 22 }
HenryWTriff 5:2d9f3c36bcb9 23 }
HenryWTriff 5:2d9f3c36bcb9 24 return false;
HenryWTriff 5:2d9f3c36bcb9 25 }
HenryWTriff 5:2d9f3c36bcb9 26
HenryWTriff 5:2d9f3c36bcb9 27 bool Mechanics::Is_Offtrack_Triangle(Triangle_2D offtrack[], int size, Point_2D position)
HenryWTriff 5:2d9f3c36bcb9 28 {
HenryWTriff 5:2d9f3c36bcb9 29 for(int i = 0; i < size; i++) {
HenryWTriff 5:2d9f3c36bcb9 30 if(position.x > offtrack[i].TL.x && position.x < offtrack[i].BR.x && position.y < offtrack[i].TL.y && position.y > offtrack[i].BR.y ) {
HenryWTriff 5:2d9f3c36bcb9 31 if(offtrack[i].Type == 1) {
HenryWTriff 5:2d9f3c36bcb9 32 Point_2D Translated_position = {position.x - offtrack[i].TL.x, position.y - offtrack[i].TL.y};
HenryWTriff 5:2d9f3c36bcb9 33 float position_limit = (offtrack[i].BR.y - offtrack[i].TL.y) / (offtrack[i].BR.x - offtrack[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 34 if(Translated_position.y < position_limit) {
HenryWTriff 5:2d9f3c36bcb9 35 return true;
HenryWTriff 5:2d9f3c36bcb9 36 }
HenryWTriff 5:2d9f3c36bcb9 37 } else if(offtrack[i].Type == 2) {
HenryWTriff 5:2d9f3c36bcb9 38 Point_2D Translated_position = {position.x - offtrack[i].TL.x, position.y - offtrack[i].BR.y};
HenryWTriff 5:2d9f3c36bcb9 39 float position_limit = (offtrack[i].TL.y - offtrack[i].BR.y) / (offtrack[i].BR.x - offtrack[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 40 if(Translated_position.y > position_limit) {
HenryWTriff 5:2d9f3c36bcb9 41 return true;
HenryWTriff 5:2d9f3c36bcb9 42 }
HenryWTriff 5:2d9f3c36bcb9 43 } else if(offtrack[i].Type == 3) {
HenryWTriff 5:2d9f3c36bcb9 44 Point_2D Translated_position = {position.x - offtrack[i].TL.x, position.y - offtrack[i].TL.y};
HenryWTriff 5:2d9f3c36bcb9 45 float position_limit = (offtrack[i].BR.y - offtrack[i].TL.y) / (offtrack[i].BR.x - offtrack[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 46 if(Translated_position.y > position_limit) {
HenryWTriff 5:2d9f3c36bcb9 47 return true;
HenryWTriff 5:2d9f3c36bcb9 48 }
HenryWTriff 5:2d9f3c36bcb9 49 } else if(offtrack[i].Type == 4) {
HenryWTriff 5:2d9f3c36bcb9 50 Point_2D Translated_position = {position.x - offtrack[i].TL.x, position.y - offtrack[i].BR.y};
HenryWTriff 5:2d9f3c36bcb9 51 float position_limit = (offtrack[i].TL.y - offtrack[i].BR.y) / (offtrack[i].BR.x - offtrack[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 52 if(Translated_position.y < position_limit) {
HenryWTriff 5:2d9f3c36bcb9 53 return true;
HenryWTriff 5:2d9f3c36bcb9 54 }
HenryWTriff 5:2d9f3c36bcb9 55 }
HenryWTriff 5:2d9f3c36bcb9 56 }
HenryWTriff 5:2d9f3c36bcb9 57 }
HenryWTriff 5:2d9f3c36bcb9 58 return false;
HenryWTriff 5:2d9f3c36bcb9 59 }
HenryWTriff 5:2d9f3c36bcb9 60
HenryWTriff 5:2d9f3c36bcb9 61 //*****************
HenryWTriff 5:2d9f3c36bcb9 62 // OUT OF BOUNDS
HenryWTriff 5:2d9f3c36bcb9 63 //*****************
HenryWTriff 5:2d9f3c36bcb9 64
HenryWTriff 5:2d9f3c36bcb9 65 bool Mechanics::Is_Out_Of_Bounds_Square(Square_2D out_of_bounds[], int size, Point_2D position)
HenryWTriff 5:2d9f3c36bcb9 66 {
HenryWTriff 5:2d9f3c36bcb9 67 for(int i = 0; i < size; i++) {
HenryWTriff 5:2d9f3c36bcb9 68 if(position.x > out_of_bounds[i].TL.x && position.x < out_of_bounds[i].BR.x && position.y < out_of_bounds[i].TL.y && position.y > out_of_bounds[i].BR.y ) {
HenryWTriff 5:2d9f3c36bcb9 69 return true;
HenryWTriff 5:2d9f3c36bcb9 70 }
HenryWTriff 5:2d9f3c36bcb9 71 }
HenryWTriff 5:2d9f3c36bcb9 72 return false;
HenryWTriff 5:2d9f3c36bcb9 73 }
HenryWTriff 5:2d9f3c36bcb9 74
HenryWTriff 5:2d9f3c36bcb9 75 bool Mechanics::Is_Out_Of_Bounds_Triangle(Triangle_2D out_of_bounds[], int size, Point_2D position)
HenryWTriff 5:2d9f3c36bcb9 76 {
HenryWTriff 5:2d9f3c36bcb9 77 for(int i = 0; i < size; i++) {
HenryWTriff 5:2d9f3c36bcb9 78 if(position.x > out_of_bounds[i].TL.x && position.x < out_of_bounds[i].BR.x && position.y < out_of_bounds[i].TL.y && position.y > out_of_bounds[i].BR.y ) {
HenryWTriff 5:2d9f3c36bcb9 79 if(out_of_bounds[i].Type == 1) {
HenryWTriff 5:2d9f3c36bcb9 80 Point_2D Translated_position = {position.x - out_of_bounds[i].TL.x, position.y - out_of_bounds[i].TL.y};
HenryWTriff 5:2d9f3c36bcb9 81 float position_limit = (out_of_bounds[i].BR.y - out_of_bounds[i].TL.y) / (out_of_bounds[i].BR.x - out_of_bounds[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 82 if(Translated_position.y < position_limit) {
HenryWTriff 5:2d9f3c36bcb9 83 return true;
HenryWTriff 5:2d9f3c36bcb9 84 }
HenryWTriff 5:2d9f3c36bcb9 85 } else if(out_of_bounds[i].Type == 2) {
HenryWTriff 5:2d9f3c36bcb9 86 Point_2D Translated_position = {position.x - out_of_bounds[i].TL.x, position.y - out_of_bounds[i].BR.y};
HenryWTriff 5:2d9f3c36bcb9 87 float position_limit = (out_of_bounds[i].TL.y - out_of_bounds[i].BR.y) / (out_of_bounds[i].BR.x - out_of_bounds[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 88 if(Translated_position.y > position_limit) {
HenryWTriff 5:2d9f3c36bcb9 89 return true;
HenryWTriff 5:2d9f3c36bcb9 90 }
HenryWTriff 5:2d9f3c36bcb9 91 } else if(out_of_bounds[i].Type == 3) {
HenryWTriff 5:2d9f3c36bcb9 92 Point_2D Translated_position = {position.x - out_of_bounds[i].TL.x, position.y - out_of_bounds[i].TL.y};
HenryWTriff 5:2d9f3c36bcb9 93 float position_limit = (out_of_bounds[i].BR.y - out_of_bounds[i].TL.y) / (out_of_bounds[i].BR.x - out_of_bounds[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 94 if(Translated_position.y > position_limit) {
HenryWTriff 5:2d9f3c36bcb9 95 return true;
HenryWTriff 5:2d9f3c36bcb9 96 }
HenryWTriff 5:2d9f3c36bcb9 97 } else if(out_of_bounds[i].Type == 4) {
HenryWTriff 5:2d9f3c36bcb9 98 Point_2D Translated_position = {position.x - out_of_bounds[i].TL.x, position.y - out_of_bounds[i].BR.y};
HenryWTriff 5:2d9f3c36bcb9 99 float position_limit = (out_of_bounds[i].TL.y - out_of_bounds[i].BR.y) / (out_of_bounds[i].BR.x - out_of_bounds[i].TL.x) * Translated_position.x;
HenryWTriff 5:2d9f3c36bcb9 100 if(Translated_position.y < position_limit) {
HenryWTriff 5:2d9f3c36bcb9 101 return true;
HenryWTriff 5:2d9f3c36bcb9 102 }
HenryWTriff 5:2d9f3c36bcb9 103 }
HenryWTriff 5:2d9f3c36bcb9 104 }
HenryWTriff 5:2d9f3c36bcb9 105 }
HenryWTriff 5:2d9f3c36bcb9 106 return false;
HenryWTriff 5:2d9f3c36bcb9 107 }
HenryWTriff 5:2d9f3c36bcb9 108
HenryWTriff 5:2d9f3c36bcb9 109 //*********
HenryWTriff 5:2d9f3c36bcb9 110 // GATES
HenryWTriff 5:2d9f3c36bcb9 111 //*********
HenryWTriff 5:2d9f3c36bcb9 112
HenryWTriff 5:2d9f3c36bcb9 113 int Mechanics::Get_Gate(Square_2D gates[], int number_of_gates, Point_2D position, int current_gate)
HenryWTriff 5:2d9f3c36bcb9 114 {
HenryWTriff 5:2d9f3c36bcb9 115 int next_gate;
HenryWTriff 5:2d9f3c36bcb9 116
HenryWTriff 5:2d9f3c36bcb9 117 if(current_gate + 1 <= (number_of_gates - 1)) {
HenryWTriff 5:2d9f3c36bcb9 118 next_gate = current_gate + 1;
HenryWTriff 5:2d9f3c36bcb9 119 } else {
HenryWTriff 5:2d9f3c36bcb9 120 next_gate = 0;
HenryWTriff 5:2d9f3c36bcb9 121 }
HenryWTriff 5:2d9f3c36bcb9 122 printf("%i ",next_gate);
HenryWTriff 5:2d9f3c36bcb9 123
HenryWTriff 5:2d9f3c36bcb9 124 if(position.x >= gates[next_gate].TL.x && position.x <= gates[next_gate].BR.x && position.y <= gates[next_gate].TL.y && position.y >= gates[next_gate].BR.y) {
HenryWTriff 5:2d9f3c36bcb9 125 return next_gate;
HenryWTriff 5:2d9f3c36bcb9 126 }
HenryWTriff 5:2d9f3c36bcb9 127
HenryWTriff 5:2d9f3c36bcb9 128 return current_gate;
HenryWTriff 5:2d9f3c36bcb9 129 }
HenryWTriff 5:2d9f3c36bcb9 130
HenryWTriff 5:2d9f3c36bcb9 131 int Mechanics::Get_Laps(int laps, Square_2D gates[], int number_of_gates, Point_2D position, int current_gate)
HenryWTriff 5:2d9f3c36bcb9 132 {
HenryWTriff 5:2d9f3c36bcb9 133 int next_gate;
HenryWTriff 5:2d9f3c36bcb9 134
HenryWTriff 5:2d9f3c36bcb9 135 if(current_gate + 1 <= (number_of_gates - 1)) {
HenryWTriff 5:2d9f3c36bcb9 136 next_gate = current_gate + 1;
HenryWTriff 5:2d9f3c36bcb9 137 } else {
HenryWTriff 5:2d9f3c36bcb9 138 next_gate = 0;
HenryWTriff 5:2d9f3c36bcb9 139 }
HenryWTriff 5:2d9f3c36bcb9 140 if(position.x >= gates[next_gate].TL.x && position.x <= gates[next_gate].BR.x && position.y <= gates[next_gate].TL.y && position.y >= gates[next_gate].BR.y) {
HenryWTriff 5:2d9f3c36bcb9 141 if(next_gate == 0) {
HenryWTriff 5:2d9f3c36bcb9 142 laps++;
HenryWTriff 5:2d9f3c36bcb9 143 }
HenryWTriff 5:2d9f3c36bcb9 144 }
HenryWTriff 5:2d9f3c36bcb9 145 return laps;
HenryWTriff 5:2d9f3c36bcb9 146 }