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

Рисование графика по точкам

08.07.2014, 07:52. Просмотров 4660. Ответов 11
Метки нет (Все метки)

Великие умы, подскажите путь решения следующей проблемы:
Имеется задача: нарисовать график по 256 точкам, которые в свою очередь изначально выводятся на экран в виде прямой на координатной сетке, далее при зажатой допустим клавиши Alt + зажимаем клавишу мыши и ведем по графику и точки подпрыгивают либо опускаются в зависимости от движения мыши и остаются в этом положении, после того как график отредактирован, координаты точек выписываются в массив.
Реализовал построение и редактирование графика при помощи ZedGraph, но там редактирование каждой точки в отдельности, а мне нужно именно чтобы зажал кнопку мыши и двигаешь, а точки сами подстраиваются под положение курсора на экране.
Чем воспользоваться и как реализовать подскажите пожалуйста всю голову сломал уже неделю воюю...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2014, 07:52
Ответы с готовыми решениями:

DrawLines рисование линий по точкам из массива
имеется два массива X и Y, в них хранятся координаты по которым нужно рисовать...

Рисование кривой Безье по трем точкам
Доброго утра, форумчане. Надо нарисовать на форме кривую Безье по трём кликам...

Рисование линии на панели по поставленным курсором точкам
нужно чтобы при нажатии на панели на левую кнопку мыши под курсором появлялась...

Рисование ломанной линии по точкам которые ставит пользователь
Преподаватель попросил выполнить данное задание "Пользователь ставит точки на...

Построение графика по точкам
Подскажите, как в формах вообще можно рисовать графики. Особенно интересует как...

11
aleks_pilipenko
)))
606 / 310 / 55
Регистрация: 31.12.2009
Сообщений: 2,273
Записей в блоге: 3
08.07.2014, 08:15 2
Я бы создал массив из точек с их координатами...
Их и двигать мышью можно через поиск ближайшей точки при нажатии мыши и т.д.
0
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
09.07.2014, 03:59  [ТС] 3
т.е. ты имеешь ввиду, не используя zedgraph? и изначально задавать координаты точек?
0
Ev_Hyper
Заблокирован
09.07.2014, 08:09 4
DUFFrec, нет, в ZegGraph график строится по точкам, не нужно ничего изменять.
Поясните вашу задачу подробнее: точки меняют значение лишь по оси Y, а по X жестко закреплены?
И прикрепите проект, так будет проще помочь.
Цитата Сообщение от DUFFrec Посмотреть сообщение
координаты точек выписываются в массив.
в какой массив?
0
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
09.07.2014, 08:19  [ТС] 5
Да точки меняют только Y координату по оси X хоть и 360 градусов, но мне нужно 256, чтобы можно было передать на контроллер Arduino. Проект пока в начальной стадии, придумываю как резать кривую.
Для простоты обрезания кривой нужно ее графическое отображение по 256 точкам, но не изменять каждую точку по отдельности, а зажать клавишу мыши и вести, а точки в свою очередь подстраиваются под положение мыши
0
Ev_Hyper
Заблокирован
09.07.2014, 09:21 6
DUFFrec, ваши объяснения меня только еще больше запутали.
Возможно стоит обрабатывать перемещение мышки:
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
   private bool zedGraph_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            // Сюда будут записаны координаты в системе координат графика
            double x, y;
 
            zedGraph.GraphPane.ReverseTransform(e.Location, out x, out y);
 
            // Выводим результат
            string text = string.Format("X: {0};    Y: {1}", x, y);
            int z = isPoint((int)x);
            if (z != -1)
                zedGraph.GraphPane.CurveList[0].Points[z].Y = y;
 
            label1.Text = text;
            zedGraph.AxisChange();
 
            zedGraph.Invalidate();
            return default(bool);
        }
        //определяем прошел курсор мыши через точку или нет
        private int isPoint(int x)
        {
            for (int i = 0; i < zedGraph.GraphPane.CurveList[0].Points.Count; i++)
                if (zedGraph.GraphPane.CurveList[0].Points[i].X == x) return i;
 
            return -1;
        }
У меня определение точки довольно грубое, но в качестве примера, думаю подойдет.
На всякий случай прикрепляю архив.
P.S В следующий раз нажимайте на ник - так придет уведомление, и тот, к кому вы обращаетесь быстрее зайдет в тему.
0
Вложения
Тип файла: rar ZedGraph_krv.rar (290.5 Кб, 73 просмотров)
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
09.07.2014, 12:04  [ТС] 7
Ev_Hyper, спасибо попробую.
0
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
14.07.2014, 10:50  [ТС] 8
Ev_Hyper, Ваше предложение подходит просто идеально =)
единственное что надо доработать, так это чтобы редактирование графика шло не сразу как мышь попала в поле zedGraph, а дополнительно к этому фактору еще при зажатой клавише допустим ALT.
А так все рисует =)))
Подскажите как сделать
0
Ev_Hyper
Заблокирован
16.07.2014, 08:07 9
DUFFrec, например, так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        bool move = false;
        public Form1()
        {
            InitializeComponent();
 
            DrawGraph();
            zedGraph.KeyDown += (object sender, KeyEventArgs e) =>
            {
                if (e.Alt)
                    move = true;
            };
            zedGraph.KeyUp += (object sender, KeyEventArgs e) =>
            {
                move = false;
            };
        }
0
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
24.07.2014, 04:20  [ТС] 10
Ev_Hyper, Не работает этот вариант, как бы Alt работает и без этой части кода, проблема в том, что редактирование графика разрешено сразу после его построения и малейшее движение мыши в поле графика изменяет его, а вот если нажать Alt и отпустить, то редактирование прекращается и становится возможным только после вторичного нажатия Alt либо нажатия какой либо кнопки на форме.
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
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;
using ZedGraph;
using System.IO;
 
namespace ZnCOM
{
    public partial class Graphic : Form
    {
        bool move = false;
        
            
        
        public Graphic()
        {
            InitializeComponent();
            
 
            DrawGraph();
           
        }
        
        double[] tok = new double[256];
        
        private void DrawGraph()
        {
 
            // Получим панель для рисования
            GraphPane pane = zedGraph.GraphPane;
            
            
            
            
            // Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы
            pane.CurveList.Clear();
            
            // Создадим список точек
            PointPairList list = new PointPairList();
            
 
            int xmin = 0;
 
            int xmax = 255;
            
 
            double ymax = 0;
            for (int i = 0; i <= 255; i++)
            {
 
                listBox1.Items.Add(tok[i].ToString());
                if (ymax <= tok[i])
                    ymax = tok[i];
 
            }
            // Заполняем список точек
            for (int i = xmin; i <= xmax; i++)
            {
                list.Add(i, tok[i]);
 
            }
            // Создадим кривую
            LineItem myCurve = pane.AddCurve("", list, Color.Blue);
            myCurve.Symbol.Size = 3;
           
            // Устанавливаем интересующий нас интервал по оси X
            pane.XAxis.Scale.Min = xmin;
            pane.XAxis.Scale.Max = xmax;
 
            // !!!
            // Устанавливаем интересующий нас интервал по оси Y
            pane.YAxis.Scale.Min = -ymax;
            pane.YAxis.Scale.Max = ymax;
            
            // Вызываем метод AxisChange (), чтобы обновить данные об осях. 
            zedGraph.AxisChange();
 
            // Обновляем график
            zedGraph.Invalidate();
        }                
 
       
        private bool zedGraph_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            
            {
               
                // Сюда будут записаны координаты в системе координат графика
                double x, y;
               
                    zedGraph.GraphPane.ReverseTransform(e.Location, out x, out y);
 
                    // Выводим результат
                    string text = string.Format("X: {0};    Y: {1}", x, y);
                    int z = isPoint((int)x);
                    if (z != -1)
                        zedGraph.GraphPane.CurveList[0].Points[z].Y = y;
 
                    label1.Text = text;
                    zedGraph.AxisChange();
 
                    zedGraph.Invalidate();
                    return default(bool);
               
 
            }
 
        }
        //определяем прошел курсор мыши через точку или нет
        private int isPoint(int x)
        {
            for (int i = 0; i < zedGraph.GraphPane.CurveList[0].Points.Count; i++)
                if (zedGraph.GraphPane.CurveList[0].Points[i].X == x) return i;
 
            return -1;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            this.DrawGraph();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
                       
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Текстовый документ (*.txt)|*.txt|Все файлы (*.*)|*.*";
 
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                    string[] B = File.ReadAllLines(openFileDialog1.FileName);
                    tok = B.Select(x => double.Parse(x)).ToArray();
                               
            }
            listBox1.Items.Clear();
            
            for (int i = 0; i <= 255; i++)
            {
                listBox1.Items.Add(tok[i]);
            }
            this.DrawGraph();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            
            for(int i = 0; i<=255; i++)
            {
                tok[i] = Math.Round(zedGraph.GraphPane.CurveList[0].Points[i].Y, 2);
                listBox1.Items.Add(tok[i]);
            }
 
 
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Текстовый документ (*.txt)|*.txt|Все файлы (*.*)|*.*";
 
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName);
                for(int i = 0; i<=255; i++)
                {
                streamWriter.WriteLine(tok[i]);
                }
                    streamWriter.Close();
            }
                    
                    
 
            }
        }
 
       
        }
0
Ev_Hyper
Заблокирован
24.07.2014, 17:59 11
DUFFrec, в предыдущем сообщении я забыл написать, что проверку флага нужно поставить в событие перемещения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private bool zedGraph_MouseMoveEvent(ZedGraphControl sender, MouseEventArgs e)
        {
            if (move)
            {
                // Сюда будут записаны координаты в системе координат графика
                double x, y;
 
                zedGraph.GraphPane.ReverseTransform(e.Location, out x, out y);
 
                // Выводим результат
                string text = string.Format("X: {0};    Y: {1}", x, y);
                int z = isPoint((int)x);
                if (z != -1)
                    zedGraph.GraphPane.CurveList[0].Points[z].Y = y;
 
                label1.Text = text;
                zedGraph.AxisChange();
                zedGraph.Invalidate();
            }
            return default(bool);
        }
и в конструкторе нужно дописать обработку нажатия/отжатия клавиши alt:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Graphic()
        {
            InitializeComponent();
            
 
            DrawGraph();
           zedGraph.KeyDown += (object sender, KeyEventArgs e) =>
            {
                if (e.Alt)
                    move = true;
            };
            zedGraph.KeyUp += (object sender, KeyEventArgs e) =>
            {
                move = false;
            };
        }
0
DUFFrec
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 8
02.10.2014, 05:30  [ТС] 12
Ev_Hyper, привет, взялся доделывать прогу =)
Вот не знаю как прописать чтобы переходы между окнами работали правильно, и в итоге возвращались к первоначальному окну, а при нажатии на крестик прога закрывалась полностью, но только при нажатии крестика на главной форме.
0
Вложения
Тип файла: zip ZnCOM.zip (519.8 Кб, 39 просмотров)
02.10.2014, 05:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2014, 05:30

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

Создание графика по точкам и вывод точек в файл
Добрый день. Нужно построить график функции y(x)={a}_{1} * \sin ({b}_{1} * x)...

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


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

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

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