首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我知道Sin和Cos都是弧度的,但是为什么我还差90度呢?

我知道Sin和Cos都是弧度的,但是为什么我还差90度呢?
EN

Stack Overflow用户
提问于 2013-09-19 22:44:12
回答 2查看 1.9K关注 0票数 0

假设我有X= 0,Y=0,我想从一个向量和一个震级计算一个新的点(X1,Y1)。假设矢量是90度(不是弧度),震级是10,所以代码看起来如下所示:

代码语言:javascript
运行
复制
x1 = X + (10 * Math.Cos(90 * (Math.PI / 180.0)));
y1 = Y + (10 * Math.Sin(90 * (Math.PI / 180.0)));

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

代码语言:javascript
运行
复制
DrawLine(X,Y,x1,y1);

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

下面是屏幕截图:

我要通过90号公路,我预计这条线路将向西向东行驶。我想0度是在正北。我知道我使用的坐标系是水平的,Y是垂直的。

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

EN

回答 2

Stack Overflow用户

发布于 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)提供从四舍五入浮点值派生的整数值。

代码语言:javascript
运行
复制
x_int = round(X_floating_point);
票数 2
EN

Stack Overflow用户

发布于 2013-09-19 23:16:39

我看不出x和y有什么问题。

代码语言:javascript
运行
复制
You use COS for x.  COS(0) = 1    ,  COS(90) = 0
You use SIN for y.  SIN(0) = 0    ,  SIN(90) = 1

对于屏幕坐标系:

代码语言:javascript
运行
复制
x+ is left to right
y+ is top to bottom

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

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

使:

代码语言:javascript
运行
复制
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)));

所以:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18906134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档