给定一个角度和长度,我该如何计算坐标?

20
假设左上角为(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;
}

我假设你想要为end_x和end_y使用(int *)类型,并在函数末尾翻转你的赋值。 - Ron Warholic
你遇到的问题是数学还是代码?如果是数学问题,那么这可能不是适当的论坛,因为它相当基础;我建议你参考Polar-Rectangular Conversion。但请记住,当你实现它时,C数学库使用弧度而不是角度 r = d * PI / 180.0 - Clifford
哎呀,我回答了编程问题,结果被踩了。人心难测啊... - Carl Norum
编码很简单,但我在数学方面的背景很少,如果这不是合适的地方,请原谅。 - amanda
2
Spolsky和Atwood在创建mathoverflow.com之前还需要多长时间? - Michael Burr
显示剩余3条评论
5个回答

41
// 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);

14
cos()sin()使用弧度制,请小心。 - Carl Norum
那个完美地解决了...有时候我把事情想复杂了。非常感谢! - amanda
-1对于宏来说不太好,请使用内联函数!无论如何,乘法都会在某个时候进行转换... - Matthieu M.
即使您有C99编译器,创建内联函数也只是一种建议。宏是真正可靠的选择。 - Carl Norum
5
这个问题是关于三角函数而不是宏与内联函数的比较。我只是想指出把角度转换为弧度是很简单的事情。 - Nick Van Brunt
我只需刪除宏,並創建變量名稱和值。長遠來看可能會獲得更多的積分。 - marksyzm

2
// 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

2

你没有说明角度相对于什么测量,或者你的坐标轴方向是什么。这些会有所不同。

首先需要将角度转换为弧度(乘以π并除以180)。 然后需要取正弦和余弦值,并将其乘以线段长度。现在你有了两个坐标数值,但这取决于你的坐标轴方向以及从哪里测量角度,哪个值是x坐标,哪个是y坐标,以及是否需要对它们进行否定处理。


1

math.h 包含了你所需要的所有三角函数。根据你所使用的系统,你可能需要在链接器中添加 -lm 参数(有时会自动添加)。


0

人们正在忘记C++中的complex库,它可以为我们执行极坐标到直角坐标的转换。

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时,我认为它是从某个地方检索答案。在这个例子中,我们正在计算某些内容,这可能会给您的代码用户带来虚假保证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接