有些情况下,有多种方法可以计算相同的值。
我正在设计一个“扩展”2D凸多边形的算法。为了做到这一点,我想找出每个顶点向哪个方向偏移。为了产生一个在四周都有相同厚度“皮肤”的扩展多边形,向该方向偏移的量也取决于该顶点的角度。但现在我只关心方向。
一种方法是使用atan2:让B是我的顶点,A是前一个顶点,C是下一个顶点。我的方向是
另一种方法涉及sqrt:
我倾向于第二种方法,因为平均角度值需要一些工作。但我基本上是在两个调用atan2和两个调用sqrt之间做选择。哪个通常更快?如果我在着色器程序中执行此操作呢?
我并不试图对我的程序进行优化,我想知道这些函数一般是如何实现的(例如在标准c库中),以便我能够知道什么是更好的选择。
据我所知,sqrt和三角函数需要迭代方法才能得出答案。这就是为什么我们尽可能避免它们的原因。人们已经提出了“近似”函数,使用查找表和插值等方法尝试产生更快的结果。当然,除非我发现我的代码由于仅使用这些例程或重度涉及它们的例程而导致瓶颈,否则我永远不会费心去处理它们,但sqrt、三角函数和反三角函数之间的差异可能与讨论相关。
我正在设计一个“扩展”2D凸多边形的算法。为了做到这一点,我想找出每个顶点向哪个方向偏移。为了产生一个在四周都有相同厚度“皮肤”的扩展多边形,向该方向偏移的量也取决于该顶点的角度。但现在我只关心方向。
一种方法是使用atan2:让B是我的顶点,A是前一个顶点,C是下一个顶点。我的方向是
angle(B-A)
和angle(B-C)
的“角平均数”。另一种方法涉及sqrt:
unit(B-A)+unit(B-C)
其中unit(X)
是X/length(X)
得到一个具有我的方向的向量。我倾向于第二种方法,因为平均角度值需要一些工作。但我基本上是在两个调用atan2和两个调用sqrt之间做选择。哪个通常更快?如果我在着色器程序中执行此操作呢?
我并不试图对我的程序进行优化,我想知道这些函数一般是如何实现的(例如在标准c库中),以便我能够知道什么是更好的选择。
据我所知,sqrt和三角函数需要迭代方法才能得出答案。这就是为什么我们尽可能避免它们的原因。人们已经提出了“近似”函数,使用查找表和插值等方法尝试产生更快的结果。当然,除非我发现我的代码由于仅使用这些例程或重度涉及它们的例程而导致瓶颈,否则我永远不会费心去处理它们,但sqrt、三角函数和反三角函数之间的差异可能与讨论相关。