Файл: ПП. Практические работы.pdf

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

колледж при МГУТУ, 2015

П-203

Прикладное программирование/ПР

столкновения с границами стола, а также с движущимся параллелепипедом (указывается левый верх-
ний и правый нижний угол параллелепипеда, его скорость). Параллелепипед движется слева направо,
а, после достижения границы стола, справа налево и так далее.

ПП2.1-1-8 Пользователь выбирает начальную скорость мяча, направление движения мяча (на бильярдном сто-

ле), а программа показывает замедленный «мультфильм» того, как мяч летит с учетом упрогого
столкновения с границами стола, а также с движущимся параллелепипедом (указывается левый верх-
ний и правый нижний угол параллелепипеда, его скорость). Параллелепипед движется сверху вниз,
а, после достижения границы стола, снизу вверх и так далее.

ПП2.1-1-9 Пользователь выбирает координаты расположения и направление испускания источника света и коор-

динаты концов отрезков, соответствующего идеальному зеркалу. Предполагается, что границы рисун-
ка – это также идеально отражающие зеркала. Покажите, как будет идти луч света (в чрезвычайно
замедленной «съемке») от источника (след луча света на рисунке остается).

ПП2.1-1-10 Пользователь выбирает начальную скорость шайбы и скорость ее вращения, а программа показы-

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

ПП2.1-1-11 Пользователь выбирает радиусы двух дисков и ширину зубцов и расстояние между ними (общую для

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

ПП2.1-1-12 Пользователь выбирает радиусы двух дисков и расположение зубца на каждом из них. Зубцы соеди-

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

ПП2.1-1-13 Моделирование движения двух планет. Нарисуйте следующее движение. Два шара имеют на-

чальную скорость (вектора, задаются пользователем), при этом на них дейтсвуют силы в направлении
другого шара, имеющая величину

k

r

2

, где k вводится пользователем и зависит от шара, а r – рассто-

яние от шара до другого шара. Движение прекращается в случае, если шары соприкасаются.

Движение рассчитывается на каждом кванте времени исходя из того, что оно в течении кванта рав-
ноускоренное и прямолинейное.

ПП2.1-1-14 Моделирование движения спутника. Нарисуйте следующее движение. Один шар неподвижен,

другой шар имеет начальную скорость (вектор, задается пользователем), при этом на него дейтсвует
сила в направлении первого шара, имеющая величину

k

r

2

, где k вводится пользователем, а r – рассто-

яние от шара до неподвижного шара. Движение прекращается в случае, если шары соприкасаются.

При этом, если пользователь нажимает клавишу пробел, то спутнику сообщается дополнительное
ускорение в направлении его движения (величина ускорения вводится пользователем предваритель-
но).

Движение рассчитывается на каждом кванте времени исходя из того, что оно в течении кванта рав-
ноускоренное и прямолинейное.

ПП2.1-1-15 Моделирование движения двух спутников. Нарисуйте следующее движение. Два шара имеют

начальную скорость и координаты (скорость – это вектор, задаются пользователем), при этом на них
дейтсвуют силы в направлении третьего шара, имеющие величину

k

r

2

, где k вводится пользователем

и зависит от шара, а r – расстояние от шара до другого шара. Движение прекращается в случае, если
какие-либо шары соприкасаются.

Движение рассчитывается на каждом кванте времени исходя из того, что оно в течении кванта рав-
ноускоренное и прямолинейное.

ПП2.1-1-16 Нарисуйте следующее движение. Нарисованы две поверхности, которые соприкасаются внизу рисун-

ка, расположенные к горизонту под углом α и β соответственно (углы вводятся). Шар изначально
расположен вверху и двигается под силой тяжести и силой сопротивления воздуха (масса также вво-
дится). Сила сопротивления воздуха учитывается следующим образом: на каждом кванте времени
скорость умножается на коэффициент k (вводимый пользователем). На шаре надо нарисовать пару
перпендикулярных линий для отображения вращения.

ПП2.1-1-17 Пользователь выбирает начальную скорость двух мячей, направление движения мячей (на бильярд-

ном столе), а программа показывает замедленный «мультфильм» того, как мячи летят с учетом
упругого отскока от границ бильярдного стола и при столкновении друг с другом. Кроме того ука-
зывается выпуклый четырехугольник координатами вершин, от которого шарики тоже отскакивают.
Лунки учитывать не требуется.

11


background image

колледж при МГУТУ, 2015

П-203

Прикладное программирование/ПР

Рис. 1: Мировая и экранная системы координат (двумерный случай)

x

y

(x

1

, y

1

)

(x

2

, y

2

)

(x

s1

, y

s1

)

(x

s2

, y

s2

)

Экран

Мир

(0; 0)

2 уровень

Теоретическое введение

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

На экране (или части экрана) отображается часть «мира». Миром может быть игровой мир в играх,
физическая модель в задачах моделирования, плоскость или трехмерное пространство в математических
задачах. В любом случае в «мире» вводится своя система координат (мировая), а экрану (части экрана)
присуща экранная система координат.

Два основных действия в таком подходе – это нахождение соответствующих координат на экране для
точек мира и нахождение точек мира, соответствующих точке экрана (в некоторых случаях таких точек
в мире много).

Мы рассмотрим простейший случай: когда в мире введена двумерная декартова система координат. И
приведем формулы перевода из мировых в экранную систему координат и наоборот. Ниже для заданий
второго уровня будут также указаны формулы перевода из мировых в экранную систему координат в
трехмерном случае.

Итак, пусть мы хотим отобразить на экран (часть экрана) прямоугольный фрагмент мира со сторонами,
параллельными осям координат с противоположными вершинами (x

1

, y

1

) и (x

2

, y

2

) (см. рис. 1). Часть

экрана, на которую мы отображаем фрагмент мира – аналогичный прямоугольник с вершинами (x

s1

, y

s1

)

и (x

s2

, y

s2

). Обозначим (x, y) – координаты точки в мире, а x

s

, y

s

– координаты соответствующей точки на

экране. Тогда

x

s

=

h

(x − x

1

)

x

s2

−x

s1

x

2

−x

1

+ x

s1

i

y

s

=

h

(y − y

1

)

y

s2

−y

s1

y

2

−y

1

+ y

s1

i

x

=

(x

s

− x

s1

)

x

2

−x

1

x

s2

−x

s1

+ x

1

y

=

(y − y

s1

)

y

2

−y

1

y

s2

−y

s1

+ y

1

(1)

Здесь [...] – это округление до целого.

На практике часто приходится производить преобразования объектов находящихся в «мире», например
перемещать и вращать фигуры. Реализуются такие действия над отдельными точками, которые впослед-
ствии используются для рисования тех или иных примитивов (треугольников, отрезков, тетраэдров).

12


background image

колледж при МГУТУ, 2015

П-203

Прикладное программирование/ПР

Перемещение точки осуществляется с использованием простейшего преобразования:

x

x + dx

y

y + dy

Здесь (dx, dy) – вектор, на который смещаются все точки фигуры.

Вращение фигуры вокруг точки (0; 0) осуществляется путем умножения координат точек на матрицу
поворота на угол ϕ против часовой стрелки:

x
y

cos ϕ

− sin ϕ

sin ϕ

cos ϕ

 

x
y

Вращение фигуры вокруг произвольной точки (x

0

; y

0

) производится тремя преобразованиями подряд:

сдвиг на (−x

0

; −y

0

), вращение и сдвиг на (x

0

; y

0

).

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

обычных координат точки

x
y

рассматривают её однородные координаты

x
y

1

, то есть добавляют

фиктивную третью координату, которая всегда равна 1. В этом случае поворот на угол ϕ осуществляется
умножением на матрицу

cos ϕ

− sin ϕ

0

sin ϕ

cos ϕ

0

0

0

1

,

а сдвиг на вектор (dx, dy) – на матрицу

1

0

dx

0

1

dy

0

0

1

,

Любой комбинации поворотов и сдвигов (то есть любому движению) соответствует умножение на матрицу
– произведение соответствующих матриц поворотов и сдвигов, записанных в обратном порядке.

При использовании однородных координат преобразование мировых координат точки в экранные также
можно осуществлять путем умножения на матрицу (с последующим округлением):

x

s2

−x

s1

x

2

−x

1

0

x

s1

− x

1

x

s2

−x

s1

x

2

−x

1

0

y

s2

−y

s1

y

2

−y

1

y

s1

− y

1

y

s2

−y

s1

y

2

−y

1

Теоретическое введение для заданий 3 уровня

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

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



x
y

z
1



.

Любое движение фигуры в трехмерном случае можно представить в виде комбинации вращений вокруг
каждой из осей (x, y и z) и сдвигов.

Матрица поворота на угол φ вокруг оси x:



1

0

0

0

0

cos φ

− sin φ

0

0

sin φ

cos φ

0

0

0

0

1



Матрица поворота на угол ψ вокруг оси y:



cos ψ

0

− sin psi

0

0

1

0

0

sin ψ

0

cos ψ

0

0

0

0

1



13


background image

колледж при МГУТУ, 2015

П-203

Прикладное программирование/ПР

Матрица поворота на угол θ вокруг оси z:



cos θ

− sin θ

0

0

sin θ

cos θ

0

0

0

0

1

0

0

0

0

1



Матрица сдвига на вектор (a; b; c):



1

0

0

a

0

1

0

b

0

0

1

c

0

0

0

1



При получении координат точки экрана, соответствующей точке в «мире» мы должны каким-то обра-
зом избавиться от третьей координаты. Существует два основных способа это сделать: параллельная и
центральная проекция. Первая из них используется в инженерной практике, вторая – в большинстве игр.

Матрица отображения на экран (для параллельной проекции):

 

x

s2

−x

s1

x

2

−x

1

0

0

x

s1

x

1

(x

s2

−x

s1

)

x

2

−x

1

0

y

s2

−y

s1

y

2

−y

1

0

y

s1

y

1

(y

s2

−y

s1

)

y

2

−y

1

!

Отображение на экран для центральной проекции строится следующим образом. Имеется точка (x

f

; y

f

; z

f

)

– фокус (в ней находится «глаз»); имеется плоскость экрана (z = z

s

). Чтобы найти координаты централь-

ной проекции на плоскости экрана (x

s

; y

s

) используются следующие формулы:

(

x

u

=

z

s

−z

f

z−z

f

(x − x

f

) + x

f

y

u

=

z

s

−z

f

z−z

f

(y − y

f

) + y

f

Для того, чтобы перейти далее перейти к экранным координатам от координат (x

u

; y

u

) используются

формулы (1) для двумерного случая. В случае использования центральной проекции рекомендую брать
экранную плоскость z

s

= −10, а фокус (x

f

; y

f

; z

f

) = (0; 0; −20).

Собственно задания

ПП2.1-2-1 Написать программу, которая будет выводить на экран проекцию куба на плоскость. При этом должна

быть возможность управлять вращением этой фигуры вокруг оси x; оси y; оси z (по отдельности); а
также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-2 Написать программу, которая будет выводить на экран проекцию правильного тетраэдра на плос-

кость. При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y;
оси z (по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-3 Написать программу, которая будет выводить на экран проекцию правильного октаэдра на плоскость.

При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y; оси z
(по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-4 Написать программу, которая будет выводить на экран проекцию правильной прямоугольной пира-

миды на плоскость. При этом должна быть возможность управлять вращением этой фигуры вокруг
оси x; оси y; оси z (по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-5 Написать программу, которая будет выводить на экран центральную проекцию куба на плоскость.

При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y; оси z
(по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-6 Написать программу, которая будет выводить на экран центральную проекцию тетраэдра на плос-

кость. При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y;
оси z (по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-7 Написать программу, которая будет выводить на экран центральную проекцию прямоугольной пира-

миды на плоскость. При этом должна быть возможность управлять вращением этой фигуры вокруг
оси x; оси y; оси z (по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-8 Написать программу, которая будет выводить на экран центральную проекцию октаэдра на плоскость.

При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y; оси z
(по отдельности); а также сдвигать ее в разные стороны по всем трем осям

14


background image

колледж при МГУТУ, 2015

П-203

Прикладное программирование/ПР

ПП2.1-2-9 Написать программу, которая будет выводить на экран центральную проекцию икосаэдра на плос-

кость. При этом должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y;
оси z (по отдельности); а также сдвигать ее в разные стороны по всем трем осям

ПП2.1-2-10 Написать программу, которая будет выводить на экран проекцию икосаэдра на плоскость. При этом

должна быть возможность управлять вращением этой фигуры вокруг оси x; оси y; оси z (по отдель-
ности); а также сдвигать ее в разные стороны по всем трем осям

2 задание

Второе задание представлено в работе только нулевым уровнем.

ПП2.2-0-1 В каждой строке текстового файла указано четыре числа – координаты начала и конца отрезка.

Выведите на экран эти отрезки (в TChart).

ПП2.2-0-2 В каждой строке текстового файла указано два числа – координаты точки. Выведите на экран отрез-

ки, соединяющие данные соседние точки (в TChart).

ПП2.2-0-3 В каждой строке текстового файла указано два числа – кординаты точки в полярных координатах.

Выведите на экран отрезки, соединяющие данные соседние точки (в TChart).

ПП2.2-0-4 В каждой строке текствого файла указано четыре числа – координаты начала и конца отрезка в

полярных координатах. Выведите на экран эти отрезки (в TChart).

ПП2.2-0-5 В каждой строке текстового файла указаны две координаты точки и номера точек (нумерация с

единицы, указывается номер строки в файле), с которыми нужно соединить данную точку. Выведите
это точки и соединяющие их отрезки в TChart.

ПП2.2-0-6 В каждой строке текстового файла указаны две координаты точки в полярных координатах и номера

точек (нумерация с единицы, указывается номер строки в файле), с которыми нужно соединить
данную точку. Выведите это точки и соединяющие их отрезки в TChart.

ПП2.2-0-7 В каждой строке текстового файла расположены координаты двух точек. Необходимо нарисовать

стрелку от первой точки ко второй для каждой такой пары точек в TChart.

ПП2.2-0-8 В первой строке указаны координаты трех точек – вершин треугольника, а в каждой следующей

строке – два числа, показывающие на сколько надо сместить этот треугольник по оси абсцисс и
ординат соответственно. Выведите все эти треугольники в TChart.

ПП2.2-0-9 В первой строке указаны координаты трех точек – вершин четырехугольника, а в каждой следующей

строке – два числа, показывающие на сколько надо сместить этот четырехугольник по оси абсцисс и
ординат соответственно. Выведите все эти треугольники в TChart.

ПП2.2-0-10 В первой строке указаны координаты трех точек – вершин треугольника, а в каждой следующей стро-

ке – по одному числу, показывающему на сколько градусов надо повернуть этот треугольник вокруг
начала координат. Выведите все эти треугольники в TChart (исходный и повернутые на указанные
углы).

ПП2.2-0-11 В первой строке указаны координаты начала и конца первого вектора, а в каждой следующей строке

указаны координаты вектора, который прибавляется к предыдущему вектору (то есть результату
суммирования). Отобразите все эти векторы в TChart.

ПП2.2-0-12 Выведите в TChart точки, каждая из которых представлена двумя числами в текстовом файле. При

Этом каждую пару точек соедините отрезком.

ПП2.2-0-13 В каждой строке файла указаны по два вещественных числа. Первое число – это абсциссы точек,

а второе число – это приращение ординаты точек (для первой точки – сама ордината). Выведите в
TChart эти точки, последовательно соединенные отрезками. В файле абсциссы точек расположены в
порядке возрастания.

ПП2.2-0-14 В каждой строке файла указаны по два вещественных числа. Первое число – это абсциссы точек,

а второе число – это приращение ординаты точек (для первой точки – сама ордината). Выведите в
TChart стобцовую диаграмму (TBarSeries) по данным координатам абсцисс и ординат (ординаты –
это высоты столбцов). В файле абсциссы точек расположены в порядке возрастания.

ПП2.2-0-15 В первой строке указаны координаты начала и конца первого вектора, а в каждой следующей строке

указаны координаты вектора, который пририсовывается к предыдущему вектору. Отобразите все эти
векторы в TChart.

ПП2.2-0-16 В первой строке указаны абсциссы всех точек, а в каждой следующей строке ординаты точек, которые

нужно соединить (второй-последней строкам соответствует по одной линии). Вывод сделать в TChart.

15