假设我有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度是在正北。我知道我使用的坐标系是水平的,Y是垂直的。
我只是好奇我错过了什么。
发布于 2013-10-24 23:00:08
意外整型截断
从度到弧度的转换导致了π/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-09-19 23:16:39
我看不出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
(我不知道是谁对此负责,但我会解雇他)。那可不太准确!尝试用:3.14159265358979323846
替换PI
使:
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;
更新:
正如Chis所说,元数据是错误的。所以使用Math.PI
https://stackoverflow.com/questions/18906134
复制相似问题