2013-08-24 34 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