Показать сообщение отдельно

  #705  
Старый 30.10.2008, 20:19
groupby
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме:
127017

Репутация: 61
По умолчанию

Цитата:
Сообщение от 043nKRuT0y  
Кто знает как решить :
Круг радиусом R движется из центра екрана по СПИРАЛИ к границам екрана !
Реализовать нужно на С# с элементами графики !
Кто может - помогите ! С меня + !
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CircleMoving
{
    public partial class Form1 : Form
    {
        const int m_Radius = 100;
        const int m_Addition = 4;
        const int m_SmallCircleRadius = m_Radius / 2;

        int m_StartPositionX;
        int m_StartPositionY;
        int m_SpiralX;
        int m_SpiralY;        

        bool m_Sign = true;

        List<Point> m_LastPoints;

        public Form1()
        {            
            InitializeComponent();

            m_StartPositionX = this.Width / 2 - m_Radius / 2;
            m_StartPositionY = this.Height / 2 - m_Radius / 2;
            m_SpiralX = 0;
            m_SpiralY = 0;
            m_LastPoints = new List<Point>();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            m_StartPositionX++;
            m_StartPositionY++;

            if (m_Sign)
                m_SpiralX += m_Addition;
            else
                m_SpiralX -= m_Addition;            

            m_SpiralY = (int)Math.Sqrt(
                Math.Pow(m_SmallCircleRadius, 2) - Math.Pow(m_SpiralX, 2)
                );

            this.Invalidate();

            if (m_SpiralX + m_Addition >= m_SmallCircleRadius)            
                m_Sign = false;            

            if (m_SpiralX - m_Addition <= 0)
                m_Sign = true;            
        }        

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Point m_LastPoint = Point.Empty;            
            foreach (Point m_Point in m_LastPoints)
            {
                if(m_LastPoint == Point.Empty)                
                    g.DrawEllipse(new Pen(Color.DarkSlateBlue), m_Point.X, m_Point.Y, 1, 1);
                else
                    g.DrawLine(new Pen(Color.DarkSlateBlue), m_LastPoint, m_Point);
                m_LastPoint = m_Point;
            }
            g.DrawEllipse(
                new Pen(Color.DarkRed),
                new Rectangle(
                m_StartPositionX + m_SpiralX - m_SmallCircleRadius,
                m_StartPositionY + m_SpiralY - m_SmallCircleRadius,
                m_Radius,
                m_Radius
                )
            );
            m_LastPoints.Add(new Point(
                m_StartPositionX + m_SpiralX - m_SmallCircleRadius + m_Radius / 2,
                m_StartPositionY + m_SpiralY - m_SmallCircleRadius + m_Radius / 2
                ));
            if ((m_LastPoints[m_LastPoints.Count - 1].X + m_Radius / 2 == this.Width)
                ||
                (m_LastPoints[m_LastPoints.Count - 1].Y + m_Radius / 2 == this.Height))
            {
                timer1.Stop();
                timer1.Enabled = false;
                timer1.Dispose();
                MessageBox.Show("Перемещение круга завершено");
            }
        }
    }
}
 
Ответить с цитированием