Написать программу, которая с помощью переменных рисует ромб, прямоугольник и квадрат с нарисованными диагоналями

Семинар 3. Все вещи относительны. Переменные. Функции.

3.1.Введение. Motion Capture.

Ты наверняка уже знаешь о технологии под названием Motion Capture. Если ты все ещё не в курсе, то эта технология позволяет захватывать движение актеров в реальном мире и переносить их в 3D. Такая технология уже давно широко применяется в кино, но в последнее время она начала появляться и в компьютерных играх. Причем захватываться могут не только движения тела, но даже выражение лица!

 Не так давно революцию в мире компьютерной анимации произвела игра L.A. Noire от небезызвестной студии Rockstar Games. Разработчики L.A. Noire первыми использовали технологию захвата выражения лица. Давай посмотрим видео о том, что сами разработчики говорят о своем творении. http://www.youtube.com/watch?v=63HgvuWc_G0

Как видишь, анимация играет очень важную роль не только в голливудских фильмах, но и в компьютерных играх.

3.2.Теория относительности. Использование переменных в рисовании.

Итак, на прошлом занятии мы нарисовали отличный домик. Но там есть одна небольшая проблема. Представь, что нам вдруг понадобилось сдвинуть домик вправо. Как ты поступишь в этом случае? Пересчитаешь все координаты и исправишь их вручную в каждой команде? Хорошо, вперед. Сдвинь домик на 63 пикселя вправо и на 48 пикселя вниз. Ах да, не забудь засечь, сколько времени у тебя на это уйдет.

Если же тебя не устраивает этот способ, есть ещё один – более удобный. Теперь представь, что мы нарисовали наш домик относительно какой-то точки. А саму точку мы сохранили в переменные x и y. (Догадайся, какого типа должны быть эти переменные). Тогда для того, чтобы сдвинуть домик, нам нужно будет всего лишь изменить значения этих переменных!

Давай рассмотрим это все на примере. Мы попробуем нарисовать квадрат с помощью линий относительно точки O с координатами x, y. Точка О будет являться центром нашего квадрата. Так же предположим, что ширина и высота нашего квадрата равна 100 пикселям.

Как видишь, мы указали все четыре точки квадрата относительно точки О (то есть, относительно центра).

А сами команды теперь примут такой вид:

int x = 300; // Координата центра по Х
int y = 150; // Координата центра по Y

g.DrawLine(myPen, x + 50, y - 50, x + 50, y + 50); //Правая грань
g.DrawLine(myPen, x - 50, y - 50, x - 50, y + 50); //Левая грань
g.DrawLine(myPen, x + 50, y + 50, x - 50, y + 50); //Нижняя грань
g.DrawLine(myPen, x + 50, y - 50, x - 50, y - 50); //Верхняя грань

Обрати внимание, что мы прибавляем или вычитаем 50 из нашего центра. Как ты помнишь, мы договорились, что ширина и высота нашего квадрата равна 100. И чтобы получить, к примеру, левый нижний угол, мы должны по оси Х из центра вычесть половину ширины, то есть 50, и к Y прибавить половину высоты, тоже 50.


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

Попробуй набери эти команды и убедись, что у тебя все получилось.

Задание:

1) Мы неплохо облегчили себе жизнь, использовав переменные. Но мы можем сделать все ещё круче. Сейчас, если мы попробуем изменить ширину или высоту, нам все равно придется менять значения в командах.
Попробуй теперь самостоятельно изменить команды таким образом, чтобы ширина и высота квадрата тоже хранились в отдельных переменных.

2) До этого мы рисовали квадрат относительно центра. Теперь попробуй нарисовать прямоугольник относительно его левого верхнего угла (В переменных x и y хранится значение левого верхнего угла).

3) Перерисуй домик из предыдущего семинара так, чтобы он находился относительно центра.

 

3.3. Расширяем функционал.

Задание:
Нарисуй дерево с помощью переменных. Можно не такое, как на картинке.


Справился? Отлично. А теперь нарисуй рядом ещё одно. И ещё одно. А потом ещё несколько. Ну и ещё парочку.

Готово? Здорово. Сколько раз тебе пришлось повторить одни и те же команды? Много? Или не очень?

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

В первом семестре ты уже познакомился с понятием функции. Пришло время расширить твою базу знаний и применить функции на практике.

Но как же функции могут помочь нам решить проблему с большим числом повторяющихся команд?      

Для начала давай вспомним, что же такое функции.

 

3.4.Функции.

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

Помимо этого, функции ещё позволяют разбить программу на части. При этом каждая часть выполняет свою роль, а работа всей программы достигается путем взаимодействия разных частей программы, или функций.

Давай посмотрим, как мы можем создать функцию.

Для начала, разберемся, ГДЕ её создавать.

В случае Windows Forms, функция должна находится ВНУТРИ класса Form1.

На рисунке синей рамкой выделен класс, в рамках которого мы можем создавать функции.

Красной рамкой выделена сама функция.

Давай разберем синтаксис функции.

private void - это модификаторы функции. О них мы расскажем чуть позже.

MyAwesomeFunction() - это название нашей функции. К названиям функций относятся все те же правила, что и к названиям переменных.

Далее идут две фигурные скобки ({ }). Они обозначают начало и конец функции. Запомни, что все команды нужно давать именно МЕЖДУ этими двумя скобками. (Так же, как циклах и условных операторах).

 

3.5.Функции. Практический подход.

Итак, мы разобрались с синтаксисом, и давай наконец создадим функцию, которая будет что-то делать. Например, рисовать квадрат.

Начнем с объявления функции:

private void DrawSquare ()
{

}

Наша функция будет называться DrawSquare. Далее, добавим команды:

private void DrawSquare(Graphics graphics)
{
graphics.DrawLine(pen, 100, 100, 100, 200);
graphics.DrawLine(pen, 200, 100, 200, 200);

graphics.DrawLine(pen, 100, 100, 200, 100);
graphics.DrawLine(pen, 100, 200, 200, 200);
}

Но здесь возникает небольшая проблема. Дело в том, что переменные g и pen существует только внутри функции Form1_Paint. Мы можем исправить ситуацию, сделав их глобальными переменными. Или мы можем передавать её как параметр функции.

Параметры функции позволяют указать переменные, которые необходимы для работы функции, но недоступны внутри самой функции.

Для того, чтобы указать список параметров, нужно просто перечислить их через запятую при объявлении. В круглых скобках.

К примеру, чтобы передать параметр g в функцию DrawSquare нужно сначала указать тип этой переменной (Graphics) и имя переменной. Причем имя - это то, как переменная будет называться внутри функции. Оно может не совпадать с названием основной переменной.

Модифицированная версия функции будет выглядеть так:

 

private void DrawSquare(Graphics graphics)
{
graphics.DrawLine(pen, 100, 100, 100, 200);
graphics.DrawLine(pen, 200, 100, 200, 200);

graphics.DrawLine(pen, 100, 100, 200, 100);
graphics.DrawLine(pen, 100, 200, 200, 200);
}


Аналогично передай в функцию параметр pen. Не забудь, что параметры отделяются друг от друга запятой.

Итак, мы создали функцию, теперь надо научиться ей пользоваться.

 

3.6.Вызов функции.

Функция сама по себе никогда не запустится. Мы, как программисты, должны сказать программе сами когда нужно запустить ту или иную функцию.

Чтобы запустить функцию, нам всего лишь нужно написать её имя и указать в скобках параметры, если они есть.

Убедись, что ты не забыл перечислить все необходимые параметры, иначе программа не запустится!

 

На картинке видно, как ведут себя параметры функции. Значение переменной g сохраняется в graphics, а p сохраняется в одноименную переменную, но уже внутри функции.

Таким образом мы вызвали функцию и передали в неё параметры, необходимые для рисования. Запусти программу и убедись, что у тебя все получилось!


Домашнее задание:

Написать программу, которая с помощью переменных рисует ромб, прямоугольник и квадрат с нарисованными диагоналями.


Дата добавления: 2018-04-04; просмотров: 443; Мы поможем в написании вашей работы!




Мы поможем в написании ваших работ!