Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Visual Studio 2012

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

Код программы: 

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 Newton_Interpolate
{
    public partial class Form1 : Form
    {
 
        public struct point //Структура точки
        {
            public float X, Y; //Машинные координаты
            public float x, y; //Реальные координаты
        }
 
 
        //Координаты исходных точек. Значение x и y должны быть по модулю не больше 30.
        public float[,] Pts = { { -27f, 24.5f }, 
                                 { -22f, 12.8f }, 
                                 { -18.4f, 10.2f }, 
                                 { 8.6f, -4f },
                                 { 0f, -4.5f},
                                 {4f, 2.8f},
                                 {14.2f, 12.6f},
                                 {17f, 24.5f},
                                 {21f, 26f}
                               };
 
        public point[] Points = new point[100]; //Массив точек
        public Font drawFont = new Font("Arial", 8); //Стиль шрифта и его размер, для отрисовки координат точек на плоскости
        public int xc=300, yc=300; //Координаты центра координатных осей
 
 
        public Form1()
        {
            InitializeComponent();
        }
 
        //Отрисовка плоскости, с точками и координатными осями
        public void drawPlain()
        {
            Graphics g = Graphics.FromHwnd(picturebox1.Handle); 
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            g.Clear(Color.White);
            Pen Axis = new Pen(Color.Black, 1);
 
            g.DrawLine(Axis, 0, 300, 600, 300);
            g.DrawLine(Axis, 300, 0, 300, 600);
 
            for (int i = 0; i <= 600; i += 10)
            {
                g.DrawLine(Axis, i, 298, i, 302);
                g.DrawLine(Axis, 298, i, 302, i);
            }
 
            for (int i = 0; i < (Pts.Length / 2); i++)
            {
                Points[i].x = Pts[i, 0];
                Points[i].y = Pts[i, 1];
                Points[i].X = xc + Points[i].x * 10;
                Points[i].Y = yc - Points[i].y * 10;
            }
 
            DrawPoints();//Отрисовка точек
        }
 
        public int ChangeCoordinates(float a, int isY) //Перевод координат из реальных в машинные
        {
            if (isY == 1) return (int)(yc - a * 10);
            return (int)(xc + a * 10);
        }
 
        //Высчитывание полинома Лагранжа в заданном отрезка, с заданными точками.
        public float Lagrange(float x)
        {
            float res = 0f, s = 0f, s1 = 1f, s2 = 1f;
 
            for (int i = 0; i < (Pts.Length / 2); i++)
            {
                s1 = 1f; s2 = 1f;
                for (int j = 0; j < (Pts.Length / 2); j++)
                {
                    if (i != j)
                    {
                        s1 = s1 * (x - Points[j].x);
                        s2 = s2 * (Points[i].x - Points[j].x);
                    }
                }
                s = Points[i].y * (s1 / s2);
                res = res + s;
 
            }
 
            return res;
        }
 
 
        //Отрисовка точек и их координат на плоскости
        public void DrawPoints()
        {
            Graphics g = Graphics.FromHwnd(picturebox1.Handle);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            SolidBrush pointBrush = new SolidBrush(Color.Red);
            SolidBrush drawPointBrush = new SolidBrush(Color.Black);
 
            for (int i = 0; i < (Pts.Length / 2); i++)
            {
                g.FillEllipse(pointBrush, Points[i].X-2, Points[i].Y-2, 4, 4);
                String drawString = "[" + Points[i].x + "; " + Points[i].y + "]";
                PointF drawPoint = new PointF(Points[i].X, Points[i].Y);
                g.DrawString(drawString, drawFont, drawPointBrush, drawPoint);
            }
        }
 
 
        //Отрисовка интерполированной функции по нажатию на кнопку "Нарисовать"
        private void Draw_Button_Click(object sender, EventArgs e)
        {
            Graphics g = Graphics.FromHwnd(picturebox1.Handle);
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
 
            SolidBrush drawLineNewton = new SolidBrush(Color.Blue);
 
            drawPlain();
 
            for (float i = -30.0f; i <= 30.0f; i += 0.0005f)
            {
                g.FillRectangle(drawLineNewton, ChangeCoordinates(i, 0), ChangeCoordinates(Lagrange(i), 1), 1, 1);
            }
 
        }
 
    }
}

Прикрепленный файлРазмер
Lagrange.rar85.39 кб