Home > database >  I have a device reporting left handed coordinate angle and magnitude, how do I represent that as a l
I have a device reporting left handed coordinate angle and magnitude, how do I represent that as a l

Time:07-18

The device I am using generates vectors like this; enter image description here

How do I translate polar (angle and magnitude) from a left handed cordinate to a cartesian line, drawn on a screen where the origin point is the middle of a screen?

I am displaying the line on a wt32-sc01 screen using c . There is a tft.drawline function but its references are normal pixel locations. In which case 0,0 is the upper left corner of the screen.

This is what I have so far (abbreviated)

....
int screen_height = tft.height();
int screen_width = tft.width();
// Device can read to 12m and reports in mm
float zoom_factor = (screen_width / 2.0) / 12000.0;
int originY = (int)(screen_height / 2);
int originX = (int)(screen_width / 2);
// Offset is for screen scrolling. No screen offset to start
int offsetX = 0;
int offsetY = 0;
...
// ld06 holds the reported angles and distances.
Coord coord = polarToCartesian(ld06.angles[i], ld06.distances[i]);
drawVector(coord, WHITE);

Coord polarToCartesian(float theta, float r) {
  // cos() and sin() take radians
  float rad = theta * 0.017453292519;
  Coord converted = {
    (int)(r * cos(rad)),
    (int)(r * sin(rad))
  };
  return converted;
}

void drawVector(Coord coord, int color) {
  // Cartesian relative the center of the screen factoring zoom and pan
  int destX = (int)(zoom_factor * coord.x)   originX   offsetX;
  int destY = originY - (int)(zoom_factor * coord.y)   offsetY;
  // From the middle of the screen (origin X, origin Y) to destination x,y
  tft.drawLine( originX, originY, destX, destY, color);
}

I have something drawing on the screen, but now I have to translate between a left handed coordinate system and the whole plane is rotated 90 degrees. How do I do that?

CodePudding user response:

If I understood correctly, your coordinate system is with x pointing to the right and the y to the bottom and you used the formula for the standard math coordinate system where y is pointing up so multiplying your sin by -1 should do the trick (if it doesn't, try multiplying random things by -1, it often works for this kind of problems).

CodePudding user response:

I assuming (from your image) your coordinate system has x going right y going up angle going from y axis clockwise and (0,0) is also center of your polar coordinates and your goniometrics accept radians then:

#include <math.h>
float x,y,ang,r;
const float deg = M_PI/180.0;
// ang = <0,360> // your angle
// r >= 0        // your radius (magnitude)

x = r*sin(ang*deg);
y = r*cos(ang*deg);
  • Related