Статья Автор: Лебедев Дмитрий Алексеевич

Программирование в примерах и задачах от Черепашки. Часть 1. Пунктирные линии

Пример 1. Пунктирная линия.

Надо научить рисовать пунктирную линию. 
Вроде все просто. Запрашиваем длину штриха и количество шагов и GO!

 

Если задано расстояние R и длина штриха d, то число повторов можно определить делением R на d
Можно задавать расстояние R и число штрихов n.
Задача усложняется, если рисовать надо из  точки A в точку B. Можнно : перейти в точку A, взять курс на точку B, вычислить расстояние  и далее также как ранее.
Это возможный путь, но есть более простой.
Сформулируем вспомогательную  задачу
Есть точки \(A,B\ надо\ найти\ точку\ С,\ такую\ что C\in \overline{AB}\ и\ длина\ \overline{AC}\ относится\ \ к\ длине\ \overline{CB}\ как\ n: m \)
Для чисел можно было бы написать соотношение \(C = A + n\cdot\frac{B-A}{n+m}\ или\ C = \frac{m\cdot A + n\cdot B}{n+m}\)
значение \(C\) называют средневзвешанным набора \((A,B)\) по набору \((m,n)\)
Для точек/векторов тоже можно получать средневзвешанное значение, вычислив его для каждой координаты.
Ниже программа, которая реализует данный подход.
 

 

Как нарисовать прямую \(\overline{AB}\) по координатам точек \(A, B\)?
Предположим, что \(A,B \)
 - точки/числа на координатной  прямой и надо найти точку \(C > B,\ такую,\ что\ |BC| = k\cdot|AB| \)
То есть, \(C = B + k\cdot|AB| = B +k\cdot(B-A)=-k\cdot A+(k+1)\cdot B = \frac{-k\cdot A\ +\ (k+1)\cdot B}{(-k)\ +\ (k+1)}\)
и получилось, что значение \(C\) есть средневзвешанное набора \((A,B)\) по набору \((-k,k+1)\) (можно сказать, что отрезок \(\overline{AB} \ разбили\ в\ отношении\ k+1 : - k)\))
Эта идея реализована в следующей программе

 

 

Пример 2.Рисуем сетку

Умея рисовать  пунктирные линии можно наприсовать фрагмент бумаги в клетку.
Напишем процедуру setka(A,B, m, t), которая получает
  • A - координаты нижнего левого угла
  • B - верхнего правого угла
  • m - размер клетки (считаем квадратной)
  • t - исполнитель/черепашка для рисования 
Приведем возможный код решения. Конечно, список параметров можно изменить(например, добавить величину штриха)

 

Теперь можно написать программу-редактор, выполняющую задание графического диктанта, то есть рисующую по точкам
Пока будем использовать только команды:
  •  смещение (V) V(a,b) перемещает точку и текущей позиции (x,y) в позицию (x+a, y+b)
  • поднять перо U - поднимает перо исполнителя
  • опустить перо D - опускает перо исполнителя
Ниже приведен пример рисования ромба с вершинами в точках (0,0); (1,2); (3,3); (2,1)

 
Печать