Главная страница
Навигация по странице:

  • Ход работы 1. Подготовка ресурсов

  • 4. Разместим Солнце на форме

  • 6. Добавим Землю на главную форму приложения

  • Earth.Move(gr, time * 0.09, x0, y0); e.Graphics.DrawImage(myBitmap, 0, 0); //Размещение рисунка}Расчет угловой скорости планеты

  • Данное приложение может съесть всю память.

  • Задания для самостоятельной работы

  • Лабораторная работа C#. Графика и анимация. ЛР Анимация. Немного математики


    Скачать 359 Kb.
    НазваниеНемного математики
    АнкорЛабораторная работа C#. Графика и анимация
    Дата07.05.2022
    Размер359 Kb.
    Формат файлаdoc
    Имя файлаЛР Анимация.doc
    ТипДокументы
    #516675


    стр. из
    Создание анимации на форме

    Смоделировать движение Земли вокруг Солнца, считая орбиту Земли круговой.
    Немного математики

    К руговую орбиту проще всего задать параметрическими уравнениям окружности:

    x=x0+R cos t

    y= y0+R sin t
    Здесь х0 и у0 - координаты центра орбиты,

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

    таймера (компонента timer)

    Принцип такой:

    1)Устанавливаем начальное значение time=0.

    2) Включаем таймер

    3) При каждом тике таймера инкрементируем переменную time,

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

    Скачать из Интернета изображения нужных нам космических объектов на прозрачном фоне в формате png:



    Солнце Земля Луна

    Размеры картинок роли не играют, так как их всегда можно изменить программно.

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

    Для этого выберите в Обозревателе решений узел Properties (Свойства) и дважды кликните Resources.resx. (См. рисунок ниже)



    В открывшейся вкладке выберите пункт меню Добавить ресурс  Добавить существующий файл. Я переименовала изображения как мне было удобно. Помните, Вам еще обращаться к этим ресурсам в коде.

    2. Подготовка компонентов и настройка общего вида формы

    Добавим на форму нужные компоненты:

    -На форму поместим PictureBox.

    Указываем для PictureBox в свойстве Dock значение Fill

    -Разместим там же таймер (timer).

    Самое важное свойство таймера Interval - количество миллисекунд между срабатываниями.
    Подпишемся на события:

    для формы - Load

    для таймера - Tick.

    для pictureBox- Paint и Resize
    3. Таймер

    Таймер - очень простая штука. У него есть две команды:

    timer1.Start(); - запускает таймер;

    timer2.Stop(); - останавливает таймер.

    И одно событие tick, которое обрабатывается функцией

    private void timer1_Time(object sender, EventArgs e)

    {...}
    Пример. Простейший и почти бесполезный случай:

    long time;
    private void Form1_Load(object sender, EventArgs e)

    {

    time = 0; //Начальное показание таймера

    timer1.Start();//Запуск таймера

    }
    private void timer1_Time(object sender, EventArgs e)

    time++;

    }
    4. Разместим Солнце на форме
    namespace Земля_и_Солнце

    {

    public partial class Form1 : Form

    {

    long time;

    float x0, y0; //Координаты центра формы и Солнца

    float dx ; // поправки на ширину и

    float dy ; // высоту изображения

    Bitmap myBitmap;//холст для рисования

    Graphics gr;

    Image img; // Здесь будет находится изображение
    В конструктрое форм подготовим:

    - холст muBitmap

    - изображение Солнца

    - вычислим координаты центра картинки и размеры изображения

    public Form1()

    {

    InitializeComponent();

    myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);

    img = Properties.Resources.sun;

    gr = Graphics.FromImage(myBitmap);
    x0 = pictureBox1.Width / 2;

    y0 = pictureBox1.Height / 2;

    dx = img.Width / 2;

    dy = img.Height / 2;

    }
    В обработчике события Form1_Load

    запустим таймер

    private void Form1_Load(object sender, EventArgs e)

    {

    time = 0; //Начальное показание таймера

    timer1.Start();

    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)

    {

    gr.Clear(pictureBox1.BackColor);
    Метод DrawImage помещает изображение img в указанные координаты и может задавать его размеры:

    gr.DrawImage(img, x0 - dx / 2, y0 - dy / 2, dx, dy);

    e.Graphics.DrawImage(myBitmap, 0, 0); //Размещение рисунка

    }
    private void pictureBox1_Resize(object sender, EventArgs e)

    {

    x0 = pictureBox1.Width / 2;

    y0 = pictureBox1.Height / 2;

    myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);

    pictureBox1.Invalidate();

    }
    5. Создадим класс Planet
    using System.Drawing; // добавим пространство имен
    namespace Земля_и_Солнце

    {

    class Planet

    {

    public static int R=10;//Радиус Земли

    public static int AE = 100; // Астрономическая единица
    Image img; //Картинка с Землей

    float distanse;// расстояние до Солнца, а.е

    float period; // Период обращения, земных лет

    float comp_size; // размер в сравнении с Землей

    float x,y; // текущие координаты планеты

    public Planet(Image im, float d, float p, float cs)

    {

    img = im;

    distanse = d*AE;

    period = p;

    comp_size = cs*2*R;

    x=-distanse;

    y=0;

    }

    Метод Move определяет координаты планеты x,y в момент времени t относительно центра x0, y0

    public void Move(Graphics gr,double t,float x0,float y0)

    {

    x = x0+distanse* (float)Math.Cos(t / period);

    y = y0+distanse* (float)Math.Sin(t / period);

    gr.DrawImage(img, x-comp_size/2, y-comp_size/2, comp_size,comp_size);

    }

    }

    }
    6. Добавим Землю на главную форму приложения

    private void Form1_Load(object sender, EventArgs e)

    {

    gr = Graphics.FromImage(myBitmap);

    /*здесь*/ Earth = new Planet(Properties.Resources.earth, 1, 1, 1);

    time = 0; //Начальное показание таймера

    timer1.Start();

    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)

    {

    //

    gr.Clear(pictureBox1.BackColor);

    gr.DrawImage(img, x0 - dx / 2, y0 - dy / 2, dx, dy);

    /*и здесь*/ Earth.Move(gr, time * 0.09, x0, y0);

    e.Graphics.DrawImage(myBitmap, 0, 0); //Размещение рисунка

    }
    Расчет угловой скорости планеты
    Чтобы учесть период обращения планеты вокруг Солнца, нам нужен эталон: перидо обращения Земли.

    Положим, земной год в нашей модели занимает 60 сек.

    lass Planet

    {

    public static int R=10;//Радиус Земли

    public static int AE = 100;

    public static float Year = 60;//Продолжительность года в модели (сек)
    Вычислим, как будет двигаться Земля на модели:

    Введем параметр t, преобразующий время по таймеру в угол в радианах:

    За год Земля пройдет 2 радиан.

    Один тик таймера длится timer1.Interval/1000 секунды,

    реальное количество времени =

    Переводим время в радианы:


    double t;

    private void pictureBox1_Paint(object sender, PaintEventArgs e)

    {

    gr.Clear(pictureBox1.BackColor);

    gr = Graphics.FromImage(myBitmap);

    gr.DrawImage(img, x0 - dx / 2, y0 - dy / 2, dx, dy);

    //Вот это преобразование

    t = time * 0.002 * 3.1415926 * timer1.Interval;

    //Передаем его объекту

    Earth.Move(gr, t, x0, y0);

    e.Graphics.DrawImage(myBitmap, 0, 0); //Размещение рисунка

    }
    В классе Planet в меоде Move

    Аргумент функций cos() и sin() делим на длину года:

    public void Move(Graphics gr,double t,float x0,float y0)

    {

    x = x0+distanse* (float)Math.Cos(t / (period*Year));

    y = y0+distanse* (float)Math.Sin(t / (period*Year));

    Данное приложение может съесть всю память.

    Чтобы этого не произошло, нужно время от времени очищать её:

    myBitmap.Dispose();

    myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);

    Задания для самостоятельной работы:

    Вариант 1

    Доработать описанный проект так, чтобы на нем отображались Луна и планеты Солнечной системы. Периоды обращения должны соотносится с реальными.

    Вариант 2. Создайте анимационный проект, на котором:

    1) Небо. Мигающие звезды. При нажатии клавиши Enter последняя мигнувшая звезда падает под углом ± 15…± 30°.

    2) Фонарь и летящие к нему по спирали мотыльки.

    3) Лодка, плывущая по волнам.

    4) Яблоко и ползущая по нему симпатичная гусеница.

    5) Ракета, старт, ее полет по баллисте, уменьшение размеров.



    написать администратору сайта