Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Mechanics/Mechanics.cpp@6:5f76dd718dc3, 2020-02-19 (annotated)
- Committer:
- HenryWTriff
- Date:
- Wed Feb 19 21:40:21 2020 +0000
- Revision:
- 6:5f76dd718dc3
- Parent:
- 5:2d9f3c36bcb9
- Child:
- 7:2ce6e90f6d47
Ghost Racing added, Gyro steering and boost plates
Who changed what in which revision?
User | Revision | Line number | New 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 | |
HenryWTriff | 5:2d9f3c36bcb9 | 123 | 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 | 124 | return next_gate; |
HenryWTriff | 5:2d9f3c36bcb9 | 125 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 126 | |
HenryWTriff | 5:2d9f3c36bcb9 | 127 | return current_gate; |
HenryWTriff | 5:2d9f3c36bcb9 | 128 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 129 | |
HenryWTriff | 5:2d9f3c36bcb9 | 130 | int Mechanics::Get_Laps(int laps, Square_2D gates[], int number_of_gates, Point_2D position, int current_gate) |
HenryWTriff | 5:2d9f3c36bcb9 | 131 | { |
HenryWTriff | 5:2d9f3c36bcb9 | 132 | int next_gate; |
HenryWTriff | 5:2d9f3c36bcb9 | 133 | |
HenryWTriff | 5:2d9f3c36bcb9 | 134 | if(current_gate + 1 <= (number_of_gates - 1)) { |
HenryWTriff | 5:2d9f3c36bcb9 | 135 | next_gate = current_gate + 1; |
HenryWTriff | 5:2d9f3c36bcb9 | 136 | } else { |
HenryWTriff | 5:2d9f3c36bcb9 | 137 | next_gate = 0; |
HenryWTriff | 5:2d9f3c36bcb9 | 138 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 139 | 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 | 140 | if(next_gate == 0) { |
HenryWTriff | 5:2d9f3c36bcb9 | 141 | laps++; |
HenryWTriff | 5:2d9f3c36bcb9 | 142 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 143 | } |
HenryWTriff | 5:2d9f3c36bcb9 | 144 | return laps; |
HenryWTriff | 6:5f76dd718dc3 | 145 | } |
HenryWTriff | 6:5f76dd718dc3 | 146 | |
HenryWTriff | 6:5f76dd718dc3 | 147 | Time Mechanics::Convert_To_Time(int game_fps, int number_of_frames) |
HenryWTriff | 6:5f76dd718dc3 | 148 | { |
HenryWTriff | 6:5f76dd718dc3 | 149 | int total_seconds = float(number_of_frames) / float(game_fps); |
HenryWTriff | 6:5f76dd718dc3 | 150 | int seconds = total_seconds % 60; |
HenryWTriff | 6:5f76dd718dc3 | 151 | float miliseconds_decimal = (float(number_of_frames) / float(game_fps)) - seconds; |
HenryWTriff | 6:5f76dd718dc3 | 152 | int miliseconds = float(miliseconds_decimal * 1000); |
HenryWTriff | 6:5f76dd718dc3 | 153 | int minuites = (total_seconds - seconds) / 60; |
HenryWTriff | 6:5f76dd718dc3 | 154 | return {minuites, seconds, miliseconds}; |
HenryWTriff | 6:5f76dd718dc3 | 155 | } |
HenryWTriff | 6:5f76dd718dc3 | 156 | |
HenryWTriff | 6:5f76dd718dc3 | 157 | //*************** |
HenryWTriff | 6:5f76dd718dc3 | 158 | // BOOST PLATE |
HenryWTriff | 6:5f76dd718dc3 | 159 | //*************** |
HenryWTriff | 6:5f76dd718dc3 | 160 | |
HenryWTriff | 6:5f76dd718dc3 | 161 | float Mechanics::Get_Boost_Speed(Triangle_2D plates[], int number_of_plates, Point_2D position, float speed) |
HenryWTriff | 6:5f76dd718dc3 | 162 | { |
HenryWTriff | 6:5f76dd718dc3 | 163 | for(int i = 0; i < number_of_plates; i++) { |
HenryWTriff | 6:5f76dd718dc3 | 164 | if(position.x > plates[i].TL.x && position.x < plates[i].BR.x && position.y < plates[i].TL.y && position.y > plates[i].BR.y) { |
HenryWTriff | 6:5f76dd718dc3 | 165 | speed = 6; |
HenryWTriff | 6:5f76dd718dc3 | 166 | } |
HenryWTriff | 6:5f76dd718dc3 | 167 | } |
HenryWTriff | 6:5f76dd718dc3 | 168 | return speed; |
HenryWTriff | 6:5f76dd718dc3 | 169 | } |
HenryWTriff | 6:5f76dd718dc3 | 170 | |
HenryWTriff | 6:5f76dd718dc3 | 171 | |
HenryWTriff | 6:5f76dd718dc3 | 172 | |
HenryWTriff | 6:5f76dd718dc3 | 173 | |
HenryWTriff | 6:5f76dd718dc3 | 174 | |
HenryWTriff | 6:5f76dd718dc3 | 175 | |
HenryWTriff | 6:5f76dd718dc3 | 176 | |
HenryWTriff | 6:5f76dd718dc3 | 177 | |
HenryWTriff | 6:5f76dd718dc3 | 178 | |
HenryWTriff | 6:5f76dd718dc3 | 179 | |
HenryWTriff | 6:5f76dd718dc3 | 180 |