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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2022, 21:36   #1
23al1k
Новичок
Джуниор
 
Регистрация: 01.10.2022
Сообщений: 2
По умолчанию Нужна помощь с графиком параболы

Кто может объяснить как работает этот КОД. Например у меня есть квадратная функция с переменными a,b,c которые надо ввести в TextBoxы, как можно совместить этот код с этими переменными?

Код:
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);
           

            // рисуем нужные функции
            DrawCurve(graphCanvas, Brushes.Magenta, parabolic, 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);
        }
23al1k вне форума Ответить с цитированием
Старый 15.10.2022, 14:33   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,859
По умолчанию

Код:
// генерим нужные функции
List<PointF> parabolic = CreateParabolic(1, 0, -5, minx, maxx, 0.01f);
вот же
перед этим добавляете что-нибудь вида
Код:
var a = float.Parse(textBoxA.Text, CultureInfo.InvariantCulture);
несколько раз (с изменениями, конечно) для 3 разных коэффициентов. Ну и чтобы оно работало, надо на форму добавить соответственно 3 текстбокса, можно ещё добавить обработку ошибок по вкусу (читать про TryParse).
Ну и вызвать в итоге
Код:
// генерим нужные функции
List<PointF> parabolic = CreateParabolic(a, b, c, minx, maxx, 0.01f);
phomm вне форума Ответить с цитированием