javascript - 重构词云算法

标签 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;
}

最佳答案

底层几何算法的质量超出了我的专业领域。但是,就代码的质量而言,我认为您可以从中提取很多功能。您评论的许多行都可以变成单独的函数,例如:

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

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

关于javascript - 重构词云算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18423157/

相关文章:

html - 在 Windows 上重命名 CSS 文件和多个 HTML 文件中的 CSS 元素的最佳工具是什么?

visual-studio - Visual Studio : Is there a "move class to different namespace" refactoring?

javascript - 使用 Angular Directive(指令)传递变量

algorithm - 生成一个所有可能结果的矩阵,用于 throw n 个骰子(忽略顺序)

javascript - 过滤多个列表但不是全部?

c - 比我使用的递归更好的方法(更好的时间复杂度)

arrays - 将二维数组旋转 90 度

Java代码重构问题

javascript - highcharts 下载/导出带有圆形边框的图像

javascript - JS join/split 技巧有什么作用?