00001 #include <inttypes.h>
00002 #include <math.h>
00003
00004 #include "shvars.h"
00005 #include "arc.h"
00006 #include "scale.h"
00007
00008
00009 static int16_t arc_step;
00010 static double arc_stepangle, arc_xc, arc_yc, arc_a0, arc_r, arc_phi;
00011
00012 int16_t arc_init() {
00013 arc_phi = numpad[2]*M_PI/180.0;
00014
00015 arc_stepangle = fabs(numpad[3]);
00016 if (arc_phi < 0) arc_stepangle = -arc_stepangle;
00017 arc_stepangle *= M_PI/180.0;
00018
00019 arc_step = 0;
00020 arc_xc = numpad[0];
00021 arc_yc = numpad[1];
00022 arc_a0 = atan2(user_loc.y-arc_yc, user_loc.x-arc_xc);
00023 if (arc_a0 < 0) arc_a0 += 2*M_PI;
00024
00025 arc_r = hypot(user_loc.x-arc_xc, user_loc.y-arc_yc);
00026
00027
00028
00029
00030 return arc_phi != 0.0 && arc_r != 0.0;
00031 }
00032
00033 uint8_t arc_next(int16_t* x, int16_t* y) {
00034 uint8_t cont = 1;
00035
00036 arc_step++;
00037 double alpha = arc_step*arc_stepangle;
00038 if (fabs(alpha) > fabs(arc_phi)) {
00039 alpha = arc_phi;
00040 cont = 0;
00041 }
00042 alpha += arc_a0;
00043
00044 double xd = arc_xc + arc_r*cos(alpha);
00045 double yd = arc_yc + arc_r*sin(alpha);
00046
00047
00048
00049 userscale(xd, yd, x, y, &user_loc.x, &user_loc.y);
00050
00051 return cont;
00052 }
00053