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.
Dependencies: mbed
Detect/Detect.cpp@17:9f7ff626210b, 2019-05-09 (annotated)
- Committer:
- MYY
- Date:
- Thu May 09 05:08:02 2019 +0000
- Revision:
- 17:9f7ff626210b
- Parent:
- 12:777558372c67
Final submission, i guarantee there is no plagiarism in the project.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| MYY | 12:777558372c67 | 1 | #include"Detect.h" |
| MYY | 12:777558372c67 | 2 | |
| MYY | 12:777558372c67 | 3 | /* |
| MYY | 12:777558372c67 | 4 | The idea behind Detect: |
| MYY | 12:777558372c67 | 5 | |
| MYY | 12:777558372c67 | 6 | Due to the size of the screen, it will be too hard if we only say that the hook has hooked an object when the hook touches the object. |
| MYY | 12:777558372c67 | 7 | Instead we can draw a circle at hook point and another one at the centre of Gold/Rock. when this two circles are tangent with each other |
| MYY | 12:777558372c67 | 8 | we consider the hook has hooked a Gold/Rock. The radius for two circles are both 3.5. |
| MYY | 12:777558372c67 | 9 | |
| MYY | 12:777558372c67 | 10 | After confirmation that the hook has hooked a Gold/Rock, the hookpoint will be assigned the value of the centre point |
| MYY | 12:777558372c67 | 11 | and we use function pull_back()(within Pull class) to draw a line between (42,0) and pull back the Gold/Rock. |
| MYY | 12:777558372c67 | 12 | |
| MYY | 12:777558372c67 | 13 | level_1_x, level_1_y : Coordinates for gold/rock in level 1. Random coordinates will mess up with the difficulty of game. |
| MYY | 12:777558372c67 | 14 | level_1_X, level_1_Y : centre point for gold/rock which we will draw a circle with. |
| MYY | 17:9f7ff626210b | 15 | |
| MYY | 17:9f7ff626210b | 16 | !They are global variables stored in "Global_my" |
| MYY | 12:777558372c67 | 17 | |
| MYY | 12:777558372c67 | 18 | This is same for level 2 and level 3. |
| MYY | 12:777558372c67 | 19 | */ |
| MYY | 12:777558372c67 | 20 | |
| MYY | 12:777558372c67 | 21 | |
| MYY | 12:777558372c67 | 22 | int Detect::detect(Pull &Pull, N5110 &lcd, Image &Image, float angle, float distance_detect, InterruptIn &A, Tool &Tool, Rotate &Rotate) |
| MYY | 12:777558372c67 | 23 | { |
| MYY | 12:777558372c67 | 24 | for(int i=0; i<7; i=i+1) {//The number of rock and gold in level 1 altogether is 7. |
| MYY | 12:777558372c67 | 25 | float distance = lcd.calDistance(Rotate.hookpoint[0],Rotate.hookpoint[1],level_1_X[i],level_1_Y[i]);//calculate the distance between hookpoint and thecentre point. |
| MYY | 12:777558372c67 | 26 | if (distance < 7) {//if distance<7 which means two circles are tangent with each other. |
| MYY | 12:777558372c67 | 27 | float cos_value=(42-level_1_X[i])/lcd.calDistance(level_1_X[i],level_1_Y[i],42,0);//find out the cos value between the centre point and (42,0) |
| MYY | 12:777558372c67 | 28 | Rotate.hookpoint[0]= level_1_X[i],//let the hookpoint equals to the centre point |
| MYY | 12:777558372c67 | 29 | Rotate.hookpoint[1]= level_1_Y[i], |
| MYY | 12:777558372c67 | 30 | level_1_x[i]=100;//set the centre point and coordinates out of range so the Gold/Rock will not be drawed nor detected. |
| MYY | 12:777558372c67 | 31 | level_1_y[i]=100; |
| MYY | 12:777558372c67 | 32 | level_1_X[i]=100; |
| MYY | 12:777558372c67 | 33 | level_1_Y[i]=100; |
| MYY | 12:777558372c67 | 34 | angle = acos(cos_value);//use arccos function to calculate the angle bwtween the centre point and (42,0) |
| MYY | 12:777558372c67 | 35 | //printf("%f\n",angle);are used to test the angle |
| MYY | 12:777558372c67 | 36 | Pull.pull_back(lcd, Image, i, distance_detect, angle, A, Tool, Rotate);//pass the angle to pull_back function. |
| MYY | 12:777558372c67 | 37 | return 1;//if we detect a Gold/Rock and pull it back, we can return 1 so Release function before will break so we can go back to rotate stage again. |
| MYY | 12:777558372c67 | 38 | } else { |
| MYY | 12:777558372c67 | 39 | continue; |
| MYY | 12:777558372c67 | 40 | } |
| MYY | 12:777558372c67 | 41 | } |
| MYY | 12:777558372c67 | 42 | return 0;//if nothing is detected, the hook will keep going until it reached maximum length |
| MYY | 12:777558372c67 | 43 | } |
| MYY | 12:777558372c67 | 44 | |
| MYY | 12:777558372c67 | 45 | |
| MYY | 12:777558372c67 | 46 | // detect_2 and detect_3 use another set of coordinates and center point, draw different maps. |
| MYY | 12:777558372c67 | 47 | int Detect::detect_2(Pull &Pull, N5110 &lcd, Image &Image, float angle, float distance_detect, InterruptIn &A, Tool &Tool, Rotate &Rotate) |
| MYY | 12:777558372c67 | 48 | { |
| MYY | 12:777558372c67 | 49 | for(int i=0; i<10; i=i+1) { |
| MYY | 12:777558372c67 | 50 | float distance = lcd.calDistance(Rotate.hookpoint[0],Rotate.hookpoint[1],level_2_X[i],level_2_Y[i]); |
| MYY | 12:777558372c67 | 51 | if (distance < 7) { |
| MYY | 12:777558372c67 | 52 | float cos_value=(42-level_2_X[i])/lcd.calDistance(level_2_X[i],level_2_Y[i],42,0); |
| MYY | 12:777558372c67 | 53 | Rotate.hookpoint[0]= level_2_X[i], |
| MYY | 12:777558372c67 | 54 | Rotate.hookpoint[1]= level_2_Y[i], |
| MYY | 12:777558372c67 | 55 | level_2_x[i]=100; |
| MYY | 12:777558372c67 | 56 | level_2_y[i]=100; |
| MYY | 12:777558372c67 | 57 | level_2_X[i]=100; |
| MYY | 12:777558372c67 | 58 | level_2_Y[i]=100; |
| MYY | 12:777558372c67 | 59 | angle = acos(cos_value); |
| MYY | 12:777558372c67 | 60 | Pull.pull_back_2(lcd, Image, i, distance_detect, angle, A, Tool, Rotate); |
| MYY | 12:777558372c67 | 61 | return 1; |
| MYY | 12:777558372c67 | 62 | } else { |
| MYY | 12:777558372c67 | 63 | continue; |
| MYY | 12:777558372c67 | 64 | } |
| MYY | 12:777558372c67 | 65 | } |
| MYY | 12:777558372c67 | 66 | return 0; |
| MYY | 12:777558372c67 | 67 | } |
| MYY | 12:777558372c67 | 68 | |
| MYY | 12:777558372c67 | 69 | |
| MYY | 12:777558372c67 | 70 | |
| MYY | 12:777558372c67 | 71 | int Detect::detect_3(Pull &Pull, N5110 &lcd, Image &Image, float angle, float distance_detect, InterruptIn &A, Tool &Tool, Rotate &Rotate) |
| MYY | 12:777558372c67 | 72 | { |
| MYY | 12:777558372c67 | 73 | for(int i=0; i<12; i=i+1) { |
| MYY | 12:777558372c67 | 74 | float distance = lcd.calDistance(Rotate.hookpoint[0],Rotate.hookpoint[1],level_3_X[i],level_3_Y[i]); |
| MYY | 12:777558372c67 | 75 | if (distance < 7) { |
| MYY | 12:777558372c67 | 76 | float cos_value=(42-level_3_X[i])/lcd.calDistance(level_3_X[i],level_3_Y[i],42,0); |
| MYY | 12:777558372c67 | 77 | Rotate.hookpoint[0]= level_3_X[i], |
| MYY | 12:777558372c67 | 78 | Rotate.hookpoint[1]= level_3_Y[i], |
| MYY | 12:777558372c67 | 79 | level_3_x[i]=100; |
| MYY | 12:777558372c67 | 80 | level_3_y[i]=100; |
| MYY | 12:777558372c67 | 81 | level_3_X[i]=100; |
| MYY | 12:777558372c67 | 82 | level_3_Y[i]=100; |
| MYY | 12:777558372c67 | 83 | angle = acos(cos_value); |
| MYY | 12:777558372c67 | 84 | Pull.pull_back_3(lcd, Image, i, distance_detect, angle, A, Tool, Rotate); |
| MYY | 12:777558372c67 | 85 | return 1; |
| MYY | 12:777558372c67 | 86 | } else { |
| MYY | 12:777558372c67 | 87 | continue; |
| MYY | 12:777558372c67 | 88 | } |
| MYY | 12:777558372c67 | 89 | } |
| MYY | 12:777558372c67 | 90 | return 0; |
| MYY | 12:777558372c67 | 91 | } |