【问题标题】:Javascript and subdivision, crashing browser in for loopJavascript和细分,在for循环中崩溃浏览器
【发布时间】:2015-08-27 18:10:51
【问题描述】:

我正在使用 paper.js 制作一些生成视觉效果,计划是定义一个随机形状,对其进行细分,然后将这些点也随机化(以不同的程度)。现在,浏览器在尝试细分多边形时崩溃。

我对用 Javascript 做这些事情还比较陌生,所以也许我对它的期望太高了,显然在密集的 for 循环中崩溃只是发生了一些事情。有没有人有一些提示?

var Cloud = function(point) {
    this.origin = point;
    this.initBound = new Size(600,200); 
    this.RoM = 40;

    var numsides = 6;
    var scalingFactor = new Point(1,this.initBound.height/this.initBound.width);

    var cloud = new Path.RegularPolygon({
        center: this.origin,
        sides: numsides,
        radius: this.initBound.width/2,
        strokeColor: 'black'
    });

    cloud.scaling = scalingFactor;

    var initBoundBox = new Path.Rectangle({
        point: new Point(point.x-this.initBound.width/2,point.y-this.initBound.height/2),
        size: this.initBound,
        strokeColor: 'red'
    });

    for(var i=0;i<numsides;i++){
        var px = cloud.segments[i].point.x;
        var py = cloud.segments[i].point.y;

        var x = Math.floor(Math.random()*( (px+this.RoM)-(px-this.RoM)+1 ) + (px-this.RoM) );
        var y = Math.floor(Math.random()*( (py+this.RoM)-(py-this.RoM)+1 ) + (py-this.RoM) );

        var tmpP = new Point(x,y);
        cloud.segments[i].point = tmpP;
    }

    for(var i=0;i<cloud.segments.length-1;i++){
        var mdPnt = new Point((cloud.segments[i].point.x+cloud.segments[i+1].point.x)/2,(cloud.segments[i].point.y+cloud.segments[i+1].point.y)/2); 
        cloud.add(i,mdPnt); //breaking here
    }   

    //cloud.smooth();
}

new Cloud(new Point(500,300)); 

【问题讨论】:

  • 它到底是在哪里崩溃的,它是否会因为一条消息而崩溃?
  • 在第二个 for 循环中在 cloud.add() 处崩溃。没有消息,只是让 Firefox 停止运行。

标签: javascript geometry paperjs


【解决方案1】:

在您的最后一个 for 循环中,您在每次迭代中添加一个段,从而将 cloud.segments.length 增加一。你的循环永远不会结束。您可以通过增加 2 而不是 1 来缓解这种情况,或者找到更好的二分例程。

简而言之,试试这个作为起点:

for(var i=0;i<cloud.segments.length-1;i+=2){
    var mdPnt = new Point((cloud.segments[i].point.x+cloud.segments[i+1].point.x)/2,(cloud.segments[i].point.y+cloud.segments[i+1].point.y)/2); 
    cloud.add(i,mdPnt); //breaking here
}  

【讨论】:

  • 哦,哇,这太有道理了。谢谢,我会尽快试用。
  • 如果我分别存储我的初始段长度的值,并继续将每个值存储在一个数组中,这样我就可以进行多个级别的二等分?
  • 有很多方法可以完成,但使用curve.divide(parameter) 可能是最简单的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
相关资源
最近更新 更多