Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#] шарик на нитке, только подставить форуму.... 
:(
    Опции темы
m412
  Дата 4.4.2007, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 14.12.2006
Где: [tmn]

Репутация: нет
Всего: нет



Здравствуйте!
тут такая проблема... 
на C#2005 нужно сделать курсовую....

а задание такое:
На нити болтается шарик... нужно чтобы после нажатия кнопки он болтался и постепенно затухал....

этот вопрос я уже задавал ТУТ

много получил полезного... но вот затухнуть он всетаки не смог...
там даже приводили формулу затухания... но я чесно говоря понятия не имею как ее правильно использовать...!

вот имеющийся код
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace шарик_на_ните
{
    public partial class Form1 : Form
    {
     
        private Point _centerOfBall;
    
        public Form1()
        {
            InitializeComponent();
            
            calculateBallCenter();
            timer1.Tick += new EventHandler(timer1_Tick);
           
        }
        void timer1_Tick(object sender, EventArgs e)
        {
            calculateBallCenter();
            this.Invalidate();
        }
        void calculateBallCenter()
        {
            double k = 0.05F;
            int x = (int)(200 + 100 * Math.Sin(k * DateTime.Now.Ticks / 1000000));
            int y = (int)(10 + 100 * Math.Abs(Math.Cos(k * DateTime.Now.Ticks / 1000000)));
            _centerOfBall = new Point(x, y);
           
        }
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            
            Graphics g = e.Graphics;
            Graphics gr = e.Graphics;

            Rectangle noname = new Rectangle(0,0,410,250);
            gr.FillRectangle(Brushes.AliceBlue, noname);

            Rectangle noname1 = new Rectangle(0,260,410,160);
            gr.FillRectangle(Brushes.YellowGreen,noname1);

            Rectangle noname2 = new Rectangle(190, 0, 20, 10);
            gr.FillRectangle(Brushes.Black, noname2);

           
             Point beginOfLine = new Point(200, 10);
            g.DrawLine(Pens.Black, beginOfLine, _centerOfBall);
          
            Rectangle ballRectangle = new Rectangle(_centerOfBall - new Size(10, 10), new Size(20, 20));
            g.FillEllipse(Brushes.Black, ballRectangle);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();

        } 
    }
}


Заранее спасибо
PM MAIL WWW   Вверх
ivashkanet
Дата 12.4.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 9
Всего: 149



m412, лови свой код, разбирайся:
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace BallOnTheThread
{
    public partial class BallOnTheThreadScreen : UserControl
    {
        public BallOnTheThreadScreen()
        {
            recalculateParameters();
            InitializeComponent();
            _timer = new Timer();
            _timer.Interval = 100; // Каждые 0,1 секунды будет срабатывать таймер
            _timer.Tick += new EventHandler(_timer_Tick);
        }
        #region Interface
        [DefaultValue(100)]
        public int ThreadLength
        {
            get { return _threadLength; }
            set
            { _threadLength = value; recalculateParameters(); }
        }
        [DefaultValue(100)]
        public int BallMass
        {
            get { return _ballMass; }
            set
            { _ballMass = value; recalculateParameters(); }
        }
        [DefaultValue(60)]
        public int StartAngle
        {
            get { return _startAngle; }
            set { _startAngle = value; recalculateParameters(); }
        }
        public void StartBall()
        {
            _startTime = DateTime.Now;
            _isBallMoving = true;
            _timer.Start();
        }
        public void StopBall()
        {
            _isBallMoving = false;
            _timer.Stop();
        }
        #endregion

        #region PrivateMembers
        private DateTime _startTime;
        private int _threadLength = 100; // длинна в "пикселях"
        private int _ballMass = 100;    // масса шарика в граммах
        private int _startAngle = 60;   // угол в градусах

        private double _alpha0 = Math.PI / 2;  // угол в радианах
        private double _m = 0.1;               // масса шарика в килограммах
        private double _g = 9.81F;
        private double _betta = 100;
        private double _gamma;
        private double _omega;

        private Timer _timer;
        private bool _isBallMoving = false;
        #endregion

        #region BackgroundLogic
        void _timer_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }
        private void recalculateParameters()
        {
            _alpha0 = _startAngle * Math.PI / 180;
            _m = _ballMass * 0.001;
            _gamma = 0.5 * _betta / (_ballMass * _threadLength);
            _omega = Math.Sqrt(_g / _threadLength);
        }
        private double getBallAngle()
        {
            if (_isBallMoving)
            {
                double dt = ((TimeSpan)(DateTime.Now - _startTime)).TotalSeconds;

                // коэффициент затухания
                double fadingParametr = Math.Exp(-_gamma * dt);   

                if (Math.Abs(fadingParametr * _alpha0) < 0.001)
                {
                    // Останавливаем шарик, так как он уже не движется
                    StopBall();
                }

                return _alpha0 * fadingParametr * Math.Cos(_omega * dt);
            }
            else { return _alpha0; }
        }
        private void BallOnTheThreadScreen_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            // Запоминаем размеры картинки
            int width = this.Width;
            int height = this.Height;

            // Берем кисти и краски :) (ручки),
            // которые понадобятся нам для рисования
            Pen pen = Pens.Black;
            Brush brush = Brushes.Black;

            // Рисуем место крепления шарика
            g.FillRectangle(brush, new Rectangle((int)(0.5 * width - 5), 0, 10, 5));

            // Получаем текущий угол нити
            double currentAngle = getBallAngle();

            // Считаем координаты шарика
            int x = (int)(0.5 * width + _threadLength * Math.Sin(currentAngle));
            int y = (int)(_threadLength * Math.Cos(currentAngle));

            // Рисуем нитку и сам шарик
            g.DrawLine(pen, (int)(0.5 * width), 0, x, y);
            g.FillEllipse(brush, new Rectangle(x - 5, y - 5, 10, 10));
        }
        #endregion
    }
}


Ниже находится готовый проект:

Это сообщение отредактировал(а) ivashkanet - 12.4.2007, 11:26

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  BallOnTheThread.zip 20,02 Kb
PM MAIL WWW ICQ   Вверх
m412
Дата 12.4.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 14.12.2006
Где: [tmn]

Репутация: нет
Всего: нет



ААААААААААААААААААА

ТЫ ГЕНИЙ!!!!

у меня просто нет слово чтобы выразить свои эмоции!!!!
ОГРОМНОЕ ТЕБЕ СПАСИБО!!!! smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.