2013-08-24 31 views
1

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

也许codereview.stackexchange.com将是这个问题的一个更合适的网站? – Barmar

回答

2

底层几何算法的质量超出了我的专业领域。但是,关于代码的质量,我想说你可以从中提取很多功能。许多您已经评价线条可以变成不同的功能,例如:

  • 计算中点矩形的
  • 计算半径
  • 确定当前角度
  • 转换极性到笛卡尔座标

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

+0

好吧,所以一般的想法是:“少评论,而是使用功能”? – kadrian

+0

更多的是将任何东西分离成它自己的功能,这可能会导致更少的评论,但我认为这不应该成为本身的目标。函数名称指定了intent而不是实现,它们立即使代码更具可读性。 –

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; 
+0

啊,你说得对:D – kadrian