Учитывая угол и длину, как мне рассчитать координаты

StackOverflow https://stackoverflow.com/questions/1638437

  •  08-07-2019
  •  | 
  •  

Вопрос

Предполагая, что верхний левый угол равен (0,0), и мне дан угол 30 градусов, начальная точка (0,300), длина линии 600, как рассчитать конечную точку линии, чтобы что линия соответствует заданному углу.

Псевдокод C

main() {
  int x,y;

  getEndPoint(30, 600, 0, 300, &x, &y);
  printf("end x=%d, end y=%d", x, y);
}

// input angle can be from 0 - 90 degrees

void getEndPoint(int angle, int len, int start_x, int start_y, int *end_x, int *end_y) 
{

    calculate the endpoint here for angle and length

    *end_x = calculated_end_x;
    *end_y = calculated_end_y;
}
Это было полезно?

Решение

// edit to add conversion
    #define radian2degree(a) (a * 57.295779513082)
    #define degree2radian(a) (a * 0.017453292519)

        x = start_x + len * cos(angle);
        y = start_y + len * sin(angle);

Другие советы

// Here is a complete program with the solution in C and command-line parameters
// Compile with the math library: 
//    gcc -Wall -o point_on_circle -lm point_on_circle.c
//
// point_on_circle.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double inline degree2radian(int a) { return (a * 0.017453292519); }

void getEndPoint(double angle, int len, int start_x, 
    int start_y, int *end_x, int *end_y) {
        *end_x = start_x + len * cos(angle);
        *end_y = start_y + len * sin(angle);
} // getEndPoint

int main(int argc, char *argv[]) {
  double angle = atoi(argv[1]);
  int length   = atoi(argv[2]);
  int start_x  = atoi(argv[3]);
  int start_y  = atoi(argv[4]);
  int x, y;

  getEndPoint(degree2radian(angle), length, start_x, start_y, &x, &y);
  printf("end x=%d, end y=%d\n", x, y);

  return 0;
} // main

math.h имеет все тригонометрические функции, которые вам нужны. Возможно, вам потребуется передать -lm вашему компоновщику в зависимости от того, на какой системе вы работаете (иногда это происходит автоматически).

Вы не говорите, какой угол измеряется относительно или в каком направлении движутся ваши оси. Это будет иметь значение.

Сначала необходимо преобразовать градусы в радианы (умножить на PI и разделить на 180). Затем вам нужно взять синус и косинус вашего угла и умножить их на длину линии. Теперь у вас есть два числа для ваших координат, но это зависит от того, в каких направлениях идут ваши оси и от того, где вы измеряете свои углы, какое из этих значений является координатой x, а какое - y, и нужно ли отклонять любое из них.

Люди забывают о библиотеке complex в C ++, которая выполняет преобразования от полярного к прямоугольному для нас.

complex<double> getEndPoint(complex<double> const &startPoint, double magnitude, double radians)
{
    return startPoint + polar<double>(magnitude, radians);
}

int main()
{
    complex<double> startingPoint(0.0, 300.0);
    auto newPoint = getEndPoint(startingPoint, 600, 0.523598776);

    cout << newPoint << endl;
}

Я также буду осторожен с выбранной вами терминологией. Когда я вижу get в имени, я думаю о нем как о получении ответа, хранящегося где-то. В этом примере мы что-то вычисляем, и это может быть ложной гарантией, предоставленной пользователю вашего кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top