我需要帮助才能使我的代码更有效率,并将其清理一下。
如此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
答案 0 :(得分:6)
请参阅此http://www.cplusplus.com/reference/clibrary/cmath/atan2/了解C函数。
atan2需要2个独立的参数,因此可以确定象限。
pascal可能有arctan2,请参阅http://www.freepascal.org/docs-html/rtl/math/arctan2.html或http://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度。