ВУЗ: Московский государственный университет технологий и управления им. К.Г. Разумовского
Категория: Методичка
Дисциплина: Программирование
Добавлен: 16.02.2019
Просмотров: 1557
Скачиваний: 9
колледж при МГУТУ, 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
колледж при МГУТУ, 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
колледж при МГУТУ, 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
колледж при МГУТУ, 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
колледж при МГУТУ, 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