Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sergiy
5 лет назад

42 FreeBASIC. Квадратная спираль

Вспомнил одну задачу с первого курса. В ней текст длиной 121 символ нужно было вписат в квадрат размером 11х11. Таким образом зашифровать.

Решив, а потом дома изрядно поколдовав на компе из 80х я сделал решение очень красивым, но в памяти от него остался лишь след. Попробую заново его изобрести))

Давайте сначала нарисуем квадратную спираль,
это практически то же самое, но более наглядно. А потом уже решим задачу упомянутую выше.

Нарисовав её на листике уже можно найти закономерность: одну вправо, потом вниз, две влево потом вверх, три снова вправо и вниз, четыре и т.д.
1 - напрвление меняется по кругу, через 4 шага
2 - длина увеличивается через два шага

Осталось переложить это на FreeBASIC

ScreenRes 800,600

Центр экрана получается 400,300. Длина линии пусть будет 10
Рисуем вправо - line(400, 300)-(410, 300)
Теперь вниз - line -(410, 310) если первую точку не указываем - рисует от последней поставленной точки.

Теперь шаг нужно увеличить - не 10, а 20
Возвращаемся влево - line -(390, 310)
и вверх line -(390, 290)

Снова увеличиваем темп - шаг=30
Вправо line -(390+30, 290)
вниз -line -(390+30, 290+30)

В последних строкам мне было лень считать - пусть считает компьютер))

Но что это за решение? Двоечника? Троечника? Так до вечера можно спираль рисовать)))

Оператор line ведь может рисовать не только в абсолютных координатах рисовать(от левого верхнего угла экрана), но и в относительных - относительно последней поставленной точки.

ставим точку pset (400,300)

Рисуем вправо - line -STEP (10, 0)
Теперь вниз - line -STEP (0, 10)

Теперь шаг нужно увеличить - не 10, а 20
Возвращаемся влево - line -(-20, 0)
и вверх line -(0, -20)

Снова увеличиваем темп - шаг=30
Вправо line -STEP (30, 0)
вниз -line -STEP (0, 30)

Возвращаемся влево - line -STEP (-40, 0)
и вверх line -STEP (0, -40)

и т.д. уже штамповать(клонировать строки кода) легче, но до 500 копипастить ещё много

А такое решение уже тройка? четвёрка?

Ну как же без цикла?

    line -STEP (i, 0)
    line -STEP (0, i)
    line -STEP (-(i+10), 0)
    line -STEP (0, -(i+10))
next i

Отлично!?

Так результат тот же, но это я бы уже назвал - отлично))


screenres 800,600

dim i as integer
const k as integer=10
pset (400,300)

for i=k to 500 step 2*k
    line -STEP (i, 0)
    line -STEP (0, i)
    line -STEP (-(i+k), 0)
    line -STEP (0, -(i+k))
next i

sleep

Но я бы ещё намудрил в цикле - чтоб один line был)) вместо четырёх...

@sergiy

13
472.115 GOLOS
На Golos с October 2016
Комментарии (5)
Сортировать по:
Сначала старые