重构词云算法

时间:2013-08-24 21:11:07

标签: javascript algorithm refactoring processing word-cloud

作为文字云渲染算法的一部分(灵感来自this question),我创建了一个Javascript / Processing.js函数,它可以沿着不断增加的螺旋线移动一个单词的矩形,直到不再发生碰撞为止以前放过的话。它有效,但我对代码质量感到不舒服。

所以我的问题是:如何将此代码重组为:

  • 可读+易懂
  • 快(没做无用的计算)
  • 优雅(使用几行代码)

我还要感谢任何关于通过大量计算进行编程的最佳实践的提示。

Rectangle moveWordRect(wordRect){
    // Perform a spiral movement from center
    // using the archimedean spiral and polar coordinates
    // equation: r = a + b * phi

    // Calculate mid of rect
    var midX = wordRect.x1 + (wordRect.x2 - wordRect.x1)/2.0;
    var midY = wordRect.y1 + (wordRect.y2 - wordRect.y1)/2.0;

    // Calculate radius from center 
    var r = sqrt(sq(midX - width/2.0) + sq(midY - height/2.0));

    // Set a fixed spiral width: Distance between successive turns
    var b = 15; 

    // Determine current angle on spiral
    var phi = r / b * 2.0 * PI;

    // Increase that angle and calculate new radius
    phi += 0.2;
    r = (b * phi) / (2.0 * PI);

    // Convert back to cartesian coordinates
    var newMidX = r * cos(phi);
    var newMidY = r * sin(phi);

    // Shift back respective to mid
    newMidX += width/2;
    newMidY += height/2;

    // Calculate movement 
    var moveX = newMidX - midX;
    var moveY = newMidY - midY;

    // Apply movement
    wordRect.x1 += moveX;
    wordRect.x2 += moveX;
    wordRect.y1 += moveY;
    wordRect.y2 += moveY;

    return wordRect;
}

2 个答案:

答案 0 :(得分:2)

基础几何算法的质量超出了我的专业领域。但是,关于代码的质量,我会说你可以从中提取很多功能。您评论的许多行可以转换为单独的函数,例如:

  • 计算矩形中点
  • 计算半径
  • 确定当前角度
  • 将Polar转换为Cartesian Coodinates

您也可以考虑使用更具描述性的变量名称。 'b'和'r'需要查找代码以查看它们的用途,但'spiralWidth'和'radius'不会。

答案 1 :(得分:1)

除了斯蒂芬的回答, 简化这两行:

var midX = wordRect.x1 + (wordRect.x2 - wordRect.x1)/2.0;
var midY = wordRect.y1 + (wordRect.y2 - wordRect.y1)/2.0;

更好的陈述:

var midX = (wordRect.x1 + wordRect.x2)/2.0;
var midY = (wordRect.y1 + wordRect.y2)/2.0;