Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 
typedef struct 
{
  int16_t X;
  int16_t Y;
}Point, * pPoint;

Точка:
Point RotatePoint(Point Coord, Point Coord0, float32_t angle){ //angle max is 2pi rad 
static float32_t cosV;
static float32_t sinV;
static float32_t Xo;
static float32_t Yo;
static float32_t X;
static float32_t Y;


 // angle*= 0.017453292f;
  cosV = arm_cos_f32(angle);
  sinV = arm_sin_f32(angle);
  
  X = (float32_t)Coord.X;
  Y = (float32_t)Coord.Y;
  Xo = (float32_t)Coord0.X;
  Yo = (float32_t)Coord0.Y;

  Coord.X = (uint16_t)(Xo + (((X - Xo)*cosV)) + (((Yo - Y)*sinV))+0.5);
  Coord.Y = (uint16_t)(Yo + (((X - Xo)*sinV)) + (((Y - Yo)*cosV))+0.5);

return Coord;
}

Полигон поворот положительные градусы = по часовой стрелке (координата Y - сверху вниз, X - слева направо) в (0.001 * angle_deg) градусах:
void RotatePoly(Point* pToPoints, uint8_t NumbOfPoints, const pPoint Origin, int32_t angle_deg){
  int i;
  float32_t angle = 1.7453292e-5 * (float32_t)angle_deg;  
  for(i = 0; i < NumbOfPoints; i++){
   pToPoints[i] = RotatePoint(pToPoints[i], *Origin, angle);
  }
}