Читайте также: |
|
void Rotate_0bject(object__ptr object, float angle)
{
int index;
float x_new, y_new,cs, sn;
// сначала вычислим синус и косинус угла
сs = cos(angle);
sn = sin(angle);
// поворачиваем каждую вершину на угол angle
for (index=0; index<object->num_vertices; index++)
{
x_new = object->vertices [index].x*cs-object->vertices[index].y*sn;
y_new = object->vertices [index].y*cs+object->vertices[index].x*sn;
// изменяем исходные координаты.на расчетные
object->vertices[index].x = x_new;
object->vertices[index].y = у_new;
} // конец цикла for
} // конец функции
Думаю, что надо кое-что объяснить. Я вычисляю заранее значения синуса и косинуса для данного угла. Зачем, спросите вы. Ответ прост — для скорости. Ибо заниматься вычислениями тригонометрических функций в процессе работы программы можно позволить себе только, имея математический сопроцессор.
Теперь настало время написать что-нибудь посерьезней. Мне кажется, что надо бы написать что-то более экстравагантное, чем одинокий астероид. Пусть это будут хотя бы несколько астероидов. Давайте сначала спланируем наши дальнейшие действия.
Я хотел бы иметь поле астероидов различных размеров в количестве более 100 штук. И так, чтобы они могли вращаться. Для этого программа должна иметь следующую структуру:
Шаг 1. - Инициировать поле астероидов;
Шаг 2. - Стереть поле астероидов;
Шаг 3. - Трансформировать поле астероидов;
Шаг 4. - Нарисовать поле астероидов;
Шаг 5. - Перейти к Шагу 2, пока пользователь не нажмет на кнопку.
Чтобы сделать это проще, я добавил три новых поля к нашей структуре: одно для угла поворота и два - для скорости (целиком программа представлена в Листинге 4.8).
Дата добавления: 2015-07-12; просмотров: 74 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Листинг 4.6. Масштабирование астероида. | | | Листинг 4.8. Программа, которая рисует поле астероидов (FIELD.С). |