Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
1

Построить график

10.02.2015, 09:39. Просмотров 904. Ответов 23
Метки нет (Все метки)

Сделать графическое представление для программы.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Diff_odn
{
    class Program
    {
        static void Main(string[] args)
        {
            //создаем ячейки
            var cells = new List<Cell>();
            for (int i = 0; i < 10; i++)
                cells.Add(new Cell { C = 0 });
 
            cells[0] = new Cell { C = 1 };
            //
            var solver = new Solver { D = 1, H = 1, Cells = cells };
 
            while (true)
            {
                solver.Solve(0.01);
                //выводим
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Concentration:\r\n");
                foreach (var c in solver.Cells)
                    Console.Write("{0:0.00} ", c.C);
                //задержка
                Thread.Sleep(20);
            }
        }
    }
 
    class Solver
    {
        /// <summary>
        /// Высота ячейки
        /// </summary>
        public double H;
 
        /// <summary>
        /// Коэфф диффузии
        /// </summary>
        public double D;
 
        /// <summary>
        /// Ячейки
        /// </summary>
        public IList<Cell> Cells;
 
        public void Solve(double dt)
        {
            var newCells = new List<Cell>();
            //считаем концентрацию
            for (int i = 0; i < Cells.Count; i++)
            {
                var c0 = GetC(i - 1);
                var c1 = GetC(i);
                var c2 = GetC(i + 1);
                var c = c1 + D * ((c0 - 2 * c1 + c2) / (H * H)) * dt;
                newCells.Add(new Cell { C = c });
            }
            //
            Cells = newCells;
        }
 
        double GetC(int iCell)
        {
            if (iCell >= Cells.Count)
                return Cells[Cells.Count - 1].C;
            if (iCell < 0)
                return Cells[0].C;
            return Cells[iCell].C;
        }
    }
 
    struct Cell
    {
        /// <summary>
        /// Текущая концентрация
        /// </summary>
        public double C;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2015, 09:39
Ответы с готовыми решениями:

Построить график
Незнаете как построить график по этим данным? I 0,3 II 0,41 III ...

Построить график
Помогите вообще не понимаю как это сделать написать программу которая строит...

Построить график
Добрый день! Помогите построить график по точкам 0; 0 0; 861.5 0,09; 861.5...

Построить график функции
всем привет.подскажите как нарисовать график y={x}^{2} в visual studio?буду...

Построить график из функции
Добрый день. Нужна помощь гуру. Задали курсак написать &quot;Построение графиков из...

23
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
10.02.2015, 10:05 2
О, мой код
Если вам нужен был GUI, почему вы сразу об этом не сказали?
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication241
{
    public partial class Form1 : Form
    {
        private Solver solver;
        private Chart chart;
 
        public Form1()
        {
            InitializeComponent();
 
            //создаем ячейки
            var cells = new List<Cell>();
            for (int i = 0; i < 10; i++)
                cells.Add(new Cell {C = 0});
 
            cells[0] = new Cell {C = 5};
            //
            solver = new Solver {D = 1, H = 1, Cells = cells};
            //
            chart = new Chart() {Parent = this, MinX = 0, MaxX = 11, MinY = 0, MaxY = 3, Dock = DockStyle.Fill};
            chart.Function = (x) =>
                                 {
                                     var xx = (int) Math.Round(x - 1);
                                     if (xx < 0 || xx >= solver.Cells.Count) return 0;
                                     return solver.Cells[xx].C;
                                 };
 
            Application.Idle += new EventHandler(Application_Idle);
        }
 
        void Application_Idle(object sender, EventArgs e)
        {
            solver.Solve(0.01);
            chart.Invalidate();
        }
    }
 
    class Solver
    {
        /// <summary>
        /// Высота ячейки
        /// </summary>
        public double H;
 
        /// <summary>
        /// Коэфф диффузии
        /// </summary>
        public double D;
 
        /// <summary>
        /// Ячейки
        /// </summary>
        public IList<Cell> Cells;
 
        public void Solve(double dt)
        {
            var newCells = new List<Cell>();
            //считаем концентрацию
            for (int i = 0; i < Cells.Count; i++)
            {
                var c0 = GetC(i - 1);
                var c1 = GetC(i);
                var c2 = GetC(i + 1);
                var c = c1 + D * ((c0 - 2 * c1 + c2) / (H * H)) * dt;
                newCells.Add(new Cell { C = c });
            }
            //
            Cells = newCells;
        }
 
        double GetC(int iCell)
        {
            if (iCell >= Cells.Count)
                return Cells[Cells.Count - 1].C;
            if (iCell < 0)
                return Cells[0].C;
            return Cells[iCell].C;
        }
    }
 
    struct Cell
    {
        /// <summary>
        /// Текущая концентрация
        /// </summary>
        public double C;
    }
 
    public class Chart : Control
    {
        /// <summary>
        /// Отступы
        /// </summary>
        public int Indent { get; set; }
 
        public float MaxX { get; set; }
        public float MinX { get; set; }
        public float MaxY { get; set; }
        public float MinY { get; set; }
 
        /// <summary>
        /// Шаг сетки
        /// </summary>
        public float GridStep { get; set; }
 
        /// <summary>
        /// Шаг интерполирования
        /// </summary>
        public float InterpolationStep { get; set; }
 
        /// <summary>
        /// Отображаемая функция
        /// </summary>
        public Func<double, double> Function;
 
        public Chart()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
            Indent = 30;
            MinX = -5;
            MaxX = 5;
            MinY = -5;
            MaxY = 5;
            GridStep = 1;
            InterpolationStep = 0.01f;
        }
 
        /// <summary>
        /// Область внутри которой будет рисоваться график
        /// </summary>
        private Rectangle ChartArea
        {
            get
            {
                var rect = ClientRectangle;
                rect.Inflate(-Indent, -Indent);
                return rect;
            }
 
        }
 
        /// <summary>
        /// Преобразует виртуальные координаты в пикселы
        /// </summary>
        float YToPixels(float y)
        {
            return ChartArea.Height * (y - MinY) / (MaxY - MinY);
        }
 
        /// <summary>
        /// Преобразует виртуальные координаты в пикселы
        /// </summary>
        float XToPixels(float x)
        {
            return ChartArea.Width * (x - MinX) / (MaxX - MinX);
        }
 
        /// <summary>
        /// Отрисовка
        /// </summary>
        protected override void OnPaint(PaintEventArgs e)
        {
            var rect = ChartArea;
            var gr = e.Graphics;
 
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 
            var center = new PointF(rect.Left + XToPixels(0), rect.Bottom - YToPixels(0));
 
            //рисуем сетку
            using (var font = new Font(Font.FontFamily, 8f))
            using (var pen = new Pen(Color.FromArgb(50, Color.Navy), 1))
            {
                for (var x = MinX; x <= MaxX; x += GridStep)
                {
                    var absX = rect.Left + XToPixels(x);
                    gr.DrawLine(pen, absX, rect.Bottom, absX, rect.Top);
                    gr.DrawString(x.ToString("0.0"), font, Brushes.Navy, absX - 7, center.Y + 5);
                }
 
                for (var y = MinY; y <= MaxY; y += GridStep)
                {
                    var absY = rect.Bottom - YToPixels(y);
                    gr.DrawLine(pen, rect.Left, absY, rect.Right + 5, absY);
                    gr.DrawString(y.ToString("0.0"), font, Brushes.Navy, center.X - 25, absY - 5);
                }
            }
 
            //рисуем оси
            using (var pen = new Pen(Color.Navy, 1))
            {
                pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
                gr.DrawLine(pen, center.X, rect.Bottom, center.X, rect.Top - 10);
                gr.DrawLine(pen, rect.Left, center.Y, rect.Right + 7, center.Y);
            }
 
            //рисуем функцию
            if (Function != null)
                using (var pen = new Pen(Color.Red, 2))
                    for (var x = MinX; x < MaxX; x += InterpolationStep)
                    {
                        var y1 = (float)Function(x);
                        var y2 = (float)Function(x + InterpolationStep);
                        e.Graphics.DrawLine(pen, rect.Left + XToPixels(x), rect.Bottom - YToPixels(y1), rect.Left + XToPixels(x + InterpolationStep), rect.Bottom - YToPixels(y2));
                    }
        }
    }
}
1
Изображения
 
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
10.02.2015, 10:09  [ТС] 3
Такой график я сделала, просто нужно для всех 10 ячеек сделать так чтобы они были на графике.
0
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
10.02.2015, 10:11 4
Цитата Сообщение от babyk Посмотреть сообщение
Такой график я сделала, просто нужно для всех 10 ячеек сделать так чтобы они были на графике.
Не понял. Нарисуйте от руки, как оно должно выглядеть.
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
10.02.2015, 10:20  [ТС] 5
Чтобы была как бы такая анимация.
0
Миниатюры
Построить график  
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
10.02.2015, 10:25 6
Не вижу отличий от моего графика.... Там есть анимация...
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
10.02.2015, 10:27  [ТС] 7
Извините, это я видимо недоглядела.
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 10:54  [ТС] 8
Подскажите пожалуйста, как мне сделать так чтобы линия была равна нулю в конце...а не так как сейчас на о,1...
и еще другой график, чтобы распределение было с 5-ой ячейки, и потом чтоб во всех ячейках была концентрация =0,1
0
Миниатюры
Построить график  
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 12:12  [ТС] 9
Storm23,Подскажите пожалуйста, как мне сделать так чтобы линия была равна нулю в конце...а не так как сейчас на о,1...
и еще другой график, чтобы распределение было с 5-ой ячейки, и потом чтоб во всех ячейках была концентрация =0,1
0
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 13:59 10
babyk, Вы мне показыаете какой-то график и спрашиваете как там сделать что? Откуда я знаю? На моем графике и в начале и в конце - нули.

Покажите код.
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 18:50  [ТС] 11
вот...
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Diff_odn_gr
{
    public partial class Form1 : Form
    {
        private Solver solver;
        private Chart chart;
 
        public Form1()
        {
            InitializeComponent();
 
            //создаем ячейки
            var cells = new List<Cell>();
            for (int i = 0; i < 10; i++)
                cells.Add(new Cell {C = 0});
 
            cells[0] = new Cell {C = 1};
            //
            solver = new Solver {D = 1, H = 1, Cells = cells};
            //
            chart = new Chart() {Parent = this, MinX = 0, MaxX = 10, MinY = 0, MaxY = 1.1f, Dock = DockStyle.Fill};
            chart.Function = (x) =>
                                 {
                                     var xx = (int) Math.Round(x-1);
                                     if (xx < 0 || xx >= solver.Cells.Count) return 0;
                                     return solver.Cells[xx].C;
                                 };
 
            Application.Idle += new EventHandler(Application_Idle);
        }
 
        void Application_Idle(object sender, EventArgs e)
        {
            solver.Solve(0.01);
            chart.Invalidate();
        }
    }
 
    class Solver
    {
        /// <summary>
        /// Высота ячейки
        /// </summary>
        public double H;
 
        /// <summary>
        /// Коэфф диффузии
        /// </summary>
        public double D;
 
        /// <summary>
        /// Ячейки
        /// </summary>
        public IList<Cell> Cells;
 
        public void Solve(double dt)
        {
            var newCells = new List<Cell>();
            //считаем концентрацию
            for (int i = 0; i < Cells.Count; i++)
            {
                var c0 = GetC(i - 1);
                var c1 = GetC(i);
                var c2 = GetC(i + 1);
                var c = c1 + D * ((c0 - 2 * c1 + c2) / (H * H)) * dt;
                newCells.Add(new Cell { C = c });
            }
            //
            Cells = newCells;
        }
 
        double GetC(int iCell)
        {
            if (iCell >= Cells.Count)
                return Cells[Cells.Count - 1].C;
            if (iCell < 0)
                return Cells[0].C;
            return Cells[iCell].C;
        }
    }
 
    struct Cell
    {
        /// <summary>
        /// Текущая концентрация
        /// </summary>
        public double C;
    }
 
    public class Chart : Control
    {
        /// <summary>
        /// Отступы
        /// </summary>
        public int Indent { get; set; }
 
        public float MaxX { get; set; }
        public float MinX { get; set; }
        public float MaxY { get; set; }
        public float MinY { get; set; }
 
        /// <summary>
        /// Шаг сетки
        /// </summary>
        public float GridStep { get; set; }
 
        /// <summary>
        /// Шаг интерполирования
        /// </summary>
        public float InterpolationStep { get; set; }
 
        /// <summary>
        /// Отображаемая функция
        /// </summary>
        public Func<double, double> Function;
 
        public Chart()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
            Indent = 30;
            MinX = -5;
            MaxX = 5;
            MinY = -5;
            MaxY = 5;
            GridStep = 0.1f;
            InterpolationStep = 1;
        }
 
        /// <summary>
        /// Область внутри которой будет рисоваться график
        /// </summary>
        private Rectangle ChartArea
        {
            get
            {
                var rect = ClientRectangle;
                rect.Inflate(-Indent, -Indent);
                return rect;
            }
 
        }
 
        /// <summary>
        /// Преобразует виртуальные координаты в пикселы
        /// </summary>
        float YToPixels(float y)
        {
            return ChartArea.Height * (y - MinY) / (MaxY - MinY);
        }
 
        /// <summary>
        /// Преобразует виртуальные координаты в пикселы
        /// </summary>
        float XToPixels(float x)
        {
            return ChartArea.Width * (x - MinX) / (MaxX - MinX);
        }
 
        /// <summary>
        /// Отрисовка
        /// </summary>
        protected override void OnPaint(PaintEventArgs e)
        {
            var rect = ChartArea;
            var gr = e.Graphics;
 
            gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 
            var center = new PointF(rect.Left + XToPixels(0), rect.Bottom - YToPixels(0));
 
            //рисуем сетку
            using (var font = new Font(Font.FontFamily, 8f))
            using (var pen = new Pen(Color.FromArgb(50, Color.Navy), 1))
            {
                for (var x = MinX; x <= MaxX; x += 1)
                {
                    var absX = rect.Left + XToPixels(x);
                    gr.DrawLine(pen, absX, rect.Bottom, absX, rect.Top);
                    gr.DrawString(x.ToString("0.0"), font, Brushes.Navy, absX - 7, center.Y + 5);
                }
 
                for (var y = MinY; y <= MaxY; y += GridStep)
                {
                    var absY = rect.Bottom - YToPixels(y);
                    gr.DrawLine(pen, rect.Left, absY, rect.Right + 5, absY);
                    gr.DrawString(y.ToString("0.0"), font, Brushes.Navy, center.X - 25, absY - 5);
                }
            }
 
            //рисуем оси
            using (var pen = new Pen(Color.Navy, 1))
            {
                pen.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;
                gr.DrawLine(pen, center.X, rect.Bottom, center.X, rect.Top - 10);
                gr.DrawLine(pen, rect.Left, center.Y, rect.Right + 7, center.Y);
            }
 
            //рисуем функцию
            if (Function != null)
                using (var pen = new Pen(Color.Red, 2))
                    for (var x = MinX; x < MaxX; x += InterpolationStep)
                    {
                        var y1 = (float)Function(x);
                        var y2 = (float)Function(x + InterpolationStep);
                        e.Graphics.DrawLine(pen, rect.Left + XToPixels(x), rect.Bottom - YToPixels(y1), rect.Left + XToPixels(x + InterpolationStep), rect.Bottom - YToPixels(y2));
                    }
        }
    }
}
0
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 19:25 12
babyk,
C#
1
InterpolationStep = 1;
=>
C#
1
InterpolationStep = 0.01f;
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 19:35  [ТС] 13
Вы меня не так поняли...нужно так
0
Миниатюры
Построить график  
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 19:41 14
Цитата Сообщение от babyk Посмотреть сообщение
Вы меня не так поняли...нужно так
OMG

C#
1
cells[0] = new Cell {C = 1};
=>
C#
1
cells[4] = new Cell {C = 1};
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 19:50  [ТС] 15
а чтобы линия равнялась не y=0,5. а просто y=0 после того как она падает с первой ячейки?...как на первом рисунке я рисовала.
0
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 19:54 16
Цитата Сообщение от babyk Посмотреть сообщение
а чтобы линия равнялась не y=0,5. а просто y=0 после того как она падает с первой ячейки?...как на первом рисунке я рисовала.
см пост #12
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 20:03  [ТС] 17
Извините, но график должен весь упасть с 0,5 после окончания всей анимации просто на 0...а так он останавливаеться на о,5.
0
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 20:37 18
Цитата Сообщение от babyk Посмотреть сообщение
Извините, но график должен весь упасть с 0,5 после окончания всей анимации просто на 0...а так он останавливаеться на о,5.
Я не могу понять о чем вы
Нарисуйте живописью по листику что ли.
0
babyk
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 22
15.02.2015, 20:52  [ТС] 19
Вот так...
0
Миниатюры
Построить график  
Storm23
Эксперт .NETАвтор FAQ
6235 / 3740 / 1416
Регистрация: 11.01.2015
Сообщений: 4,916
Записей в блоге: 31
15.02.2015, 20:57 20
babyk,
А с чего вы взяли что она должна быть на нуле?
Водичку в стакан налейте - она там тоже на нуле будет?
0
15.02.2015, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2015, 20:57

Как построить график?
надо построить на форме график (вместе с осями Ох Оу) у=-х^2+2 не знаю вообще,...

Построить график функции
Построить график функции.Таблицу данных получить путем изменения параметра X c...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru