作为文字云渲染算法的一部分(灵感来自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;
}
答案 0 :(得分:2)
基础几何算法的质量超出了我的专业领域。但是,关于代码的质量,我会说你可以从中提取很多功能。您评论的许多行可以转换为单独的函数,例如:
您也可以考虑使用更具描述性的变量名称。 'b'和'r'需要查找代码以查看它们的用途,但'spiralWidth'和'radius'不会。
答案 1 :(得分: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;