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

Построение графиков в Windows Form

09.04.2022, 18:16. Показов 1406. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытался построить график, формулы расписаны вроде как правильно, но строит не то. Как я понял должна строиться либо парабола при y = x + 5, либо прямая при y = x2. В чем ошибка? И как ее решить?
В скриншотах указал функцию.
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
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 zadanie2_1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            one();
        }
        void one()
        {
            Graphics g = this.CreateGraphics();
            g.Clear(Color.White);
            Pen a = new Pen(Color.Blue, 1);
            Pen b = new Pen(Color.Green, 2);
            Font drawFont = new Font("Arial", 12);
            Font signatureFont = new Font("Arial", 7);
            SolidBrush drawBrush = new SolidBrush(Color.Blue);
            StringFormat drawFormat = new StringFormat();
            drawFormat.FormatFlags = StringFormatFlags.DirectionRightToLeft;
            int sizeWidth = Form1.ActiveForm.Width;
            int sizeHeight = Form1.ActiveForm.Height;
            //координаты центра условной точки y=0 x=0
            Point center = new Point(((int)(sizeWidth / 2) - 8), (int)((sizeHeight / 2) - 19));
 
            g.DrawLine(a, 10, center.Y, center.X, center.Y); // не трогать
            g.DrawLine(a, center.X, center.Y, 2 * center.X - 10, center.Y);
            g.DrawLine(a, center.X, 10, center.X, center.Y);
            g.DrawLine(a, center.X, center.Y, center.X, 2 * center.Y - 10);
 
            g.DrawString("X", drawFont, drawBrush, new PointF(2 * center.X - 5, center.Y + 10), drawFormat);
            g.DrawString("Y", drawFont, drawBrush, new PointF(center.X + 30, 5), drawFormat);
            g.DrawString("O", drawFont, drawBrush, new PointF(center.X, center.Y), drawFormat);
 
            g.DrawLine(a, center.X, 10, center.X + 5, 20); //стрелки y+
            g.DrawLine(a, center.X, 10, center.X - 5, 20); //стрелки y-
            g.DrawLine(a, 2 * center.X - 10, center.Y, 2 * center.X - 25, center.Y - 5);
            g.DrawLine(a, 2 * center.X - 10, center.Y, 2 * center.X - 25, center.Y + 5);
 
            int stepForAxes = 25;
            int lengthShtrix = 3;
            int maxValueForAxesX = 4;
            int maxValueForAxesY = 3;
 
            float oneDelenieX = (float)maxValueForAxesX / ((float)center.X / (float)stepForAxes);
            float oneDelenieY = (float)maxValueForAxesY / ((float)center.Y / (float)stepForAxes);
 
            for (int i = center.X, j = center.X, k = 1; i < 2 * center.X - 30; j -= stepForAxes,
                i += stepForAxes, k++)
            {
                g.DrawLine(a, i, center.Y - lengthShtrix, i, center.Y + lengthShtrix);
                g.DrawLine(a, j, center.Y - lengthShtrix, j, center.Y + lengthShtrix);
                if (i < 2 * center.X - 55)
                {
                    g.DrawString((k * oneDelenieX).ToString("0.0"), signatureFont, drawBrush,
                        new PointF(i + stepForAxes + 9, center.Y + 6), drawFormat);
                    g.DrawString(((k * oneDelenieX).ToString("0.0").ToString() + "-"),
                        signatureFont, drawBrush, new PointF(j - stepForAxes + 9, center.Y + 6), drawFormat);
                }
            }
            for (int i = center.Y, j = center.Y, k = 1; i < 2 * center.Y - 30; j -= stepForAxes,
                i += stepForAxes, k++)
            {
                g.DrawLine(a, center.X - lengthShtrix, i, center.X + lengthShtrix, i);
                g.DrawLine(a, center.X - lengthShtrix, j, center.X + lengthShtrix, j);
                if (i < 2 * center.Y - 55)
                {
                    g.DrawString((k * oneDelenieY).ToString("0.0"), signatureFont, drawBrush,
                        new PointF(center.X + 9, j - stepForAxes + 6), drawFormat);
                    g.DrawString(((k * oneDelenieY).ToString("0.0").ToString() + "-"),
                        signatureFont, drawBrush, new PointF(center.X + 9, i + stepForAxes + 6), drawFormat);
                }
            }
            int numofPoint = 100;
            
 
            float[] first = new float[numofPoint];
 
            for (int i = 0; i < numofPoint; i++)
            {
                first[i] = (float)maxValueForAxesX / (float)numofPoint * (i + 1) - (float)(maxValueForAxesX / 2); //интервал от -2 до 2
            }
 
            float[] second = new float[numofPoint];
            for (int i = 0; i < numofPoint; i++)
            {
                if (first[i] < 0) second[i] = first[i] * first[i] - 5;
                if (first[i] >= 0) second[i] = (first[i] + 1);
            }
            Point[] pointOne = new Point[numofPoint];
            float tempX = 1 / oneDelenieX * stepForAxes;
            float tempY = 1 / oneDelenieY * stepForAxes;
            for (int i = 0; i < numofPoint; i++)
            {
                pointOne[i].X = center.X + (int)(first[i] * tempX);
                pointOne[i].Y = center.Y - (int)(second[i] * tempY);
            }
            g.DrawLines(b, pointOne);
            g.DrawCurve(b, pointOne);
        }
        private void Form1_Resize(object sender, EventArgs e)
        {
            one();
        }
        private void Form1_Paint(object sender, EventArgs e)
        {
            one();
        }
    }
}
Миниатюры
Построение графиков в Windows Form  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2022, 18:16
Ответы с готовыми решениями:

Построение графика функции sin (x) в Windows form Application
нужен код для построения графика функции sin(x) в Windows form Application/

Построение локального отчета Windows Form Report.rdlc
У меня в отчете должны данные выливаться из базы данных, для этого у меня есть DataSet который определяет таблицу данных. Эта таблица...

Построение Улитки Паскаля в Windows Form
Необходимо нарисовать улитку паскаля в Windows Form, есть пример как сделать только с циклоидой: private void...

5
2 / 2 / 0
Регистрация: 14.10.2020
Сообщений: 136
10.04.2022, 11:51  [ТС]
Проблема в том, что он пытается нарисовать одновременно две функции.
Цитата Сообщение от domestozzz Посмотреть сообщение
C#
1
2
if (first[i] < 0) second[i] = first[i] * first[i] - 5;
                if (first[i] >= 0) second[i] = (first[i] + 1);
Как сделать так, чтобы рисовало либо то, либо то?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.04.2022, 12:32
Лучший ответ Сообщение было отмечено domestozzz как решение

Решение

Функция у тебя одна, и вычислять её нужно как одну функцию. А вот рисовать уже раздельно, по областям определения.
Далее. Не нужно смешивать рисование осей и рисование графика — это разные процессы. Нужно переносить начало координат туда, где твой центр, чтобы избавиться от громоздких вычислений и путаницы. Следует пользоваться масштабом. См. пример
Миниатюры
Построение графиков в Windows Form  
Вложения
Тип файла: zip WindowsFormsApp1.zip (9.4 Кб, 19 просмотров)
1
2 / 2 / 0
Регистрация: 14.10.2020
Сообщений: 136
10.04.2022, 12:41  [ТС]
Ваш пример есть решение проблемы?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
10.04.2022, 13:47
domestozzz, да. График строится
1
2 / 2 / 0
Регистрация: 14.10.2020
Сообщений: 136
10.04.2022, 15:43  [ТС]
ViterAlex, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2022, 15:43
Помогаю со студенческими работами здесь

Создать win form, используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 нет
есть необходимость создать win form используя шаблон windows form в clr, однако такого шаблона на моей студии 2013 не обнаружено ... :(

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

Построение графиков
Построить по 2 формулам графики вот по этим значениям Р1=4, Р2=10, k=n1/n 2,n0=(n2-n1 )/ln(P2/P1),n1=1,469, n2=1,956, n0=0,526,...

Построение графиков
Привет всем. Кто нибудь сталкивался с библиотекой http://www.chartjs.org/ для построения графиков?? Нужна помощь в стилизации по макету. В...

Построение графиков в С#
Здравствуйте! Есть задача сделать приложение с интерфейсом для построения несколько графиков зависимостей одной функции от нескольких...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru