Поиск алгоритма пробела для художественной программы ASCII ориентировочного размера - PullRequest
0 голосов
/ 15 февраля 2019

Итак, мы должны разработать книгу по искусству ASCII, и я почти закончил, но я не могу понять одну маленькую вещь: интервал с обеих сторон слова «Создание программ Java»

Вот как должна выглядеть книга

Вот мой код (пока для простоты, я только показываю метод, в котором требуется помощь в пробелах. Предположим drawLine () равномерно рисует пунктирную линию относительно значения константы SIZE)

    //constant SIZE = 8
    public static void drawBottom()
    {
        //Dash line on top of the bottom portion of the book
        drawLine();

        //Printing first set of rightmost "/"'s
        for(int i = 1; i <= SIZE; i++)
            System.out.print("/");
        System.out.println();

        for(int i = 1; i <= SIZE / 2; i++)
        {
            //Leftmost pipe
            System.out.print("|");

//            TO DO: Code label of book
//            for(int j = 1; j <= ; j++)
//            {
//                
//            }

            //This loop is only here for example. To show I can fill the space but need
            //the words in the space
            for(int j = 1; j <= SIZE * 3; j++)
            {
                System.out.print(" ");
            }

            //Rightmost pipe
            System.out.print("|");

            //"Pages" to right of label
            for(int j = 1; j <= -2 * i + (SIZE + 2); j++)
            {
                System.out.print("/");
            }

            //Move to draw next row
            System.out.println();
        }

        //Dash line on very bottom of entire drawing
        drawLine();
    }

Вот мой вывод (когда SIZE = 8)

Как я могу выяснитьинтервал слева и справа от текстового блока «Создание программ Java»?

Все, что я знаю, это то, что когда SIZE = 8, с каждой стороны по одному пробелу

Когда SIZE = 10,с каждой стороны по 4 пробела

Когда SIZE = 13, с каждой стороны по 8 пробелов

Какой алгоритм мне здесь поможет?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Я понял это!Уравнение, которое мне нужно было использовать, было наклоном-перехватом все время!

РАЗМЕР = 8, пробел = 1

РАЗМЕР = 10, пробел = 4

Включите ихв точки (8, 1) и (10, 4)

Запомните форму пересечения склона y = mx + b

Найти m m = (y2 - y1) / (x2 - x1)

m = (4 - 1) / (10 - 8)

m = 3/2

Решите для b Используя любую точку.Я буду использовать (8, 1)

1 = 3/2 x 8 + b

b = 1 - (3/2) (8)

b = -11

Прибыль! y = 3 / 2x - 11

Или в нашем случае ...

for(int j = 1; j <= (3*SIZE)/2 - 11; j++)
{
    System.out.print(" ");
}

System.out.print("Building Java Programs");

//put same loop here again
0 голосов
/ 15 февраля 2019

Каждая строка может быть разделена на три области: Первая область состоит из пробелов, расположенных от включающего индекса A до включающего индекса B.Вторая область содержит текст, расположенный от включающего индекса C до включающего индекса D.И третья область снова состоит из пробелов, расположенных от включающего индекса E до включающего индекса F.Боковые трубы расположены по индексам 0 и width + 1:

|A......BC......DE......F|

. Первая и третья области имеют длину width/2 - text/2, где text обозначает длину текста.

Тогда индексы:

Index A: 1
Index B: width/2 - text/2  
Index C: B + 1
Index D: width/2 + text/2
Index E: D + 1
Index F: width

В цикле необходимые символы могут отображаться в соответствующей области:

// Code: label of book
int width = 3 * SIZE; 
width = (width % 2 == 0) ? width : width - 1;           // if the width is odd, choose the next smallest even number 
String text = "Building Java Programs";
for(int j = 1; j <= width; j++) {
    if (j <= width / 2 - text.length() / 2) {           // j <= Index B
        System.out.print(" ");
    }
    else if (j >= width / 2 + text.length() / 2 + 1) {  // j >= Index E = Index D + 1    
        System.out.print(" ");
    }
    else {
        System.out.print(text);
        j = width / 2 + text.length() / 2;              // j = Index D
    }
}

Конечно, первый иВторые if -элементы также могут быть реализованы в комбинации.

Выход (SIZE = 8, width = 24):

Without text...
|                        |////////
|                        |//////
|                        |////
|                        |//

With text...
| Building Java Programs |////////
| Building Java Programs |//////
| Building Java Programs |////
| Building Java Programs |//

С каждой стороны по одному пробелу (1 + 22 + 1 = 24)).

Выход (SIZE = 10, width = 30):

Without text...
|                              |//////////
|                              |////////
|                              |//////
|                              |////
|                              |//

With text...
|    Building Java Programs    |//////////
|    Building Java Programs    |////////
|    Building Java Programs    |//////
|    Building Java Programs    |////
|    Building Java Programs    |//

С каждой стороны по четыре пробела (4 + 22 + 4 = 30).

Выход (SIZE = 13, width = 38):

Without text...
|                                      |/////////////
|                                      |///////////
|                                      |/////////
|                                      |///////
|                                      |/////
|                                      |///

With text...
|        Building Java Programs        |/////////////
|        Building Java Programs        |///////////
|        Building Java Programs        |/////////
|        Building Java Programs        |///////
|        Building Java Programs        |/////
|        Building Java Programs        |///

С каждой стороны по восемь пробелов (8 + 22 + 8 = 38).

...