Разъяснения алгоритма программы бегущего человечка.

Вы уже познакомились с кодами программы «Бегущего человечка». И вы уже знаете, что в программе есть несколько строк кодов, которые вычисляют координаты точек ног человечка. Для удобства мы приняли, что траекторией движения «ступней» ног человечека будет окружность. Эти коды следующие:
Xlega1 = 0
Ylega1 = 0
Xlega2 = - R*sin(alpha)
Ylega2 = -R*cos(alpha)

Xlegb1 = 0
Ylegb1 = 0
Xlegb2 = R*sin(alpha)
Ylegb2 = -R*cos(alpha)

Наверное, многие из вас здесь впервые столкнулись с выражениями R*cos(alpha) и R*sin(alpha). Что это такое?
Если отвечать кратко, то это функции, являющейся произведением двух сомножителей. Первый сомножитель- это переменная R – радиус окружности. Второй сомножитель- так называемые тригонометрические функции синус угла альфа и косинус угла альфа.
В математике эти функции записали бы так: R*cos(α) и R*sin(α). Значения обеих функций зависят от переменной R и переменной α. R- как мы сказали, это радиус окружности. Но в общем случае, это может быть длина некоторого отрезка, длиной R. Переменная α — это угол. Мы назвали его альфа, но могли бы назвать его и любой другой буквой. В математике для обозначения углов принято использовать буквы греческого алфавита. Например, это могла бы быть и тэта : θ.

Ниже, в таблице приведены буквы греческого алфавита, и как они произносятся по русски.

Эти же буквы с произношением по английски приведены ниже:

Как видите, русский алфавит ближе к греческому, чем английский. Ведь кириллица использует почти все те же буквы. Только одна буква θ не имеет аналога в современном русском языке.

Итак, функции R*cos(α) и R*sin(α) берут переменные R и α , и преобразуют их. Во что же они их преобразуют, и вообще, для чего придумали эти функции? Их придумали для вычисления координаты точек окружности и сторон прямоугольного треугольника. Позже, вы увидите, что это два взаимосвязанных вычисления. Пока же начнем с прямоугольного треугольника.

Функции sin(α) и cos(α) и прямоугольный треугольник.

Пусть нам дан произвольный прямоугольный треугольник. Например, как на верхнем рисунке на Рис.1. В прямоугольном треугольнике самая длинная сторона называется гипотенузой. Она всегда лежит напротив прямого угла треугольника. Две другие стороны прямоугольного треугольника называются катетами. Еще раз подчеркну: все это верно только для прямоугольных треугольников.
Пусть в этом треугольнике один из углов равен θ. Чему именно? θ может быть равен любому углу больше ноля и меньше 90 градусов. Тогда, длина катета прилежащего к углу θ равна R*cos(θ ). А длина катета лежащего напротив угла θ будет равна R*sin(θ ).

Применяем функции sin(α) и cos(α) для вычисления координат ступней человечка.

В нашем случае, мы используем эти функции, чтобы найти Х и Y координаты ступней человечка. Траектория движения ступней в виде штриховой окружности, и нога человечка изображены на изображены на Рис.1. В этом случае, нога изображена как отрезок R, который равен радиусу окружности. Если построим проекции точки ступни на оси координат, то как видно из рисунка, мы построим два прямоугольных треугольника. И тогда пользуясь свойством тригонометрических функций в прямоугольных треугольниках, можно легко найти, что произведение -R*sin(alpha) вычисляет Х координату ступни, где радиус R их гипотенуза, а угол α — это угол между ногой и осью OY (Рис.1).

Рис.1. Вверху, справа нарисован прямоугольный треугольник. В нем, длина стороны противолежащая прямому углу, (она называется гипотенузой) равна R. Пусть в этом прямоугольном треугольнике мы знаем, чему равен один из двух других углов. Например, мы его измерили и он оказался равен θ градусов (переменные для обозначения величины углов в геометрии обычно записывают греческими буквами, а не словами, как в программировании). Переменная θ может означать любое число большее 0 градусов, но меньшее 90градусов, или, если мы будем мерить в радианах, то более 0 и менее π/2. Тогда длина прилежащей к углу θ стороны прямоугольного треугольника (сторона называется катетом) будет равна R*cos(θ ). А длина катета лежащего напротив угла θ будет равна R*sin(θ ). Внимание: всё это верно только для прямоугольного треугольника!!!
Рисунок внизу показывает, как зная значения угла и радиуса для любой точки на окружности, можно найти её Декартовы координаты с помощью функций синус и косинус. Как вы видите, эти вычисления аналогичны тем, что используются в прямоугольном треугольнике, только угол обозначен другой буквой.

Аналогично вычисляется координата Y. Но здесь используется функция: -R*cos(alpha).

Градусы, радианы и число π.

В подписи к рисунку говорится, что угол может измеряться или в градусах, что вы обычно делаете, когда измеряете транспортиром, или в радианах, что часто делают в компьютерных программах. Здесь число π — это тоже буква греческого алфавита, но она обозначает не переменную. Так называется математическая константа, равная отношению половины длины окружности, к её радиусу.
На первый взгляд, кажется, что длину окружности и её радиус можно легко измерить, а затем легко посчитать их отношение. Но ни длину окружности, ни половину её длины точно измерить нельзя. Поэтому точного значения числа π никто не знает. Первые три знака в числе π следующие: 3.14 .Полная же запись числа будет содержать бесконечное число цифр. При этом все цифры всегда будут образовывать все новые и новые комбинации. Если бы кто-то смог точно вычислить это число, то в его записи вы смогли бы найти любую комбинацию из цифр. Например 1111234, или 1111111, или 123443212344321 и т.д.. Более того если мы зашифруем с помощью цифр наш алфавит (например пусть буква А это 1, Б- 2 , В-3 , и так далее до Я-33), и затем запишем число π с помощью букв (для этого правда надо сначала записать число π в 33-значной системе), то в этой записи рано или поздно вы сможете прочитать любой из написанных на Земле текстов, включая любой роман или рассказ, или любую из текстовых записей на вашем телефоне. Существуют и другие подобные числа. Например число e. Такие числа называются иррациональными. Значения числа π или е, с максимально возможным количеством знаков после запятой для вашего компьютера, вы легко можете посмотреть в таблицах OpenOffice записав в ячейку =pi(), или =e . Только не забудьте изменить для этого еще и формат ячейки: правая клавиша->Format Cells, затем увеличьте Decimal Places до максимально возможного. Также увеличьте ширину самой ячейки, чтобы число поместилось в неё. Например, у вас может получиться число 3.14159265358979000000. Оно на самом деле означает, что ваш компьютер смог посчитать только число 3.14159265358979. Более точное значение можете получить с помощью программы на Basic или калькулятора на компьютере: 3.141592653589793238462643. Но и это, конечно, не бесконечно длинное число, а очень короткая его часть.

Несмотря на такую неопределенность с точным значением, число π часто используется в программировании и в физике. Ведь для большинства практических применений нам достаточна та точность, которая уже достигнута. Переход от углов к радианам тоже очень простой. Угол 180 градусов равен π радиан. Вместо слова градусы можно использовать условное обозначение, значок «о». Например: 90 градусов = 90о .

Функции R*sin(α) и R*cos(α) и примеры похожих функций из нашей повседной жизни.

Давайте теперь немного подробнее познакомимся с функциями синус и косинус: sin и cos угла, и с функцией R*cos(α) и R*sin(α). Более детально вы изучите их в старших классах. А сейчас вы познакомитесь с тем минимумом, который вам понадобиться при написании программы.
Во-первых, не надо пугаться слов синус и косинус. Это всего лишь названия двух специальных функций, с помощью которых легко найти координаты точек окружности. Вы уже многократно сталкивались с разными функциями. Что делает любая функция? Она осуществляет преобразования.
С различными функциями вы часто встречаетесь в повседневной жизни. Например, вам надо купить мороженое. Сколько денег вам надо будет заплатить за него? Это зависит от сорта мороженого и веса порции, которую вы купите. В данном примерe стоимость мороженого есть функция его веса и сорта. То есть, вы говорите продавцу какой сорт мороженного вы хотите купить и сколько хотите купить по весу. А продавец выполняет роль функции и преобразует эти данные в цену, которую вам сообщает. Иногда вместо веса в граммах, вы говорите сколько шариков мороженного вам положить в стаканчик, Тогда можно сказать, что вес измеряется не в граммах, а в шариках мороженного. Или можно сказать, что вместо веса вы пользуетесь объёмом, и измеряете объём купленного мороженного в шариках. В данном случае, это не изменит окончательную цену покупки. Ведь вес мороженного и его объём взаимосвязаны: вес мороженного прямо пропорционален его объёму, и ваша функция-продавец легко учтет это.
Рассмотрим пример по сложнее. Пусть вам надо купить провода для пайки вашего электронного устройства. Вы заходите на сайт McMaster-Car (www.mcmaster.com), и после недолгого поиска electrical wire, перед вами будет такая страница (Рис.2)

Рис.2. Веб страница McMaster-Car (в малиновой рамке) на которой вы можете выбрать и заказать провода. Существует множество разных проводов. Они отличаются внешним диаметром (OD), диаметром металлической сердцевины провода, которая непосредственно проводит ток (Wire Gauge), длиной провода. Эти и другие параметры указаны в левой колонке (в зеленой рамке). К другим параметрам относятся материал сердцевины провода, материал и цвет изолятора провода, гибкость провода. Суммарная таблица для покупки провода обведена оранжевой рамкой. На рисунке также приведено увеличенное изображение колонки с параметрами и таблицы. Увеличенные изображения обведены рамками с соответствующим цветом. Итоговая стоимость провода, который вы хотите купить, на математическом языке и на языке компьютерной программы, может быть записана как функция WirePrice. Эту функцию можно записать тоже в виде произведения функции WirePricePerLength и переменной Length. Функция WirePricePerLength будет выдавать цену провода единичной длины в зависимости от диаметра металлической жилы провода WireGauge , внешнего диаметра провода OD, и минимальной длины, которую надо купить по данной цене MinLength. MinLength — это единица измерения длины. Как видно из таблицы эта единица длины может быть равна 10, 25 или 50 футам. Т.е. в случае единичного отрезка длиной 10 футов мы можем купить провода длиной 10, 20, 30, и т. д. футов. В случае единичного отрезка длиной 50 футов, мы можем купить провода с длиной кратной 50 футам. Например 50, 100, 150, или 200 футов, но не сможем купить 10 футов, или 30футов.
Также обратите внимание, что задав WireGauge вы задаете диаметр металлической жилы провода. Только учтите, что численные значения WireGauge -это коды диаметров. С помощью Google, вы можете найти по этим кодам величины самих диаметров.

Из этой страницы, вы видите, что цена провода зависит, от того, какой диаметр металлической жилы (сердцевины) WireGauge , какой внешний диаметр провода OD, и какая длина провода вам нужны. Ещё, провода могут различаться материалами из которых сделана металлическая жила и изолятор провода, гибкостью провода. Но в данном случае у вас большого выбора нет: Это только медные гибкие провода с изолятором из пластика. Бывает, что вам нужен провод, который должен проходить через отверстия в плате. Поэтому вы знаете какой диаметр OD должен быть у вашего провода. Но чаще, провода покупают в зависимости от величины электрического тока, который будет по ним протекать. Для большего тока нужны провода с большим диаметром металлической жилы. У вас есть выбор цвета провода, но от него цена не зависит. Величины WireGauge, OD, материал, гибкость, цвет провода, являются переменными от которых зависит конечная цена.
Также, стоимость вашей покупки будет сильно зависеть от длины провода. Чем длиннее провод, тем он дороже. Длина провода- это тоже переменная. В самом простом случае, можно сказать, что цена провода прямо пропорциональна его длине. Т.е. во сколько раз провод длиннее, во столько раз его цена больше. Например, пусть 10 футов стоят $14, а вам нужен провод длиной 40 футов. 40 футов длиннее 10 футов в 4 раза. Тогда цена провода будет $14*4= $56.
В нашем случае зависимость цены от длины провода сложнее. Причина тому- желание продавца продать побольше. Поэтому он предлагает вам скидку в цене, если вы купите провод подлиннее. Например из таблицы следует, что провод калибра (переменная WireGauge) 36, длиной 10 футов стоит $14.05, или это $14.05/10=$1.405 за один фут. А тот же провод длиной 50 футов стоит $53.22. Теперь цена стала менее $1.065 за один фут. Скажем, вам хотите купить 100 футов провода. Вы можете попросить отмерить 10 раз по 10 футов, и тогда 100 футов провода будут стоить 10*$14.05=$140.5. Или можете попросить отмерить 2 раза по 50 футов. И тогда те же 100футов провода стоят 2*$53.22=$106.44. Получается продавец предлагает вам скидку $33.54, за покупку провода длиной 100 футов. Обратите внимание, за 50 футов предлагается скидка, но в этом случае вы должны покупать провод длиной кратной 50 футам: 50 футов, 100 футов, 150 футов и так далее. Например, вы не сможете купить 140 футов по этой цене. Вам надо будет брать или 100футов, или 150 футов. И минимальная длина провода по этой цене может быть только 50 футов.
На математическом языке, вычисление стоимости вашей покупки, как всегда, может быть записано с помощью функции. Назовем эту функцию «WirePrice». Очевидно, чтобы посчитать стоимость проводов, надо сначала определить стоимость провода единичной длины, а затем умножить её на длину провода, который хотите купить, но измеренной в этих единицах. На языке математики это можно сказать так: Функция WirePrice будет произведением функции WirePricePerLength и переменной Length.
Функция WirePricePerLength будет выдавать вам стоимость провода в зависимости от минимальной единичной длины (минимальная единичная длина- это переменная MinLength), внешнего диаметра провода (это переменная OD), и диаметра металлической жилы (переменная WireGauge). Задать такую функцию можно с помощью таблиц или графиков, как вы уже делали. В нашем случае, эту функцию задаёт таблица на веб странице. На Рис.2 она обведена оранжевым цветом.
Переменная Length обозначает длину провода.
Что делает функция WirePrice? Она выдаёт стоимость вашей покупки. Для этого вам надо задать значения переменных OD, MinLength, WireGauge, и Length , и функция WirePrice посчитает итоговую стоимость. На языке математики, функция WirePrice берет значения OD, MinLength, WireGauge, и Length и преобразует их в стоимость покупки.
Повторю ещё раз. В нашем случае функция WirePrice задаётся таблицей, но может быть задана и графиком или формулой (т. е. аналитически). После того, как функция задана, её значения могут вычислены с помощью компьютера. Именно так и определяется стоимость покупки на вебстранице. В этом случае, компьютер выполняет функцию WirePrice.
Эту же функцию WirePrice может выполнять не компьютер, а работник отдела продаж, которому вы можете позвонить по телефону. Вы должны будете ему сообщить значения OD, MinLength, WireGauge, и Length, которые вам нужны, а продавец вычислит вам итоговую цену.


Задание: Допустим вам надо купить 60 футов провода с WireGauge=29. Тогда вам выгоднее купить 50 футов по цене $42.30 за 50 футов, и 10 футов по цене $11.17. Итого вам надо заплатить $42.30+$11.17= $53.47. Как вам дешевле всего купить 170 футов этого провода? А как вам дешевле купить 49 футов? А как вам дешевле купить провод длиной 40 футов?


Произведение R*sin(θ )- это тоже функция. Только она вычисляет длину катета лежащего напротив угла θ (Рис.1), а не стоимость покупки. Эта функция тоже произведение переменной длины (в данном случае это длина гипотенузы прямоугольного треугольника), и функции sin(θ ).
Аналогична ей и функция R*cos(θ ), которая вычисляет длину другого катета прямоугольного треугольника, который соприкасается с углом θ. Эта функция тоже произведение переменной длины ( длины гипотенузы прямоугольного треугольника), и другой функции (теперь это функция cos(θ )).


Для обеих функций, R*sin(θ ) и R*cos(θ ), переменными будут длина R и угол θ. Нам, как и в случае с WirePrice, надо только задать эти переменные, а функции R*cos(θ ) и R*sin(θ ) вычислят необходимые длины катетов. Ну и конечно, все это вычислит компьютер, который знает приблизительные значения функций cos(θ ) и sin(θ ), и умеет вычислять произведения.

Как найти значения функций sin(α) и cos(α)

Как компьютер вычисляет значения cos(θ ) и sin(θ ) ? Раньше, когда компьютеры не были распространены, инженеры сами вычисляли значения функций. Оказывается эти значения можно найти, зная некоторые свойства функций синус и косинус. Ниже, вы познакомитесь с некоторыми из них. Для удобства, на основе этих вычислений были составлены таблицы. Вы их можете найти на Google: Bradis Table of Sines and Cosines. Также поступает и компьютер. Во многих компьютерных языках и программах есть блоки, содержащие алгоритмы вычисления значений функций cos(θ ) и sin(θ ).

Функций sin(α) и cos(α) и окружность.

Поговорим теперь немного об этих загадочных свойствах функций cos(θ ) и sin(θ ), которые используются и для вычисления значений тригонометрических функций. Вы знаете, что многие устройства используют полярные, а не Декартовы координаты. Например, полярные координаты используют радиолокаторы. Полярные координаты очень часто применяются в инженерных расчетах и в программировании. Но для нас более привычны Декартовы. На рисунке 3, показаны 3-ех мерные Декартовы координаты, и цилиндрические, которые тоже используют полярные координаты; и как они описывают одно и тоже движение точки в пространстве.
Как зная координаты точки в полярных координатах, найти координаты этой же точки в Декартовых?

Рис.3 Движение точки в Декартовых и цилиндрических координатах. В обоих случаях, у точки есть только 3 координаты. В декартовых , это проекции точки на координатные оси (Px, Py, Pz), В цилиндрических- это угол, радиус и высота точки: (R, α , Pz).

 


Пусть у нас есть множество точек, лежащих на окружности. Назовем эти точки, как T1, T2, T3.....Tn …. . А их координаты обозначим так (X1 ,Y1), (X2 ,Y2), (X3 ,Y3), …..., (Xn ,Yn)..... Вы уже знаете, что для любой точки лежащей на окружности с радиусом R , её координаты всегда удовлетворяют уравнению
Yn*Yn+ Xn*Xn= R*R
или тоже самое можно записать в таком виде:
Yn2+ Xn2= R2
, где n любое целое число.
С помощью этого уравнения, для точки на окружности, зная её Х координату можно найти её Y координату. Для этого перепишем это уравнение в таком виде:

Yn2 = R2- Xn2

Чтобы найти значение Yn , надо вычислить квадратный корень из выражения R2 - Yn2 . Но квадратный корень может давать два решения, отличающихся знаком + и - , для одного и того же значения Yn2 .

Эта неоднозначность и громоздкость решения неудобны в вычислениях. Чтобы упростить эти вычисления и были придуманы функции cos(θ ) и sin(θ ).

 

Определение функций sin(α) и cos(α).

Функции cos(α ) и sin(α ) определяются следующим образом. Возьмем произвольную точку Tn на окружности с радиусом R и соединим её с центром окружности (Рис.4). У вас получился прямоугольный треугольник ОTnXn . Как мы уже говорили, длину катета этого треугольника OХn можно вычислить зная его гипотенузу OTn и угол прилежащий к этому катету. В обозначениях рисунка это длина R и угол αn. Тогда длина
OХn = R*cos( αn ).
А для катета TnXn верно
TnXn = R*sin( αn ).

Но длина OХn равна величине координаты Хn точки Tn. А длина катета TnXn равна величине координаты Yn точки Tn. Поэтому

Хn = R*cos( αn )

Yn = R*sin( αn )

Если же взять точки лежащие на единичной окружности (R=1 ), то получим

Хn = cos( αn )

Yn = sin( αn )

Это и есть определение функций синус sin( α ) и косинус cos( α ):
Синус угла α равен Y координате точки единичной окружности, лежащей на угле α, а косинус угла α равен Х координате этой точки. При этом угол всегда откладывается против часовой стрелки от оси ОХ.

Случай же с треугольником является следствием этого определения.


Рис.4. Для произвольной точки Tn окружности можно построить ее проекции Yn и Xn, на оси OY и OX. Также можно соединить точку Tn с центром окружности и измерить угол между отрезком OТn и осью ОХ. Пусть этот угол равен α градусам. Тогда координата Xn ( или длина OXn) равна Хn = R*cos( αn ). А координата Yn ( или длина OYn) равна Yn = R*sin( αn ). Если бы у нас была единичная окружность, когда R=1, то координата Хn была бы просто равна косинусу угла: Хn = cos( αn ), а координата Yn равна синусу угла: Yn = sin( αn ).

Это полное определение синуса и косинуса угла верно для самых разных углов от минус бесконечности, до плюс бесконечности. В то время, как для вычисления катетов прямоугольного треугольника используются углы только первого квадранта, причем более 0, но менее 90 градусов.
Рисунок 5 показывает расположение четырёх квадрантов на координатной плоскости.


Рис.5. Расположение четырех квадрантов плоскости.


Задание: проведите радиус окружности образующий угол с осью ОХ равный 720 градусам. А где расположена точка окружности лежащая на угле 900 градусов? А где расположена точка окружности лежащая на угле равном 6*π радиан?


С помощью функций R*sin( α ) и R*cos( α ) можно найти координаты любой точки плоскости. Для этого надо соединить эту точку с центром координат. Это будет радиус окружности. Расстояние от точки до центра координат даст длину радиуса R. Затем надо измерить угол между ОХ и проведенным радиусом. И тогда координата Х для любой точки будет равна
Х = R*cos( α )
, а её Y координата равна
Y = R*sin( α )

Примеры разных точек окружности радиусом R и произвольного угла показаны на рисунке 6.


Рис.6. Примеры разных точек окружности и их углов и соответствующих значений функций
R*sin( α ) и R*cos( α ).

 

Полезные свойства функций sin(α) и cos(α), которые используют при вычислении этих функций.

Значения косинуса и синуса определены для любых углов. Но оказывается, что эти значения всегда можно выразить, через значения синуса и косинуса углов первого квадранта, т. е. через углы от 0 до 90 градусов. Посмотрим например, как это делается для шестой точки на Рис. 6. Этот случай показан на Рис.7.

 

Рис.7. Точка окружности Т6 лежащая в третьем квадранте. В этом случае угол α больше 180 градусов, но меньше 270 градусов.

Для любой точки третьего квадранта можно найти точку первого квадранта центрально симметричную ей относительно начала координат. Для этого надо продолжить радиус соединяющий эту точку с началом координат до повторного пересечения окружности (Рис.8). Т.е. из радиуса OТ6 получится диаметр окружностиТ6 Т'6 . Точка Т'6 будет центрально симметрична точке Т6 . Т.е. если окружность повернуть относительно ее центра на 180 градусов, то точка Т6 перейдет в точку Т'6 , а точка Т'6 перейдет в точку Т6 . При этом ОТ'6 образует угол β с осью ОХ, а ОТ6 образует угол β с отрицательным направлением оси ОХ. В этом случае угол α в градусах можно записать, как α = 180 + β. А если записывать в радианах, то будет α = π + β . Можно также заметить, что треугольник Т6 ОХ6 и треугольник Т'6 ОХβ одинаковы. Ведь они оба прямоугольные. У обоих гипотенуза равна радиусу окружности R. И у них есть одинаковый угол β . Поэтому расстояние ОХ6 равно расстоянию ОХβ, ведь ОХ6 = ОХβ= R*cos(β). Значит координата Х6 = -Хβ . Но по определению функции косинуса, координата Х6 равна R*cos(180+β), координата Хβ равна R*cos(β). Отсюда получается, что
R*cos(180+β) = - R*cos(β).
После деления обеих сторон равенства на радиус, получаем:

cos(180+β) = - cos(β).

Рассмотрев аналогично другие катеты ОY6 и ОYβ можно показать, что

sin(180+β) = - sin(β).

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

Рис.8. Рисунок показывает, как значения функций R*cos(α) и R*sin(α) углов третьего, квадранта могут быть выражены через значения этих функций углов первого квадранта. Для этого находим для произвольной точки третьего квадранта Т6 центрально симметричную ей точку первого квадранта Т'6 . Эта точки будут лежать на пересечении окружности и прямой Т6Т'6 , поскольку и прямая и окружность переходят сами в себя при повороте на 180 градусов относительно центра окружности (говорят, что они центрально симметричны). Также при таком повороте перейдет в сама в себя и ось ОХ (она только изменит направление при таком повороте). Поэтому угол Х6 ОТ6 перейдет в угол ХβОТ'6 . Значит величины этих углов одинаковы ےХ6 ОТ6= ےХβОТ'6 = β

Используя свойство, что все точки окружности второго квадранта симметричны относительно оси OY точкам окружности первого квадранта, можно выразить значения sin и cos углов второго квадранта через значения значения sin и cos углов первого квадранта.

cos(α)= -cos(180-α)
sin(α)= sin(180-α)

А используя свойство, что все точки окружности четвертого квадранта симметричны относительно оси OХ точкам окружности первого квадранта, можно выразить значения sin и cos углов четвертого квадранта через значения значения sin и cos углов первого квадранта.
Запишется это так:

cos(α)= cos(360-α) = cos(-α)
sin(α)= -sin(360-α) = -sin(-α)

Значит, чтобы компьютеру подсчитать значения sin и cos любых углов, достаточно знать значения sin и cos углов только первого квадранта.

Также можно заметить, что катеты прямоугольного треугольника можно вычислить зная гипотенузу и один из двух острых углов. Например, рассмотрим треугольник на Рисунке 8.
Если мы возьмем гипотенузу R и угол α, то его катеты равны:
длина синего катета равна R*cos(α)
длина зеленого катета равна R*sin(α).
Если же мы возьмем гипотенузу R и угол θ, то его катеты равны:
длина синего катета равна R*sin(θ)
длина зеленого катета равна R*cos(θ).
Т.е. мы получили, что R*cos(α)= R*sin(θ), и R*sin(α)=R*cos(θ). Опять сокращаем обе стороны уравнений на R и получаем:

cos(α)= sin(θ)
sin(α)= cos(θ)


Рис.9. Два способа вычислить длину одного и того же катета с помощью функций sin и cos.

Учтем теперь, что сумма углов любого треугольника равна 180 градусам. Значит для нашего прямоугольного треугольника
α + θ + 90o =180o
Отсюда
α + θ = 90o
Или
θ = 90o - α
Тогда

cos(α)= sin(90o - α )
sin(α)= cos(90o - α )

Получается, что достаточно вычислить значения только например cos от углов первого квадранта. Тогда значения cos углов первого квадранта уже можно найти через значения sin. Более того достаточно вычислить значения sin углов от 0 до 45 градусов. Все остальные значения функций sin и cos для любых углов можно вычислить через них. Как конкретно вычислять значения этих функций углов от 0 до 45 градусов, мы сейчас не будем. Для этого надо будет найти правило, как вычислять значения этих функций от суммы двух углов. Еще полезно знать, что для углов менее 10 градусов=π/18 радиан значения sin такого угла приблизительно равно значению угла выраженному в радианах. Т.е. если α измерено в радианах, и при этом α < π/18, то sin( α) ~ α. Причем чем меньше угол, тем точнее это приближение.

 


Задание: До сих пор мы определяли тригонометрические функции словами и аналитически с помощью уравнений. А теперь посмотрим, как выглядит графическое представление этих функций. С помощью OpenOffice SpreadSheets постройте графики y=cos(α) и y=sin(α )для α от -720 градусов до 720 градусов. Подсказка: вы строите графическое представление функций cos(α) и sin(α ) в декартовых координатах. Поэтому в этих графиках y=cos(α) и y=sin(α ), а x=α .


 

Программируем шагающего на месте человечка с помощью функций R*sin(α) и R*cos(α).

Итак, вы познакомились с функциями R*cos(α) и R*sin(α). Посмотрим теперь, как с помощью этих функций можно запрограммировать движение человечка на месте. Когда вы делали gif файл с мультяшкой движущегося на месте человечка, вы рисовали несколько слайдов. Эти слайды были аналогичны рисунку 10.

Рис.10. Отдельно взятый кадр из мультяшки "человечек движущейся на месте".

Всего было 5 кадров-слайдов, похожих на кадр рисунка 10. Угол гол наклона ног α менялся от слайда к слайду. Когда человечек раздвигал ноги, то угол наклона α рос. Когда человечек наоборот сдвигал ноги, то угол наклона уменьшался. Всего мы делали 4 таких кадра. Но их может быть и 6, и 10, и 100. За их число в программе отвечает переменная m. Получившаяся мультяшка представлена на Рис.11.

 

Рис.11. Человечек шагающий на месте.

Обратите внимание, что в этом случае координаты самого тела человечка не меняются. Двигаются только ноги.

 

Программируем движущегося человечка.

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


Мы пока не будем программировать такую последовательность. Для начала мы упростим нашу задачу, и не будем различать какая ступня коснулась земли. Мы просто начнем перемещать человечка вдоль оси ОХ со скоростью один шаг за один цикл из 4 кадров
(как уже сказали, цикл может содержать любое число кадров-слайдов. В программе они задаются числом m).

А чтобы было проще программировать это движение, мы разобьём его на два независимых движения. Первое движение- это движение ног человечка относительно его тела. И хотя тело движется, но ноги никуда не уходят от тела и только ступни движутся циклически по круговой траектории. Поэтому их движение относительно тела будет то самое движение на месте, которое мы только что рассмотрели. Для описания этого движения мы используем Декартову систему координат XY связанную с телом (Рис. 12). За начало координат, как и ранее , примем верхнюю точку ног. Эта система координат XY будет двигаться относительно Земли так же, как и тело . Но тело относительно неё будет стоять на месте и только двигать ногами.
Второе движение- это движение тела относительно Земли. Для описания этого движения мы введем систему координат X'Y', которая покоится относительно Земли. За её начало отсчета примем точку касания земли опорной ступней, в первый момент времени. Это наша покоящаяся система отсчета. Система координат XY будет двигаться относительно неё. Поэтому система XY будет называться движущейся системой координат.

Рис.12. Покоящаяся X'Y' и движущаяся XY системы координат. Верхний рисунок показывает положение тела и ног в первый момент времени. Нижний рисунок показывает положение ног и тела в момент наибольшего расстояния между ступнями и наибольшего угла между ногами.

Обратите внимание. В движущейся системе (верхний Рисунок 12), координаты опорной ступни  координат равны:

Х1= -R*sin(α), Y1= -R*cos(α)

, а координаты основания ног/низа тела (0,0).


Эти же точки в покоящейся системе координат :
координата опорной ступни теперь стала (0,0),
а координаты основания ног/низа тела:

Х'1= R*sin(α), Y'1= R*cos(α)

Если мы примем, что в начальный момент α =0, то координата начала отсчета движущейся системы координат в неподвижной системе будет:
Х'1= 0, Y'1= R.
В нашем случае один шаг является циклом из 4 движений/слайдов. Логично принять, что величина перемещения человечка за один такой цикл будет равна максимальному расстоянию между ступнями (Рисунок справа на Рис. 12) . Это расстояние, мы примем за длину шага. Поэтому примем, что в каждом слайде, тело человечка будет смещаться на ¼ от длины шага. Рис.13 показывает движение человечка, которое получится в этом случае.

Рис.13. Двигающийся человечек.

Видно, что координаты начала отсчета движущейся системы меняются следующим образом:

Y1 =R , и не меняется во время движения.
X1= (Шаг/4)*(число шагов).

Мы теперь знаем как меняются координаты ступней относительно начала отсчета движущейся системы координат. И знаем как меняются координаты этой точки начала отсчета относительно начала отсчета покоящейся системы координат. Этого достаточно, чтобы написать функцию описывающую движение ступней и тела относительно начала отсчета покоящейся системы координат, и использовать эту функцию в наше программе. Делается это с помощью преобразований Галилея. Они проиллюстрированы на Рис.14.
Наиболее просто их можно записать в векторной форме:
P = A+ a
, где вектор P указывает на положение предмета в покоящихся координатах,
вектор A дает положение начала отсчета движущихся координат в покоящихся координатах,
и вектор a указывает на положение предмета в движущихся координатах.
Запись через координаты аналогична. В нашем случае это будет:
Xp= X'1+X1
Yp=Y'1+Y1

Рис.14. Преобразования Галилея. Показаны разные варианты применения преобразований Галилея.

Или то же самое после подстановки значений ХY и X'Y' координат для n слайда:

Х'1n= 0+ (Шаг/4)*n, Y'1= R.
Х1n= -R*sin(αn), Y1= -R*cos(αn)

Xpn= (Шаг/4)*n -R*sin(αn)
Ypn= R -R*cos(αn)

Только не забывайте, изменятся не только координаты ног, но и координаты тела. В покоящейся системе координат они станут такими:

X'body1 = 0+(Шаг/4)*n

Y'body1 = 0 + R
X'body2 = 0+(Шаг/4)*n

Y'body2 =4 + R