Как убрать моргание при реализации анимации? - C#

Узнай цену своей работы

Формулировка задачи:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
 
namespace Compound_Pendulum
{
    class Pendulum
    {
        public int x, y; // координаты шарика
        public int x0, y0; // координаты подвеса
        public int q; // угол отклонения маятника от равновесия
        public int a; // начальный угол отклонения маятника
        public double m; // масса маятника
        public double h; // расстояние от точки подвеса до центра тяжести маятника
        public double r; // радиус инерции относительно оси, проходящей через центр тяжести
        public double g; // ускорение свободного падения
        public double l; // приведённая длина физического маятника
        public Color BorderColor; // цвет контура
        public Color BallColor; // цвет шарика
        public PictureBox pictureBox; // поверхность рисования
        public int BallSize; // размер шарика
        public int MaxSize; // максимальный размер
        public double Radius;
 
        public Pendulum(int a, double m, double h, double g, Color BallColor, PictureBox pictureBox, int MaxSize)
        {
            this.a = a;
            this.m = m;
            this.h = h;
            this.g = g;
            this.BorderColor = Color.Black;
            this.BallColor = BallColor;
            this.pictureBox = pictureBox;
            this.MaxSize = MaxSize;
            BallSize = Convert.ToInt32(m);
            pictureBox.BackColor = Color.PeachPuff;
            Radius = h;
            x = (int)Math.Round(Radius * Math.Cos(Math.PI * a / 180) + MaxSize / 2) - BallSize / 2;
            y = (int)Math.Round(MaxSize / 2 - Radius * Math.Sin(Math.PI * a / 180)) - BallSize / 2;
            x0 = MaxSize / 2;
            y0 = MaxSize / 2;
            PendulumShow(pictureBox);
        }
 
        public void PendulumShow(PictureBox pictureBox)
        {
            Pen borderPen = new Pen(BorderColor, 2);
            SolidBrush limeSolidBrush = new SolidBrush(Color.Lime);
            SolidBrush redSolidBrush = new SolidBrush(Color.Red);
            Graphics graphics = pictureBox.CreateGraphics();
            graphics.DrawLine(borderPen, x0, y0, x + BallSize / 2, y + BallSize / 2);
            graphics.DrawEllipse(borderPen, x, y, BallSize, BallSize);
            graphics.FillEllipse(limeSolidBrush, x, y, BallSize, BallSize);
            graphics.DrawEllipse(borderPen, MaxSize / 2 - 10, MaxSize / 2 - 10, MaxSize / 25, MaxSize / 25);
            graphics.FillEllipse(redSolidBrush, MaxSize / 2 - 10, MaxSize / 2 - 10, MaxSize / 25, MaxSize / 25);
        }
 
        public void PendulumHide(PictureBox pictureBox)
        {
            Pen borderPen = new Pen(pictureBox.BackColor, 2);
            SolidBrush redSolidBrush = new SolidBrush(pictureBox.BackColor);
            Graphics graphics = pictureBox.CreateGraphics();
            graphics.DrawLine(borderPen, x0, y0, x + BallSize / 2, y + BallSize / 2);
            graphics.DrawEllipse(borderPen, x, y, BallSize, BallSize);
            graphics.FillEllipse(redSolidBrush, x, y, BallSize, BallSize);
        }
 
        public void PendulumMove()
        {
            PendulumHide(pictureBox);
            x = (int)Math.Round(Radius * Math.Cos(Math.PI * a / 180) + MaxSize / 2) - BallSize / 2;
            y = (int)Math.Round(MaxSize / 2 - Radius * Math.Sin(Math.PI * a / 180)) - BallSize / 2;
            PendulumShow(pictureBox);
        }
    }
}
Движение реализовано через таймер. Но у меня при перерисовке сильно моргают перерисовываемые объекты. В таймере стоит интервал 1 мс. Я так понимаю что изображение не успевает быстро перерисовываться, из-за этого видно моргание. Компьютер с дискретной видеокартой.

Решение задачи: «Как убрать моргание при реализации анимации?»

textual
Листинг программы
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace Compound_Pendulum {
    public partial class Form1 : Form {
 
        private Timer _timer;
        private Pendulum _pendulum;
        private PictureBox _pictureBox;
 
        public Form1() {
            this.SuspendLayout();
            _pictureBox = new PictureBox();
            _pictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
            _pictureBox.BackColor = Color.BlanchedAlmond;
 
            _timer = new Timer();
            _timer.Interval = 50;
            _timer.Enabled = true;
 
            Controls.Add(this._pictureBox);
            this.ResumeLayout(false);
 
            _pendulum = new Pendulum(45, 1, 50, 9.81, Color.Green, 200);
 
            _pictureBox.Paint += new PaintEventHandler(_pictureBox_Paint);
            _timer.Tick += new System.EventHandler(this.timer1_Tick);
        }
 
        private void _pictureBox_Paint(object sender, PaintEventArgs e) {
            _pendulum.Draw(e.Graphics);
        }
 
        private void timer1_Tick(object sender, EventArgs e) {
            _pendulum.Move();
            _pictureBox.Invalidate();
        }
 
 
 
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы