0

假设我有值 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 是垂直的。

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

4

2 回答 2

2

意外的整数截断

从度数到弧度的转换导致接近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);
于 2013-10-24T23:00:08.627 回答
0

我认为 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;
于 2013-09-19T23:16:39.747 回答