【问题标题】:I understand that Sin and Cos are in radians, but why I am still off by 90 degrees?我知道 Sin 和 Cos 是弧度,但为什么我仍然偏离 90 度?
【发布时间】:2013-09-25 05:08:11
【问题描述】:

假设我有 X = 0, Y = 0 的值,我想从一个向量和一个幅度计算一个新点 (X1, Y1)。假设向量是 90 度(不是弧度),幅度是 10,所以代码看起来像这样:

x1 = X + (10 * Math.Cos(90 * (Math.PI / 180.0)));
y1 = Y + (10 * Math.Sin(90 * (Math.PI / 180.0)));

然后我画一条线来确认结果

DrawLine(X,Y,x1,y1);

但是我的线偏离了 90 度太多了!如果我从传递给 Cos 和 Sin 的角度减去 90,一切正常。所以,我想,我可以忍受。

这是一个屏幕截图:

我正在通过它 90,我期待这条线向西 - 东行。我假设0度是正北。我知道我使用的坐标系是 X 是水平的,Y 是垂直的。

我只是好奇我错过了什么。

【问题讨论】:

  • 您的代码对我来说看起来不错。您的矢量指向什么方向(使用北/南/东/西,所以我们也可以想象它)以及您希望它指向什么方向?
  • 也许您可以显示它的外观和您期望它的外观的屏幕截图
  • 你是如何测量角度的?三角函数期望 theta=0 对应于 +X 轴(东),theta 沿逆时针方向增加。对于罗盘方位,theta=0 对应于正北,顺时针方向增加。
  • 我认为这条线从紫色的小线开始?那么这些结果是正确的。 0 度在 x 轴上。因为 90 度 => x=0,y=1。 0 度 = x=1, y=0
  • 所以问题是它不是一条海峡:

标签: c# vector trigonometry


【解决方案1】:

意外的整数截断

从度数到弧度的转换导致值接近 pi/2,但不完全正确。 (很难做到,因为 pi 是超越的。)Math.Cos(near_pi/2) 导致值 接近 0.0,但不是 _exactly 0.0。假设它是负数,例如 -6.1e-17。

假设“X”是一个整数值的浮点数,X + small_negative_number 的结果是一个小于整数值的数字刚好。将该结果分配给x1 并将其提供给plot() 例程,该例程肯定使用整数值导致整数截断 到下一个较小的整数。

因此,预期的直线偏离了 1 个像素。

一般的解决方案是为plot(x,y) 提供从四舍五入 浮点值派生的整数值。

x_int = round(X_floating_point);

【讨论】:

    【解决方案2】:

    我认为 x 和 y 没有任何问题。

    You use COS for x.  COS(0) = 1    ,  COS(90) = 0
    You use SIN for y.  SIN(0) = 0    ,  SIN(90) = 1
    

    对于屏幕坐标系:

    x+ is left to right
    y+ is top to bottom
    

    这就是为什么这条线是从上到下的。

    如您所见,这条线不是很好也不是很直。按照 Math.PI 的声明,你会看到:public const double PI = 3.14159(我不知道谁对此负责,但我会解雇他)。这不是很准确!尝试将 PI 替换为:3.14159265358979323846

    制作:

    public const double BETTER_PI = 3,14159265358979323846
    
    x1 = X + (10 * Math.Cos(90 * (BETTER_PI / 180.0)));
    y1 = Y + (10 * Math.Sin(90 * (BETTER_PI / 180.0)));
    

    所以:

    x1 = X + (10 * Math.Cos(1.57079632679)) = X + (10 * 0) = X + 0;
    y1 = Y + (10 * Math.Sin(1.57079632679)) = Y + (10 * 1) = Y + 10;
    

    【讨论】:

    • Math.PI(如System.Math.PI)定义为3.14159265358979323846。如果您正在查看程序集元数据,它是misreporting the value。几乎任何用途都可以使用Math.PI
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2012-03-31
    • 2023-03-11
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多