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

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

Пример 2.1 Сложение углов

Считается, что умеем рисовать линии, в том числе пунктирные.
Умеем рисовать сетку и выполнять "командную строку" по узлам клетки.
Следующая программа рисует \(\measuredangle AOB\) c отношениеv \(\frac{оридината}{абцисса} = \frac{1}{2} (тангенс\ угла =\frac{1}{2}) \) 
и рисует \(\measuredangle AOС\) c отношениеv \(\frac{оридината}{абцисса} = \frac{1}{3} (тангенс\ угла =\frac{1}{3}) \) 
 

 

Как построить \(\measuredangle AOD = \measuredangle AOB + \measuredangle AOC \)?
Продлим отрезок \(\overline{OB}\ до\ точки\ B_1\ так,\ что\ \overline{OB_1} = 3\cdot\overline{OB}\) и добавим \(\overline{OB}\ повернутый\ влево\ на\ 90\ градусов\)
получим точку \(D\)

 

Попробуем понять, как считать координаты точки D в общем случае.
Пусть
  • \((x,y)\ координаты\ вектора\ \overrightarrow{OB}\), тогда \((-y, x)\ координаты\ вектора\ \overrightarrow{OB_1}, \ перпендикулярного\ \overrightarrow{OB}\) 
  • \((a,b)\ координаты\ вектора\ \overrightarrow{OC}\)
вектор \(\overrightarrow{OD} = a\cdot\overrightarrow{OB} + b\cdot\overrightarrow{OB_1} =(ax - by, ay + bx) \)
Можно заметить, что результат будет таким же, если поворачивать \(вектор\ \overrightarrow{OС}\ \ на \ угол\ вектора\ \cdot\overrightarrow{OB}\)
Напишем программу, проверяющую правило

 

Пример 2.Преобразования: Растяжение, Поворот и Сдвиг

Пусть заданы координаты трех точек \(A = (0, 0); B=(0, 1); C=(0,3)\)  Можно нарисовать треугольник \(\overline{ABC}\)
но на экране монитора он будет выглядеть очень маленьким.
  • Как его увеличить?
  • А если нам надо его сместить на полотне, чтобы он выглядел более "симпатично"?
  • А если изображение надо повернуть?
Для решения "задачи увеличения" достаточно координаты точки \((x, y)\ умножить\ на\ некоторое\ число\ m\)
Для решения "задачи смещения" достаточно координаты точки \((x, y)\ увеличить\ на\ некоторые\ числа\ a, b \)
А что делать для поворота?
Оказывается, что можно ввести две опреции для двумерных точек, которые решают данные проблемы:
  • "сложение"  \((x,\ y)\ +\ (a,\ b) =(x\ +\ a,\ y\ +\ a)\) - легко заметить, что это обычное "векторное сложение"
  • "умножене" \((x,\ y)\ *\ (a,\ b) =(x\cdot a -\ y\cdot b,\ x\cdot b\ +\ y\cdot a)\) 
Заметим, что это операции сложения и умножения "комплексных чисел", для которох выплняются правила сложения и умножения "обычных чисел"
Вычислим \((x, y)* (m,0) = (x\cdot m - y\cdot 0, x\cdot 0 + y\cdot m) = (x\cdot m, y\cdot m)\)  - значит умножение на \((m,0)\) выполняет функцию масштабирования
Следующая программа поможет понять механизм "комплексного умножение"
Программа запрашивает два числа \(m, n\) и строит:
  • черный треугольник с точками \(A*(|m|,0), B*(|m|,0),C*(|m|,0)\)
  • красный треугольник с точками \(A*(m,n), B*(m,n),C*(m,n)\)


Попробуем понять, как это работает
Пусть O начало координат,  точка P имеет координаты (x,y). 
Точка P1 с координатами (x1,y1) получена из P умножение на (m,n)/
Тогда 
  •  

 

 

 
Печать