С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
3 / 3 / 1
Регистрация: 02.04.2012
Сообщений: 107
1

Нарисовать три графика согласно формулам

26.11.2012, 19:27. Показов 1510. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
здравствуйте! помогите пожалуйста, мне нужно по формулам в картинке составить 3 графика в C#:
1)v(t) (по 1 и 2 формулам в картинке)
2) x(t) (по 3 формуле в картинке)
3) два предыдущих графика вместе, ну на одной оси координат.
у меня выходит только второй график, и то в реальном времени рисует, а надо чтобы не рисовал а сразу графики выходили...вообщем в исходнике посмотрите пожалуйста?...
Миниатюры
Нарисовать три графика согласно формулам  
Вложения
Тип файла: rar pendulum.rar (54.6 Кб, 16 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2012, 19:27
Ответы с готовыми решениями:

Нарисовать треугольник согласно схеме
Нарисовать треугольник согласно схеме (см. рисунок 5.) Координаты x, y вводятся пользователем.

Обработать выделенный массив с изменением данных согласно формулам из примера
Здравствуйте форумчане! Помогите, пожалуйста, с вопросами... У меня есть исходный массив,...

Реализовать формулу согласно графика
Нужно разобраться в реализации формулы, как составить не знаю. Реализовать в консольном...

Разделить символьный массив (строку в стиле Си) на три отдельных массива согласно условию
Добрый день! Есть Char. Из него нужно присвоить трем другим Char по следующему признаку: Char 1...

1
3 / 3 / 1
Регистрация: 02.04.2012
Сообщений: 107
26.11.2012, 19:28  [ТС] 2
Лучший ответ Сообщение было отмечено MaDiNa как решение

Решение

Вот код в С#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Drawing.Drawing2D;
 
namespace SpringPendulum
{
    public partial class Form1 : Form
    {
        double tCurrent, xCurrent, vCurrent, xOld, tOld;  // tCurrent - Прошедшее время от пуска, xCurrent - текущая координата, vCurrent - текущая скорость, xOld - предыдущая координата, tOld - предыдущее значение времени
        double tHalf, k, massa, dt, tk, A; // tHalf - время на полушаге, k - коэффициент жесткости, massa - масса груза, dt - шаг по времени, tk - конечное время, A - амплитуда колебаний
        double tM, xM;     // tM - Масштабный коэффициент для оси времени, xM - масштабный коэффициент для оси координат                 
        Graphics g;        // объект Graphics для рисования
        GraphicsPath gPath;  // объект GraphicsPath, который хранит координаты точек графика и выводит кривую
        
 
        public Form1()
        {
            InitializeComponent();
            g = pictureBox1.CreateGraphics();  // Инициализируем g областью pictureBox1
            
        }
 
        private void Start_Click(object sender, EventArgs e)   // процедура нажатия на Кнопку Пуск
        {
            if (!InitVariables()) return ;   // Если инициализация переменных провалилась - выход из процедуры
            
            DrawValues();               // Отрисовка значений по осям координат
            timer1.Start();             // Запуск таймера
            Start.Enabled = false;      // установка кнопки Пуск в неактивное состояние
            Pause.Enabled = true;       // установка кнопки Пауза в активное состояние
        }
 
        private void timer1_Tick(object sender, EventArgs e)   // процедура обработки таймера
        {
            if (tCurrent >= tk)           // если прошедшее время больше или равно времени конечному, то
            {
                timer1.Stop();           // останавливаем таймер
                Pause.Enabled = false;   // Кнопку Пауза делаем неактивной
 
                return;                 // завершаем процедуру timer1_Tick
            }                           // Иначе идем дальше
 
            tOld = tCurrent;            // в значение времени на предыдущем шаге засовываем текущее время
            tCurrent += dt;             // текущее время увеличиваем на величину шага
            tHalf = tCurrent - dt / 2;  // время на полушаге высчитываем как текущее время минус половинный шаг
            if (tCurrent == dt) vCurrent -= k / massa * xCurrent * dt / 2; // если это первый шаг, то высчитываем текущую скорость по этой формуле
            else vCurrent -= k / massa * xCurrent * dt;  // для всех остальных шагов по этой
            xOld = xCurrent;           // в значение координаты на предыдущем шаге засовываем текущую координату
            xCurrent += vCurrent * dt;  // текущую координату увеличиваем на приращение расстояния
            tLabel.Text = String.Format("{0:f2}", tCurrent);          // выводим текущее время
            xLabel.Text = String.Format("{0:f2}", xCurrent);          //         текущую координату
            vLabel.Text = String.Format("{0:f2}", vCurrent);          //       и текущую скорость
            gPath.AddLine(new Point((int)Math.Round(tOld * tM), 200 - (int)Math.Round(xOld * xM)), new Point((int)Math.Round(tCurrent * tM), 200 - (int)Math.Round(xCurrent * xM))); // В объект gPath добавляем точку с вычисленными значениями
            g.DrawPath(new Pen(Color.Black), gPath);  // прорисовываем весь gPath, который, напомню, отвечает за прорисовку кривой
            FillTables();
 
            
        }
 
        private void DrawGrid()    // процедура отрисовки координатной сетки
        {
            for (int i = 0; i < 9; i++)    // рисуем горизонтальные линии
            {
                g.DrawLine(new Pen(Color.LightGray), new Point(0, 50 + i * 100), new Point(500, 50 + i * 100));  // светло-серые тонкие
                g.DrawLine(new Pen(Color.DarkGray,2), new Point(0, i * 100), new Point(500, i * 100));           // темно-серые потолще
            }
            for (int i = 0; i < 10; i++)   // рисуем вертикальные линии
            {
                g.DrawLine(new Pen(Color.LightGray), new Point(50 + i * 100, 0), new Point(50 + i * 100, 400));  // светло-серые тонкие
                g.DrawLine(new Pen(Color.DarkGray,2), new Point(i * 100, 0), new Point(i * 100, 400));           // темно-серые потолще
            }
        }
 
        private bool InitVariables()   // процедура инициализации переменных
        {
            gPath = new GraphicsPath();    // инициализируем gPath
            tCurrent = 0;                  // текущее время (время, прошедшее от запуска маятника) устанавливаем в ноль
            dt = (double)timer1.Interval / 1000;     // записываем в dt шаг расчета (с точно таким же шагом будет пробегать таймер)
            try              // Попытка инициализации начальных параметров маятника. При этом точка на лету конвертируется в запятую.
            {
                xCurrent = Convert.ToDouble(xnBox.Text.Replace('.', ',')); vCurrent = Convert.ToDouble(vnBox.Text.Replace('.', ','));
                k = Convert.ToDouble(deflectionBox.Text.Replace('.', ',')); massa = Convert.ToDouble(massaBox.Text.Replace('.', ',')); tk = Convert.ToDouble(tkBox.Text.Replace('.', ','));
            }
            catch (FormatException e) // Если же даже в этом случае формат данных не является числовым - вылетает ошибка
            {
                MessageBox.Show("Неверный формат входных данных!","Ошибка!",MessageBoxButtons.OK,MessageBoxIcon.Error);
                return false;  // и процедура инициализации переменных возвращает false
            }
 
            if (massa <= 0) { MessageBox.Show("Масса груза должна быть больше 0!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; }  // если масса тела меньше нуля - вернуть false
            if (k <= 0) { MessageBox.Show("Жесткость пружины должна быть больше 0!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } // если коэффициент жесткости меньше нуля - вернуть false
 
            dataGridView1.Rows.Add(0, vCurrent);
            dataGridView2.Rows.Add(0, xCurrent);
 
            return true;  // ну и если все проверки прошли успешно завершить процедуру инициализации, вернув true
        }
 
        private void DrawValues()     // Отрисовка значений на осях координат
        {
            Font drawFont = new Font("Arial",8);  // установка фона
            SolidBrush drawBrush = new SolidBrush(Color.Blue);  // установка кисти
            g.DrawString("0", drawFont, drawBrush, new Point(0, 200));  // прорисовка нуля
            for (int i = 1; i < 5; i++)    // отрисовка значений по оси времени
            {
                g.DrawString(String.Format("{0:f1}",i*tk/5), drawFont, drawBrush, new Point(i*100, 200));
            }
            A = Math.Sqrt(Math.Abs(xCurrent * xCurrent + massa * vCurrent * vCurrent / k));   // определение максимальной амплитуды колебаний
            for (int i = 3; i >= 1; i--)  // отрисовка значений по оси координат
            {
                g.DrawString(String.Format("{0:f1}", i * A / 3), drawFont, drawBrush, new Point(0, 200 - i * 50));
                g.DrawString(String.Format("{0:f1}", -i * A / 3), drawFont, drawBrush, new Point(0, 200 + i * 50));
            }
            tM = 500 / tk;          // вычисление масштабного коэффициента по оси времени
            xM = 150 / Math.Round(A,1);  // вычисление масштабного коэффициента по оси координат
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)   // процедура срабатывающая каждый раз, когда форма требует перерисовки
        {
            DrawGrid();     // отрисовка координатных осей
        }
 
        private void Skip_Click(object sender, EventArgs e)  // процедура нажатия на сброс
        {
            g.Clear(Color.White);    // очистка графика
            timer1.Stop();             // остановка таймера
            tLabel.Text = String.Format("{0:f2}", 0);   // обнуление текстовых выводов на форме
            xLabel.Text = String.Format("{0:f2}", 0);
            vLabel.Text = String.Format("{0:f2}", 0);
            DrawGrid();            // отрисовка сетки
            Start.Enabled = true;     // установка кнопки Пуск в активное состояние
            Pause.Enabled = false;   // установки кнопки Пауза в неактивное состояние
            Pause.Text = "Пауза";    // изменение текста кнопки пауза на "Пауза"
            dataGridView1.Rows.Clear();
            dataGridView2.Rows.Clear();
 
        }
 
        private void Pause_Click(object sender, EventArgs e)          // процедура нажатия на Паузу
        {
            switch (Pause.Text)  // в зависимости от надписи на кнопке
            {
                case "Пауза": { timer1.Stop(); Pause.Text = "Продолжить"; break; }   // если написано Пауза - останавливаем таймер, переименовываем кнопку в Продолжить
                case "Продолжить": { timer1.Start(); Pause.Text = "Пауза"; break; }  // если написано Продолжить - запускаем таймер, переименовываем кнопку в Пауза
                default:
                    break;
            }
            
            
        }
 
        private void FillTables()
        {
            dataGridView1.Rows.Add(Math.Round(tHalf,2), Math.Round(vCurrent,2));
            dataGridView2.Rows.Add(Math.Round(tCurrent,2), Math.Round(xCurrent,2));
        }
        
 
    }
}
0
26.11.2012, 19:28
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2012, 19:28
Помогаю со студенческими работами здесь

Создать три массива согласно условию; в каждом массиве найти сумму положительных элементов
Составить программу решения задачи в соответствии с вариантом. Задано три массива вещественных...

Согласно правилам проведения футбольных турниров, за победу команде начисляются три очка, за ничью - одно, за поражение - ноль
Задача: Согласно правилам проведения футбольных турниров, за победу команде начисляются три очка,...

Согласно правилам проведения футбольных турниров, за победу команде начисляются три очка, за ничью - одно, за поражение - ноль
Задача: Согласно правилам проведения футбольных турниров, за победу команде начисляются три очка,...

Нарисовать три прямоугольника
нАДО Рисовать три прямоугольник красный , белый, голубой


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru