Как часть алгоритма визуализации облака слов (вдохновленный this question), я создал функцию Javascript/Processing.js, которая перемещает прямоугольник слова по все возрастающей спирали, пока не будет никакого столкновения с ранее размещенные слова. Это работает, но мне неудобно качество кода.Алгоритм алгоритма словаря refactor
Так что мой вопрос: Как я могу перестроить этот код, чтобы быть:
- читаемым + понятно
- быстро (не делая ненужных вычислений)
- элегантные (с помощью нескольких строк кода)
Я также был бы признателен за любые советы по передовому опыту программирования с большим количеством вычислений.
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;
}
Может codereview.stackexchange.com бы быть более подходящим местом для этого вопроса? – Barmar