【问题标题】:How to make trigonometry code more efficient如何让三角函数代码更高效
【发布时间】:2012-06-20 20:55:04
【问题描述】:

我需要帮助以使下面的代码更高效,并对其进行一些清理。

image 所示,x 和 y 可以是整个屏幕周围的任意点,我正在尝试找到角度 t。有什么办法可以减少这里的行数吗?

注意:原点在左上角,向右/向下移动是正向移动

o := MiddleOfScreenX - x;
a := MiddleOfScreenY - y;

t := Abs(Degrees(ArcTan(o / a)));

if(x > MiddleOfScreenX)then
  begin
    if(y > MiddleOfScreenY)then
      t := 180 + t
    else
      t := 360 - t;
  end
else
  if(y > MiddleOfScreenY)then
    t := 180 - t;

代码是帕斯卡,但用类似语法的其他语言或 c++ 或 java 的答案也可以。

:= sets the variable to that value
Abs() result is the absolute of that value (removes negatives)
Degrees() converts from radians to degrees
ArcTan() returns the inverse tan

【问题讨论】:

    标签: java c++ pascal trigonometry


    【解决方案1】:

    请参阅 http://www.cplusplus.com/reference/clibrary/cmath/atan2/ 了解 C 函数。

    atan2 有 2 个单独的参数,因此可以确定象限。

    pascal 可能有 arctan2 参见 http://www.freepascal.org/docs-html/rtl/math/arctan2.htmlhttp://www.gnu-pascal.de/gpc/Run-Time-System.html

    o := MiddleOfScreenX - x;
    a := MiddleOfScreenY - y;
    
    t := Degrees(ArcTan2(o, a));
    

    【讨论】:

    • 非常感谢您的帮助,是的,确实存在确切的功能并且可以完美运行(一旦我取出Abs())。
    • 我取出了腹肌,对于这个错误感到抱歉。
    【解决方案2】:

    代码行数不一定是您需要考虑的唯一优化。就单个函数完成计算所需的时间而言,三角函数的成本很高(即:单个 cos() 调用可能需要数百次加法和乘法,具体取决于实现)。

    以信号处理中常用的函数离散傅里叶变换为例,数千次 cos() 和 sin() 计算的结果被预先计算并存储在海量查找表中。折衷方案是在运行应用程序时使用更多内存,但运行速度要快得多。

    请看下面的文章,或者搜索“预先计算的旋转因子”的重要性,这本质上意味着预先计算大量的复指数。

    将来,您还应该提及您正在尝试优化的内容(即:使用的 CPU 周期、使用的内存字节数、成本等)。我只能假设您的意思是优化执行的指令,进而优化使用的 CPU 周期数(即:您想减少 CPU 开销)。

    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.34.9421&rep=rep1&type=pdf

    【讨论】:

    • 非常感谢,您给了我很多思考和研究。
    【解决方案3】:

    您应该只需要一项测试来确定如何处理 arctan。您现有的测试可以恢复被 Abs() 破坏的信息。

    atan() 通常在 -pi/4 到 pi/4 的范围内返回。您的坐标系有点奇怪——顺时针旋转 90 度以获得“标准”坐标系,尽管您采用 atanx/y 而不是 y/x。我已经很难在脑海中解决这个问题了。

    无论如何,我相信你的测试只需要如果你的结果为负a,则增加 180 度。如果你想避免负角;如果它是负数,则添加 360 度。

    【讨论】:

    • 感谢您的帮助,它看起来像 x / y 的原因是因为我想要垂直轴的角度而不是水平轴的角度,是的,我正在使用 @987654327 破坏信息@这就是为什么我知道它效率低下。
    • 是的,当我考虑时我想通了……哦,对面和相邻。我看到他在那里做了什么。
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2013-06-20
    • 2012-05-25
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多