
Среда программирования:
MS Visual Studio 2017 Community
Статья по теме:
Задача: Построить кривую Безье по методу "Де Кастельжо"
Построение производится по нажатию кнопки Draw
Код программы:
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Graphics G; // Объект графики PointF[] Arr = new PointF[] // Исходный массив точек { new PointF(10,150), new PointF(5,50), new PointF(150,50), new PointF(140,140), new PointF(150,50), new PointF(150,50), new PointF(150,50), }; int Fuctorial(int n) // Функция вычисления факториала { int res = 1; for (int i = 1; i <= n; i++) res *= i; return res; } float polinom (int i, int n, float t)// Функция вычисления полинома Бернштейна { return (Fuctorial(n)/(Fuctorial(i) * Fuctorial(n - i)))* (float)Math.Pow(t, i) * (float)Math.Pow(1 - t, n - i); } void Draw()// Функция рисования кривой { int j = 0; float step = 0.01f;// Возьмем шаг 0.01 для большей точности PointF[] result = new PointF[101];//Конечный массив точек кривой for (float t = 0; t < 1; t += step) { float ytmp = 0; float xtmp = 0; for (int i = 0; i < Arr.Length; i++) { // проходим по каждой точке float b = polinom(i, Arr.Length - 1, t); // вычисляем наш полином Бернштейна xtmp += Arr[i].X * b; // записываем и прибавляем результат ytmp += Arr[i].Y * b; } result[j] = new PointF(xtmp, ytmp); j++; } G.DrawLines(new Pen(Color.Red), result);// Рисуем полученную кривую Безье } private void button1_Click(object sender, EventArgs e) { G = Graphics.FromHwnd(pictureBox1.Handle); G.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; Draw(); } } }
Прикрепленный файл | Размер |
---|---|
Pavlova_Bezie.zip | 42.38 кб |
Комментарии
Я код на C++ набрал сам. Строил кривую Безье, но "прилипал" к нулю. То есть я задаю точки далеко от нуля, а он строил из нуля, а потом только обходил предложенные точки.
Потом я нашёл Ваш сайт и эту статью. Оказалось, что я забыл возвести t в степень i. Теперь всё отлично работает. Спасибо огромное!
Пишу с использованием мультимедийной библиотеки SFML.