【问题标题】:Refactor word cloud algorithm重构词云算法
【发布时间】:2013-08-27 16:55:09
【问题描述】:

作为词云渲染算法的一部分(受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;
}

【问题讨论】:

  • 也许 codereview.stackexchange.com 更适合这个问题?

标签: javascript algorithm refactoring processing word-cloud


【解决方案1】:

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

  • 计算矩形的中点
  • 计算半径
  • 确定当前角度
  • 将极坐标转换为笛卡尔坐标

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

【讨论】:

  • 好的,所以大体思路是:“少评论,用函数”?
  • 更多的是将任何东西分离成它自己的功能,这可能会导致更少的cmets,但我认为这本身不应该是一个目标。函数名称指定意图而不是实现,这会立即使代码更具可读性。
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2011-12-15
    • 2023-03-12
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多