JavaScript程序生成的心脏

时间:2019-02-07 22:39:14

标签: javascript math

一边慢慢学习JavaScript,一边想用Three.JS制作动画: https://www.reddit.com/r/gifs/comments/ag6or3/send_this_to_your_loved_ones_for_valentines/

我试图重新创建该方程式,但是遇到了麻烦,因为下面的代码无法产生正确的结果。我已经读到JS在浮点数方面存在一些大问题,尤其是立方根实际上并不能很好地发挥作用。

const displayOptions = displayDevice =>
  Object.entries(displayDevice)
    .reduce((acc, [key, val]) => (val && acc.push(key), acc),[]);

这对您的JS大师来说合适吗?

这是我的代码实现,试图使它起作用,包括下面提到的修复程序。 https://codesandbox.io/s/vjm4xox185

3 个答案:

答案 0 :(得分:0)

查看链接到的图形的范围。在post_type范围内绘制心脏,但您的循环来自x: [-2, 2]。这意味着您可能会获得除x: [-100, 100]以外的所有x值的不确定结果。尝试缩小-1, 0, 1循环的范围,您将获得所需的结果。

答案 1 :(得分:0)

问题是(Math.pow(3.0 - (x*x), 0.5))的计算结果返回NAN,好像不是现实数字

阅读here,以获取有关Math.pow(negativeNumber, 0.5)的更多信息 因此我添加了validPow来验证x是正数还是负数,并返回正确的结果。

for (var x = -100; x < 100; x++)
{

 y = (Math.pow(x, 2/3) + 0.9) * (validPow(3.0 - (x*x), 0.5)) * 
 Math.sin(10 * Math.PI * x)
 
 console.log(y)
 

}

function validPow(x, y)
{
            var result = Math.pow(x, y);
            if (x > 0)
            {
                return result;
            }
            else
            {
                return -1 * Math.pow(-x, y);
            }
}

答案 2 :(得分:0)

最后解决了这个问题。

归结为这一行,关键是在第一个Math.pow语句中使用Math.abs(x): var y = Math.pow(Math.abs(x), 0.66) + (0.9 * Math.sqrt(3.3 - x * x)) * Math.sin(10 * Math.PI * x);

感谢所有提供输入和帮助的人!

您可以在此处查看最终结果: https://codesandbox.io/s/vjm4xox185