Формула для рисования пирамиды из кругов - PullRequest
2 голосов
/ 14 июня 2010

Я пытаюсь создать в своей игре пирамиду из кругов, которая выглядит примерно так:

альтернативный текст http://img266.imageshack.us/img266/3094/lab1213c.jpg

Но я не могу заставить его печататься правильно. Постоянно я получаю действительно странные спирали, но ничего похожего на это. Кто-нибудь может дать мне несколько советов о правильной формуле? Мое окно 600х600, основание пирамиды 8.

    fields = new Field[BASE*(BASE/2)+4];
    int line_count = BASE;
    int line_tmp = line_count;
    for(int i=0; i< fields.length; i++){
        for( int j=line_tmp; j <= line_count; j++){
            fields[i] = new Field(0, (150+(line_tmp*5)),(600+line_tmp*5));
        }
        line_count--;
        line_tmp = line_count;
    }

1 Ответ

2 голосов
/ 14 июня 2010

Я вижу следующие ошибки:

  • Неверная формула размера массива.
  • Включая line_tmp (который кажется вашим счетчиком столбцов) в вашем y expression.
  • Наличие двух переменных, line_count и line_temp, которые всегда равны.
  • Наличие внешнего цикла для подсчета по узлу, а не по строке.
  • Имея в общем бессмысленные имена переменных и магические числа.
// I use <b>java.util.ArrayList</b> because using its add(..) method is convenient here.
// The proper forumula for anticipated number of nodes is: base&times;(base+1)&divide;2
final List<Field> fields = new ArrayList<Field>(BASE*(BASE+1)/2);
// I use a <b>java.awt.Point</b> to store the (x,y) value of the first node of the row.
// This clarifies the meaning, rather than using ints or long inline expressions.
final Point rowStart = new Point(PANEL_WIDTH/2, DIAMETER);

// The number of rows equals the number of nodes on the final row.
for (int row = 1; row <= BASE; row++) {
    // The <i>n</i>th row has <i>n</i> nodes.
    for (int circle = 0; circle < row; circle++) {
        // Each row starts at rowStart and each subsequent circle is offset to 
        // the right by two times the circle diameter.
        fields.add(new Field(0, rowStart.x + circle*DIAMETER*2, rowStart.y));
    }
    // Each subsequent row starts a little down and to the left of the previous.
    rowStart.x -= DIAMETER;
    rowStart.y += DIAMETER;
}

Не забудьте использовать это только как справку для исправления вашего собственного кода, если это домашняя работа.

...