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

Вход на сайт

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

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

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

Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

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

Рейтинг@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 кб