Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331

Рисование графика функции

03.04.2021, 15:45. Показов 1418. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите пожалуйста почему не получается нормально отобразить график функции квадратного уравнения?. Вроде всё выглядит нормально, но график строится криво.

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
        
 
        private void btnStart_Click(object sender, EventArgs e)
        {
            points.Clear();
           
            float a = float.Parse(factorA.Text);
            float b = float.Parse(factorB.Text);
            float c = float.Parse(factorC.Text);
            float k = float.Parse(factorK.Text);
            float x0 = -b / (2 * a); //нахожу координату вершины параболы
            
            float leftBorder = x0 - k * 5; // создаю левую границу графика и правую
            float rightBorder = x0 + k * 5;
 
            while (leftBorder <= rightBorder)  // создаю непосредственно точки и помещаю в список, с шагом равным k( чем он меньше тем график выглядит более плавным, а чем меньше, то график острее).
            {
                float Y = a * leftBorder * leftBorder + b * leftBorder + c;
                points.Add(new PointF(leftBorder, Y));
                leftBorder += k;
            }
            this.Refresh();
 
        }
 
 
 
            private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            int W = pictureBox1.Width, H = pictureBox1.Height;
            int halfW = W / 2, halfH = H / 2;
            e.Graphics.DrawLine(Pens.Black, halfW, 0, halfW, H);// рисую ось OX и OY
            e.Graphics.DrawLine(Pens.Black, 0, halfH, W, halfH);
 
            if (points.Count>0) //если не была нажата кнопка, то список пуст и график не рисуется.
            {
                for (int i=1; i<points.Count;i++)
                {
                    e.Graphics.DrawLine(Pens.Red,points[i-1],points[i]); // рисую линию соединяющую 2 точки.
                }
                
            }
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2021, 15:45
Ответы с готовыми решениями:

Рисование графика функции
Подскажите пожалуйста как вывести график функции Вейерштрасса с возможностью зума в PictureBox?

ускорить рисование графика функции
Суть вот в чем. Я рисую график функции по точкам(цикл бежит по иксам, ищет игрик, в цикле ищет второй икс-игрик и соеденяет их линией)....

Выбор функции, отрезка и рисование графика
кто-нибудь очень нужна программа. Написать программу, которая предлагает пользователю некоторый список функций для построения графиков...

6
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.04.2021, 16:25
Либо приложи проект, либо поясни, что скрывается за параметрами a, b, c, k
  1. Почему рисуешь линиями, а не кривой DrawCurve?
  2. Что за левая и правая границы графика?
  3. Используй метод Graphics.TranslateTransform, чтобы перенести начало координат
  4. PictureBox здесь не нужен, достаточно использовать Panel или рисовать на самой форме.
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.04.2021, 16:40  [ТС]
Вот сам проект.
1. Потому что такое требования, что нужно сделать именно через DrawLine
2. Это то, где график по идее должен начать строиться и то где он должен закончиться.
3. a,b,c - это коэффициента для квадратного уравнения. k-это по сути шаг, через который мы ищем следующую точку.
Вложения
Тип файла: rar zad14.rar (42.4 Кб, 5 просмотров)
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
03.04.2021, 19:14  [ТС]
ViterAlex, А почему лучше использовать panel?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.04.2021, 21:49
danhiroman, в принципе, всё равно на чём рисовать. Хоть на кнопке. Но у каждого контрола своё предназначение. PictureBox предназначен для показа изображений. Не то, чтобы Panel предназначена для рисования на ней, но нет лишнего фунционала.
Можно и даже нужно, рисовать на Bitmap и назначать его в PictureBox, чтобы не перерисовывать каждый раз, а только при изменённых данных.
Далее, нужно применять масштаб, т.к. на экране пиксели, а график может изменяться в очень маленьких или очень больших пределах, например sin(x). Значит, нужен масштаб, чтобы пересчитывать точки графика в экранные пиксели.
Ну если всё-таки нужно рисовать отрезками, то можно использовать метод DrawLines и передать весь массив точек сразу.
См. пример
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
private void panel1_Paint(object sender, PaintEventArgs e)
{
 
    var points = new List<PointF>();
    var minX = -100;
    var maxX = 100;
    //Масштаб по X
    var scaleX = panel1.ClientRectangle.Width / (maxX - minX);
    //Считаем в реальных координатах
    for (int x = minX; x <= maxX; x++)
    {
        points.Add(new PointF(x, Parabola(x)));
    }
 
    var maxY = points.Max(p => p.Y);
    var minY = points.Min(p => p.Y);
    //Масштаб по Y
    var scaleY = (panel1.ClientRectangle.Height - 10) / (maxY - minY);
    //Применяем масштаб
    points = points.Select(p => p = new PointF(p.X * scaleX, p.Y * scaleY)).ToList();
    //Смещаем начало координат
    var dx = panel1.ClientRectangle.Width / 2f;
    var dy = 10;
    e.Graphics.TranslateTransform(dx, dy);
    //Оси
    e.Graphics.DrawLine(Pens.Black, -ClientRectangle.Width, 0, ClientRectangle.Width, 0);
    e.Graphics.DrawLine(Pens.Black, 0, -10, 0, ClientRectangle.Height);
    //График
    e.Graphics.DrawLines(Pens.Red, points.ToArray());
}
 
private float Parabola(float x)
{
    return x * x + x + 1;
}
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
04.04.2021, 01:13  [ТС]
ViterAlex, Спасибо
0
2 / 2 / 0
Регистрация: 26.05.2020
Сообщений: 331
04.04.2021, 16:19  [ТС]
ViterAlex, А если мне нужно, чтобы масштаб вводился пользователем, то как можно заменить эти строчки?
C#
1
2
var scaleY = (panel1.ClientRectangle.Height - 10) / (maxY - minY);
var scaleX = panel1.ClientRectangle.Width / (maxX - minX);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2021, 16:19
Помогаю со студенческими работами здесь

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

Рисование графика
Просмотрел несколько тем на форуме, но нужного не нашел или же не понял! У меня есть массив чисел от 0,1 до 0,0001 примерно) вобщем...

Графика: рисование снежинки
Есть код в паскале который рисует снежинку.Пару часов мучаюсь перенести код на с # но снежинка так и не получалось.Может кому не сложно...

Рисование графика по точкам
Великие умы, подскажите путь решения следующей проблемы: Имеется задача: нарисовать график по 256 точкам, которые в свою очередь...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru