- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以大约一个小时前,我遇到了一个美好而尴尬的时刻,在很长一段时间后点击了一些东西。推到 30,我终于得到了 sinus 和 cosinus。在只能描述为基本上重新实现轮子的情节之后。
为了让 WASD 控件在两个轴上移动,同时考虑到玩家注视的方向,我决定使用一个简单的开关:
switch (key) {
case 'up':
movement.z -= 1 * modulation.z;
movement.x += 1 * modulation.x;
break;
case 'down':
movement.z += 1 * modulation.z;
movement.x -= 1 * modulation.x;
break;
case 'left':
movement.x -= 1 * modulation.z;
movement.z -= 1 * modulation.x;
break;
case 'right':
movement.x += 1 * modulation.z;
movement.z += 1 * modulation.x;
break;
...
}
... 其中 modulation.z 和 .x 将基于玩家面对的方向。调制值需要介于 -1 到 +1 之间。 (这应该是我的第一个线索,是的!)所以我帮自己拿了一些可靠的笔和纸,并且在对我 9 年级教育的幸福无知中我想到了:
function setModulation(rotation) {
var rotationTemp = 0;
var modulation = {};
rotationTemp = rotation;
if (rotationTemp > 180) {
rotationTemp = 360 - rotationTemp;
}
rotationTemp /= 180;
modulation.z = 1 - rotationTemp * 2;
rotationTemp = rotation + 90;
if (rotationTemp > 180) {
rotationTemp = 360 - rotationTemp;
}
rotationTemp /= 180;
modulation.x = 1 - rotationTemp * 2;
modulation.x *= -1;
return modulation;
};
在此期间学习和/或记住了一点,在重新访问这段代码时,我突然意识到:这是 cos 和 sin 的工作。老大。
function setModulationMath(rotation) {
var modulation = {};
modulation.z = Math.cos(rotation * Math.PI / 180);
modulation.x = Math.sin(rotation * Math.PI / 180);
return modulation;
};
到目前为止很开心!使用数学数学是为了什么!但后来我检查了性能。而我自己的“实现”在 FF、Chrome 和 IE 中要快得多。使用 1.000.000 次迭代,它在我的本地设置上增加了 35% 到 45% 之间。
有人知道为什么吗?它只是 Math.cos()/.sin() 吗?可衡量的增长远远超出人们的预期,不是吗?有经验的人愿意分享她*他的见解吗?
function setModulationMath(rotation) {
var modulation = {};
modulation.z = Math.cos(rotation * Math.PI / 180);
modulation.x = Math.sin(rotation * Math.PI / 180);
return modulation;
};
function setModulation(rotation) {
var rotationTemp = 0;
var modulation = {};
rotationTemp = rotation;
if (rotationTemp > 180) {
rotationTemp = 360 - rotationTemp;
}
rotationTemp /= 180;
modulation.z = 1 - rotationTemp * 2;
rotationTemp = rotation + 90;
if (rotationTemp > 180) {
rotationTemp = 360 - rotationTemp;
}
rotationTemp /= 180;
modulation.x = 1 - rotationTemp * 2;
modulation.x *= -1;
return modulation;
};
var iterations = 1000000;
console.time('setModulation');
for(var i = 0; i < iterations; i++ ){
setModulation(i, i / 2);
};
console.timeEnd('setModulation')
console.time('setModulationMath');
for(var i = 0; i < iterations; i++ ){
setModulationMath(i, i / 2);
};
console.timeEnd('setModulationMath')
最佳答案
您的功能可能会更快。然而,这种比较没有任何意义,因为这些函数会产生完全不同的结果。让我们以错误为基准:
var err_z = 0;
var err_x = 0;
for (var i = 0; i < 360; ++i){
var mm = setModulationMath(i);
var m = setModulation(i);
err_z += Math.abs(mm.z - m.z);
err_x += Math.abs(mm.x - m.x);
}
还有……
err_z == 49.17730025861921
err_x == 113.58865012930961
太糟糕了。如果两者完全相似,您会期望值接近 0。
While my first assumption was that I must have somehow faked my way through it: it perfectly works. Both functions give the same modulation values. This being said: I'd be happy to be told that this is a hack that only works because [x]... :)
平均误差在 z 轴上为 0.137,在 x 轴上为 0.316。这对您来说可能已经足够好了,但肯定存在差异更高的值。您可能只检查正交方向吗?在这种情况下,您需要的是一个开关
,而不是三 Angular 函数。
编辑:哦,这是 z 部分的图表。波浪线是余弦,直线是您的近似值。
但我离题了。
(尝试)自己实现三 Angular 函数、数学函数等不一定是坏事。这实际上取决于应用程序的具体情况,有时您会发现不需要这样的精度,或者您的 Angular 将仅表示为整数度数……在这些情况下,使用更简单的近似值或查找表可能会有所帮助。
事实上,Javascript(以及许多其他标准库)中的正弦和余弦经过了很好的优化并且非常精确。
关于javascript - Math.sin() .cos() 的成本 vs 怪异的自己的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37787302/
我刚开始研究 C#,冗长的数学函数让我很烦。是否有标准的方法来编写 Cos(或任何其他 Math 函数)而不是 Math.Cos 而无需定义您自己的 Cos 函数? 最佳答案 切换到新的 Roslyn
我通过 R 运行 WolframAlpha Wolfram Alpha API from R 我的问题是,我需要将 wolfram 输出转换为 R 表达式。我在需要的地方添加了“*”,还有另一个问题
我遇到了一些应该很容易回答的问题,但我不能 Handlebars 指放在上面。自从我做了一些三角函数以来已经有一段时间了。 double cosValue = -2.7105054312E-20; /
如何重现此行为? https://isocpp.org/wiki/faq/newbie#floating-point-arith2 准确的说,在下面的代码中,参数x和y是相等的;它们可以等于 1.0
JavaScript 中的所有数学函数都使用弧度代替度数。然而,它们要么不相等,要么我离题太远。 从度数到弧度的转换是: var rad = angle * Math.PI / 180 90 度 An
这个问题已经有答案了: How can I get sin, cos, and tan to use degrees instead of radians? (6 个回答) 已关闭 9 年前。 cos
这是怎么回事?? 测试 sin 和 cos 函数以找出为什么在将我的坐标输出到 SVG 文件时我在错误的位置得到如此漂亮的定位。所以我做了这个测试代码,我可以预测答案是什么来找出原因。奇怪的是,没有任
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: C Build error when getting the value of sin() 我试图在这段时间内
在 Javascript 中使用 a.b(c) 或 [a.b][0](c) 是不同的,原因是 this 的绑定(bind)> 在 a.b 的代码执行期间是否发送给对象 a。 使用相同的推理 var z
这是一个很简单的问题,让我很困惑。 我收到一个源文件的以下错误,但另一个没有: 4 src/Source2.cpp:1466: error: no matching function for cal
如何只使用 sin 或 cos 而不是 Math.sin 或 Math.cos?我尝试导入 Math.* 但我想我可能需要对命名空间做一些事情? 最佳答案 import static java.lan
测试代码: #include #include const int N = 4096; const float PI = 3.1415926535897932384626; float cosin
代码片段1: from sympy import symbols, integrate, cos, pi from numpy import sqrt n = symbols('n', integer
我正在使用 Taylors series 来计算一个数字的 cos,对于小数字,该函数返回准确的结果,例如 cos(5) 给出 0.28366218546322663 。但是对于较大的数字,它会返回不
我是一个完全的编程初学者,我被分配了以下任务: 编写一个 C++ 程序,使用一系列内接和外接正多边形计算一对 π 的估计值。在不超过 30 步后停止,或者当外接多边形和内切多边形的周长之差小于 ε=1
我正在尝试使用余弦和正弦,但它们没有返回我期望的值。 #include #include #include int main() { float magnitudeForce;
我有一个作业要编写一个程序来通过 Maclaurin approximation 计算 cos(x) .但是,我必须为 cos(x) 使用一个函数,并使用另一个函数来计算 cos(x) 函数内的分母上
我正在尝试使用 Python2.7 对方程式进行数值求解。这是整个代码: from sympy import * from sympy import Symbol from sympy.solvers
因此,我正在尝试创建一个使用泰勒近似计算 cos(x) 的程序。 程序非常简单:用户输入一个参数 x(x 是以弧度为单位的角度)和一个 float ε,它是 cos(x) 值的精度。 基本上,程序唯一
我正在尝试将内部 cos() 函数调用插入 LLVM 传递。我在 FunctionPass 中的代码: std::vector arg_type; arg_type.push_back(Type::g
我是一名优秀的程序员,十分优秀!