如何使三角代码更有效

时间:2012-06-20 20:55:04

标签: java c++ pascal trigonometry

我需要帮助才能使我的代码更有效率,并将其清理一下。

如此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;

代码是pascal,但其他语言或类似语法或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

3 个答案:

答案 0 :(得分:6)

请参阅此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));

答案 1 :(得分:3)

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

在信号处理中常用功能的情况下,离散傅立叶变换,数千cos()和sin()计算的结果被预先计算并存储在大量查找表中。权衡是在运行应用程序时使用更多内存,但运行速度要快得多。

请参阅以下文章,或搜索“预先计算的旋转因子”的重要性,这实际上意味着提前计算大量复杂的指数。

将来,您还应该提到您要优化的内容(即:使用的CPU周期,使用的内存字节数,成本等)。我只能假设您的意思是在执行的指令方面进行优化,并且通过扩展来优化所使用的CPU周期数(即:您希望减少CPU开销)。

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

答案 2 :(得分:1)

您应该只需要一个测试来确定如何处理arctan ..您现有的测试会恢复Abs()销毁的信息。

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

无论如何,我相信你的测试只需要是负面的a,加180度。如果你想避免负角度;如果它是负面的话,加上360度。