Javascript 为什么距离的指数衰减会导致99[精确]的一次性误差?

Javascript 为什么距离的指数衰减会导致99[精确]的一次性误差?,javascript,recursion,infinite-loop,jquery-effects,Javascript,Recursion,Infinite Loop,Jquery Effects,我正在研究一种效果,在这种效果中,主要描述中的角色被包裹在自己的跨度中,从他们通常的休息位置移动到一个随机位置,然后通过指数衰减更接近他们的目的地。JavaScript内联在页面中 JavaScript控制台显示调试输出:许多相同的日志行: starting_x:833 starting_y:275.875 target_x:833 target_y:176.875 new.html:74 然后报告最大调用堆栈深度。不知何故,代码使所谓的指数衰减停滞在99的精确差,并变成无限递归(当距离衰减到x

我正在研究一种效果,在这种效果中,主要描述中的角色被包裹在自己的跨度中,从他们通常的休息位置移动到一个随机位置,然后通过指数衰减更接近他们的目的地。JavaScript内联在页面中

JavaScript控制台显示调试输出:许多相同的日志行:

starting_x:833 starting_y:275.875 target_x:833 target_y:176.875 new.html:74

然后报告最大调用堆栈深度。不知何故,代码使所谓的指数衰减停滞在99的精确差,并变成无限递归(当距离衰减到x和y之间小于两个像素时,衰减被宣告停止)

预期行为是:

  • 生成标记输出,输出的每个渲染字符(即非标记)在其自己的范围内

  • 将每个字符移动到其自己的位置

  • 将它们线性移动到初始和最终的静止位置,以便当前位置和目标位置之间的距离呈指数衰减

  • 处理所有点移动(并具有无限递归)的函数如下所示:

                function journey(index, starting_x, starting_y, target_x,
                  target_y, starting_opacity, target_opacity, delay, radix)
                    {
                    if (1 || isNaN(starting_x) || isNaN(starting_y) || isNaN(target_x) || isNaN(target_y))
                        {
                        console.log('starting_x: ' + starting_x +
                          ' starting_y: ' + starting_y + ' target_x: ' +
                          target_x + ' target_y: ' + target_y);
                        // return;
                        }
                    /* console.log(target_x - starting_x + ', ' + (target_y -
                      starting_y)); */
                    if (Math.abs(starting_x - target_x) + Math.abs(starting_y -
                      target_y) < 2)
                        {
                        jQuery('#text_' + index).css({'left': target_x, 'top':
                          target_y, 'opacity': target_opacity, '-ms-filter':
                          'progid:DXImageTransform.Microsoft.Alpha(Opacity=' +
                          target_opacity * 100, 'filter': 'alpha(opacity=' +
                          target_opacity * 100});
                        }
                    else
                        {
                        if (starting_x - target_x > 0)
                            {
                            var new_x = (target_x + Math.floor((starting_x -
                              target_x) * radix));
                            }
                        else
                            {
                            var new_x = (target_x + Math.ceil((starting_x -
                              target_x) * radix));
                            }
                        if (starting_x - target_x > 0)
                            {
                            var new_y = (target_y + Math.floor((starting_y -
                              target_y) * radix));
                            }
                        else
                            {
                            var new_y = (target_y + Math.ceil((starting_y -
                              target_y) * radix));
                            }
                        var new_opacity = target_opacity + (starting_opacity
                          - target_opacity) * radix;
                        journey(index, new_x, new_y, target_x, target_y,
                          new_opacity, target_opacity, delay, radix);
                        }
                    }
    
    功能行程(索引、起始时间、起始时间、目标时间、,
    目标不透明度,起始不透明度,目标不透明度,延迟,基数)
    {
    如果(1 | | | isNaN(起始| x)| | isNaN(起始| y)| | isNaN(目标| x)| isNaN(目标|y))
    {
    console.log('starting_x:'+starting_x+
    '起始y:'+起始y+'目标x:'+
    target_x+“target_y:”+target_y);
    //返回;
    }
    /*log(target_x-starting_x+','+(target_y-
    开始);*/
    if(Math.abs(starting_x-target_x)+Math.abs(starting_y-
    目标(y)<2)
    {
    jQuery(“#text_uu”+index).css({'left':target_x,'top':
    目标_y,“不透明度”:目标_不透明度,'-ms过滤器':
    'progid:DXImageTransform.Microsoft.Alpha(不透明度='+
    目标透明度*100,'过滤器':'α(透明度='+
    目标(不透明度*100});
    }
    其他的
    {
    如果(开始\u x-目标\u x>0)
    {
    var new_x=(目标_x+数学地板((起始_x-
    目标(x)*基数);
    }
    其他的
    {
    var new_x=(target_x+Math.ceil)((starting_x-
    目标(x)*基数);
    }
    如果(开始\u x-目标\u x>0)
    {
    var new_y=(target_y+Math.floor)((start_y-
    目标(y)*基数);
    }
    其他的
    {
    var new_y=(target_y+Math.ceil)((start_y-
    目标(y)*基数);
    }
    var new_opacity=目标_opacity+(开始_opacity
    -目标_不透明度)*基数;
    旅程(索引、新x、新y、目标x、目标y、,
    新不透明度、目标不透明度、延迟、基数);
    }
    }
    
    对不起,误读了代码。您传入的基数值是多少

    此外,如果您只有一个代码,那么代码将更容易阅读

    if (starting_x - target_x > 0)
    

    有条件。

    对不起,误读了代码。您要传入的基数值是多少

    此外,如果您只有一个代码,那么代码将更容易阅读

    if (starting_x - target_x > 0)
    

    有条件。

    对不起,误读了代码。您要传入的基数值是多少

    此外,如果您只有一个代码,那么代码将更容易阅读

    if (starting_x - target_x > 0)
    

    有条件。

    对不起,误读了代码。您要传入的基数值是多少

    此外,如果您只有一个代码,那么代码将更容易阅读

    if (starting_x - target_x > 0)
    

    有条件的。

    谢谢;你挑出的让人困惑的地方就是罪魁祸首。输入的基数I的值是.99,在给定的情况下,-99的数字乘以基数,得到-98.01,然后因为我在第二个条件中有另一个维度,Math.floor()我注意到了你的把手,有关于亚瑟王的“儿子和侄子,莫德雷德”的讨论在《谢谢你》中,你挑出的令人困惑的一点是罪魁祸首。我传入的基数值是.99,在给定的例子中,-99的数字乘以基数,得到-98.01,然后因为我在第二个条件中有另一个维度,Math.floor()我注意到了你的把手,有关于亚瑟王的“儿子和侄子,莫德雷德”的讨论在《谢谢你》中,你挑出的令人困惑的一点是罪魁祸首。我传入的基数值是.99,在给定的例子中,-99的数字乘以基数,得到-98.01,然后因为我在第二个条件中有另一个维度,Math.floor()我注意到了你的把手,有关于亚瑟王的“儿子和侄子,莫德雷德”的讨论在《谢谢你》中,你挑出的令人困惑的一点是罪魁祸首。我传入的基数值是.99,在给定的例子中,-99的数字乘以基数,得到-98.01,然后因为我在第二个条件中有另一个维度,Math.floor()我注意到了你的把手,这里讨论了亚瑟王的命运