2013-08-24 3 views
1

Как часть алгоритма визуализации облака слов (вдохновленный 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; 
} 
+1

Может codereview.stackexchange.com бы быть более подходящим местом для этого вопроса? – Barmar

ответ

2

Качество базового геометрического алгоритма находится за пределами моей компетенции. Однако, по качеству кода, я бы сказал, что вы можете извлечь из него множество функций. Многие из линий, которые вы комментировали могут быть превращены в отдельные функции, например:

  • Вычислить Midpoint прямоугольника
  • Рассчитать радиус
  • Определение текущего угла
  • Преобразование полярных до декартовой Coodinates

Вы также можете использовать имена дескриптивных переменных. «b» и «r» требуют поиска кода, чтобы посмотреть, для чего они предназначены, но «spiralWidth» и «radius» этого не делают.

+0

Хорошо, так что общая идея: «Комментировать меньше и вместо этого использовать функции»? – kadrian

+0

Это больше, чтобы отделить что-либо от своей собственной функции, которая может быть, что, вероятно, приведет к меньшему количеству комментариев, но я не думаю, что это должно быть целью само по себе. Названия функций определяют намерение, а не реализацию, которые мгновенно делают код более читаемым. –

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

Смежные вопросы