Library to calculate angles from positions and vice versa (also used for shooting angles)

Dependents:   includeair includeair calcul_Ueff2 Mesure_energie

Revision:
1:6cace9fdb088
Parent:
0:b8295c4b5793
Child:
2:b99fef8df97e
--- a/angleandposition.cpp	Thu Oct 15 11:19:39 2015 +0000
+++ b/angleandposition.cpp	Mon Oct 19 13:25:40 2015 +0000
@@ -1,43 +1,55 @@
 #include "angleandposition.h"
 #include "mbed.h"
 #include "math.h"
-#include <vector>
-using std::vector;
-
-Serial comp(USBTX,USBRX);
 
-const float bar1=260; // length bar 1 in mm
-const float bar2=342; // length bar 2 in mm
-const float y_position=225;// y positon of pod in mm
-const float y_punch=425;// y position when punched out in mm
-const float width_playfield=473; //width in mm
-const float base_spacing=105.29; //spacing between two dc motors at base
-const float number_steps=10;
-// make linspace of y positions
+const double bar1 = 260; // length bar 1 [mm]
+const double bar2 = 342; // length bar 2 [mm]
+const double base_spacing = 105.59; // spacing between the DC-motors [mm]
+const double pi = 3.1415926535897;
+
+double virt_bar_ref = sqrt(pow(bar2,2)- pow(bar1,2));
 
 
 angleandposition::angleandposition(void)
 {
-    float y_step=y_position;
-    vector<double> array;
-    double step = (y_punch-y_position) / (number_steps-1);
+
+}
+
+float angleandposition::positiontoangle1(float x_position, float y_position)//rigth arm
+{
+    double virt_bar_right = sqrt( pow(x_position-0.5*base_spacing,2) + pow(y_position,2) );
+
+    double d2_square = pow(bar1,2) - pow( ( pow(virt_bar_right,2) + pow(bar1,2) - pow(bar2,2) ) / (-2*virt_bar_right) ,2);
 
-    while(y_step <= y_punch) {
-        array.push_back(y_step);
-        y_step += step;           // could recode to better handle rounding errors
-        comp.printf("y= %f\n",y_step);
+    double d2 = sqrt(d2_square);
+    
+    double phi;
+    if (virt_bar_right <= virt_bar_ref) {
+        double   phi = pi-asin(d2/bar1);
+    } else {
+        double phi = asin(d2/bar1);
     }
+    double theta_r = phi + acos((x_position - 0.5*base_spacing)/virt_bar_right);
+    return theta_r;
 }
 
-float angleandposition::positiontoangle1(float x_position)
+float angleandposition::positiontoangle2(float x_position, float y_position)//left arm
 {
-    /* float virt_bar_right = sqrt((x_const-0.5.*base_spacing).^2 + y.^2);
-     return angle1;*/
-}
+    double virt_bar_left = sqrt(pow(x_position + 0.5*base_spacing ,2) + pow(y_position,2) );
+    
+    double d2_square = pow(bar1,2) - pow( ( pow(virt_bar_left,2) + pow(bar1,2) - pow(bar2,2) ) / (-2*virt_bar_left), 2);
+    
+    double d2 = sqrt(d2_square);
+    
+    double phi;
+    
+    if (virt_bar_left <= virt_bar_ref) {
+        double  phi = pi-asin(d2/bar1);
+    } else {
+        double phi = asin(d2/bar1);
+    }
 
-float angleandposition::positiontoangle2(float x_position)
-{
+    double theta_l = pi - phi - acos((x_position + 0.5*base_spacing)/virt_bar_left);
 
-
-    //return angle2;
+    return theta_l;
 }
\ No newline at end of file