Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2017, 12:28   #1
PKAAASS
Новичок
Джуниор
 
Регистрация: 05.12.2017
Сообщений: 3
По умолчанию Программа графика функции

Добрый день форумчане , помогите с программой , может у кого есть программа по построению графиков функции? Там Парабола , гипербола , синусоида и т.п
PKAAASS вне форума Ответить с цитированием
Старый 05.12.2017, 12:32   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Ну допустим есть. ))
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 05.12.2017, 18:10   #3
PKAAASS
Новичок
Джуниор
 
Регистрация: 05.12.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Ну допустим есть. ))
Не мог бы поделится проектом кода , пишу на C# программу для пострения графика функции и тут застрял в самом начале на параболе , Там такая суть что отображается только либо левая часть параболы , либо правая.
PKAAASS вне форума Ответить с цитированием
Старый 05.12.2017, 18:23   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Где код?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 05.12.2017, 18:28   #5
PKAAASS
Новичок
Джуниор
 
Регистрация: 05.12.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Где код?
Вот код параболы:
Код:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            if (razreshenie)
            {
 
                Graphics grapparab;
                grapparab = e.Graphics;
                Pen mypen2;
                mypen2 = new Pen(Color.Blue, 2);
                Pen mypen;
                mypen = new Pen(Color.Gray, 1);
                
                
                grapparab.TranslateTransform(200, 200);
                grapparab.DrawLine(mypen, 0, 0, 0, 1000);
                grapparab.DrawLine(mypen, 0, 0, 1000, 0);
                grapparab.DrawLine(mypen, 0, 0, -1000, 0);
                grapparab.DrawLine(mypen, 0, 0, 0, -1000);
 
                listx.Items.Clear();
                listy.Items.Clear();
                float x = -10, y;
                int a = (int)nud1.Value;
                int b = (int)nud2.Value;
                int c = (int)nud3.Value;
 
                for (int i = 0; i <= 21; i++)
                {
                    listx.Items.Add(x);
 
                    y = x * x * a + b * x + c;
 
                    listy.Items.Add(y);
                    x++; 
                    grapparab.DrawLine(mypen2,0,0,(float)listx.Items[i],(float)listy.Items[i]);
                     }
        }
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.12.2017 в 22:01.
PKAAASS вне форума Ответить с цитированием
Старый 06.12.2017, 08:42   #6
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

В обработчике Paint такие вещи не делают. Производительность будет падать. Картинку надо формировать отдельно и выводить по готовности.

Код:
private void button1_Click(object sender, EventArgs e)
        {
            // холст для рисования
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics graphCanvas = Graphics.FromImage(canvas);

            // центр графика точка 0,0
            PointF centerDrawing = new PointF(canvas.Width / 2, canvas.Height / 2);

            // границы расчета функции
            int minx = -10, maxx = 10;

            // шаг масштабирования на графике 
            float stepX = canvas.Width / Math.Abs(maxx - minx);
            float stepY = canvas.Height / Math.Abs(maxx - minx);

            // рисуем оси графика
            DrawAxis(graphCanvas, Color.Black, centerDrawing, canvas.Size, minx, maxx, stepX, stepY);

            // генерим нужные функции
            List<PointF> parabolic = CreateParabolic(1, 0, -5, minx, maxx, 0.01f);
            List<PointF> sinus = CreateSinus(5, 5, minx, maxx, 0.001f);
            List<PointF> hyper = CreateHyper(5, minx, maxx, 0.001f);

            // рисуем нужные функции
            DrawCurve(graphCanvas, Brushes.Magenta, parabolic, centerDrawing, stepX, stepY);
            DrawCurve(graphCanvas, Brushes.Cyan, sinus, centerDrawing, stepX, stepY);
            DrawCurve(graphCanvas, Brushes.CornflowerBlue, hyper, centerDrawing, stepX, stepY);

            // показываем пользователю
            pictureBox1.Image = canvas;
        }

        void DrawAxis(Graphics canvas, Color Color, PointF Center, Size drawingField, float min, float max, float stepX, float stepY)
        {
            // Оси
            Pen axisPen = new Pen(Color, 2);
            canvas.DrawLine(axisPen, new PointF(0, drawingField.Height / 2.0f), new PointF(drawingField.Width, drawingField.Height / 2.0f));
            canvas.DrawLine(axisPen, new PointF(drawingField.Width / 2.0f, 0), new PointF(drawingField.Width / 2.0f, drawingField.Height));

            for (float x = min; x < max; x += 0.5f)
            {
                float gx = x * stepX + drawingField.Width / 2.0f;
                float gy = x * stepY + drawingField.Height / 2.0f;
                canvas.DrawLine(axisPen, new PointF(gx, (drawingField.Height / 2.0f) + 2), new PointF(gx, (drawingField.Height / 2.0f) - 2.0f));
                canvas.DrawLine(axisPen, new PointF(drawingField.Width / 2.0f - 2.0f, gy), new PointF(drawingField.Width / 2.0f + 2.0f, gy));
            }
        }

        /// <summary>
        /// Рисует график по точкам на указанном холсте
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="Color"></param>
        /// <param name="dataPoint"></param>
        /// <param name="Center"></param>
        /// <param name="stepX"></param>
        /// <param name="stepY"></param>
        void DrawCurve(Graphics canvas, Brush Color, List<PointF> dataPoint, PointF Center, float stepX, float stepY)
        {
            dataPoint.ForEach(new Action<PointF>((o) =>
            {
                canvas.FillEllipse(Color, new RectangleF(new PointF((o.X * stepX + Center.X) - 1, (o.Y * stepY + Center.Y) - 1), new SizeF(2, 2)));
            }));
        }

       List<PointF> CalcFunc(Func<float, float> func, float min, float max, float step)
        {
            List<PointF> _result = new List<PointF>();
            for (float x = min; x < max; x += step)
            {
                _result.Add(new PointF(x, func(x)));
            }
            return _result;
        }

        /// <summary>
        /// Создает точки функции параболы
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateParabolic(float a, float b, float c, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (x * x) * a + (b * x) + c; }), min, max, step);
        }

        /// <summary>
        /// Создает точки функции синуса
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateSinus(float a, float b, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (float)(a * Math.Sin(b * x)); }), min, max, step);            
        }

        /// <summary>
        /// Создает точки функции гиперболы
        /// </summary>
        /// <param name="k"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateHyper(float k, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (float)(k / x); }), min, max, step);
        }
Изображения
Тип файла: jpg 5.jpg (100.4 Кб, 165 просмотров)
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 06.12.2017 в 08:50.
WorldMaster вне форума Ответить с цитированием
Старый 04.04.2023, 11:30   #7
23al1k
Новичок
Джуниор
 
Регистрация: 01.10.2022
Сообщений: 3
По умолчанию че то не получается можете помочь

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
В обработчике Paint такие вещи не делают. Производительность будет падать. Картинку надо формировать отдельно и выводить по готовности.

Код:
private void button1_Click(object sender, EventArgs e)
        {
            // холст для рисования
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics graphCanvas = Graphics.FromImage(canvas);

            // центр графика точка 0,0
            PointF centerDrawing = new PointF(canvas.Width / 2, canvas.Height / 2);

            // границы расчета функции
            int minx = -10, maxx = 10;

            // шаг масштабирования на графике 
            float stepX = canvas.Width / Math.Abs(maxx - minx);
            float stepY = canvas.Height / Math.Abs(maxx - minx);

            // рисуем оси графика
            DrawAxis(graphCanvas, Color.Black, centerDrawing, canvas.Size, minx, maxx, stepX, stepY);

            // генерим нужные функции
            List<PointF> parabolic = CreateParabolic(1, 0, -5, minx, maxx, 0.01f);
            List<PointF> sinus = CreateSinus(5, 5, minx, maxx, 0.001f);
            List<PointF> hyper = CreateHyper(5, minx, maxx, 0.001f);

            // рисуем нужные функции
            DrawCurve(graphCanvas, Brushes.Magenta, parabolic, centerDrawing, stepX, stepY);
            DrawCurve(graphCanvas, Brushes.Cyan, sinus, centerDrawing, stepX, stepY);
            DrawCurve(graphCanvas, Brushes.CornflowerBlue, hyper, centerDrawing, stepX, stepY);

            // показываем пользователю
            pictureBox1.Image = canvas;
        }

        void DrawAxis(Graphics canvas, Color Color, PointF Center, Size drawingField, float min, float max, float stepX, float stepY)
        {
            // Оси
            Pen axisPen = new Pen(Color, 2);
            canvas.DrawLine(axisPen, new PointF(0, drawingField.Height / 2.0f), new PointF(drawingField.Width, drawingField.Height / 2.0f));
            canvas.DrawLine(axisPen, new PointF(drawingField.Width / 2.0f, 0), new PointF(drawingField.Width / 2.0f, drawingField.Height));

            for (float x = min; x < max; x += 0.5f)
            {
                float gx = x * stepX + drawingField.Width / 2.0f;
                float gy = x * stepY + drawingField.Height / 2.0f;
                canvas.DrawLine(axisPen, new PointF(gx, (drawingField.Height / 2.0f) + 2), new PointF(gx, (drawingField.Height / 2.0f) - 2.0f));
                canvas.DrawLine(axisPen, new PointF(drawingField.Width / 2.0f - 2.0f, gy), new PointF(drawingField.Width / 2.0f + 2.0f, gy));
            }
        }

        /// <summary>
        /// Рисует график по точкам на указанном холсте
        /// </summary>
        /// <param name="canvas"></param>
        /// <param name="Color"></param>
        /// <param name="dataPoint"></param>
        /// <param name="Center"></param>
        /// <param name="stepX"></param>
        /// <param name="stepY"></param>
        void DrawCurve(Graphics canvas, Brush Color, List<PointF> dataPoint, PointF Center, float stepX, float stepY)
        {
            dataPoint.ForEach(new Action<PointF>((o) =>
            {
                canvas.FillEllipse(Color, new RectangleF(new PointF((o.X * stepX + Center.X) - 1, (o.Y * stepY + Center.Y) - 1), new SizeF(2, 2)));
            }));
        }

       List<PointF> CalcFunc(Func<float, float> func, float min, float max, float step)
        {
            List<PointF> _result = new List<PointF>();
            for (float x = min; x < max; x += step)
            {
                _result.Add(new PointF(x, func(x)));
            }
            return _result;
        }

        /// <summary>
        /// Создает точки функции параболы
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateParabolic(float a, float b, float c, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (x * x) * a + (b * x) + c; }), min, max, step);
        }

        /// <summary>
        /// Создает точки функции синуса
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateSinus(float a, float b, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (float)(a * Math.Sin(b * x)); }), min, max, step);            
        }

        /// <summary>
        /// Создает точки функции гиперболы
        /// </summary>
        /// <param name="k"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="step"></param>
        /// <returns></returns>
        List<PointF> CreateHyper(float k, float min, float max, float step)
        {
            return CalcFunc(new Func<float, float>((x) => { return (float)(k / x); }), min, max, step);
        }
Когда ввожу коэффициенты Например функция y = 2*x^2 + 8x + 2
Вершины функции -2, -6 соответственно
Но на графике показывает -4 и -12

То есть в два раза больше

и так со всеми вершинами -1, -2 становятся -2, -4 у примеру

А да еще почему то в графике все симметрично
То есть если график должен смотреть вниз, в программе он смотрит вверх
Изображения
Тип файла: jpg Снимок экрана (11).jpg (101.0 Кб, 2 просмотров)
23al1k вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графика функции y=ax^2+bx+c Timka4296 Общие вопросы Delphi 8 31.07.2016 05:45
PascalABC.NET - Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. serge-first Помощь студентам 22 29.05.2013 21:39
Построение графика функции, мигание(затухание) шарика в минимумах функции kas1m_rus Паскаль, Turbo Pascal, PascalABC.NET 0 27.05.2012 20:28
3 графика функции Sannyore Помощь студентам 0 03.04.2011 12:38
Программа динамического поворота 3D-графика функции (delphi) Казанцев Андрей Помощь студентам 2 13.04.2009 19:57