Среда программирования:
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.rar | 85.39 кб |