1

作为词云渲染算法的一部分(受此问题的启发),我创建了一个 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;
}
4

2 回答 2

2

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

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

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

于 2013-08-24T21:59:25.353 回答
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;
于 2013-08-25T00:56:56.630 回答