Написать свой алгоритм рисования кривых Безье - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Ребят появилось задание написать по комп графике реализацию рисования Кривых Безье. Класс с нуля, без использования встроенных функций. Нашел алгоритм для 4ех точек, но что то никак не появляется форма с моей функцией. Мои предположения что плохо связана графика с алгоритмом. Уже 3ий час сижу все никак. Может кто подскажет в чем проблема и как её можно решить. Надо до завтра решить вопрос т.к. зачет на носу уже. Заранее спасибо.
namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        private Pen pen = new Pen(Color.Black);
        private Graphics g;
 
        public Form1()
        {
            InitializeComponent();
            Image im = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            g = Graphics.FromImage(im);
            g.Clear(Color.White);
            DrawBeze(new Point(320, 250), new Point(100, 200), new Point(300, 120), new Point(85, 63), g, pen);
            g.Dispose();
        }
        *******public static void DrawBeze(Point A,Point B,Point C, Point D,Graphics g,Pen p)
 *******{
            float Q1, Q2, Q3, Q4, T, T1, Step;
            int M, QX, QY;
 **************if (Math.Abs(D.X - A.X) > Math.Abs(D.Y - A.Y))
 **************{
 ******************M = D.X - A.X;
 **************}
 **************else
 ******************M = D.Y - A.Y;
 **************Step = 1 / M;
 **************T = 0;
 ***********while (T < 1)
 ***************{
                    T = T + Step;
                if (T > 1){
 *******************T = 1;
 *******************T1 = 0;}
                else 
 *******************T1 = 1 - T;
 ***************Q1 = T1 * T1 * T1;
 ***************Q2 = 3 * T1 * T1 * T;
 ***************Q3 = 3 * T1 * T ** T;
 ***************Q4 = ****T ** T ** T;
 ***************QX = (int)(Q1 * A.X + Q2 * B.X + Q3 * C.X + Q4 * D.X);
                QY = (int)(Q1 * A.Y + Q2 * B.Y + Q3 * C.Y + Q4 * D.Y);
                g.DrawRectangle(p,10,10,2,2);
 ***********}
 **************
 
 *******}
    }
}

Решение задачи: «Написать свой алгоритм рисования кривых Безье»

textual
Листинг программы
using System;
using System.Drawing;
 
namespace WindowsFormsApplicationTest2
{
    /// <summary>
    /// Кривоая безье
    /// </summary>
    public class BezierCurve
    {
        /// <summary>
        /// Количество точек для отрисовки.
        /// </summary>
        private const int N = 40;
 
        /// <summary>
        /// Опорные точки.
        /// </summary>
        private PointF[] dataPoints;
 
        /// <summary>
        /// Создание кривой безье
        /// </summary>
        /// <param name="points">Опроные точки</param>
        public BezierCurve(PointF[] points)
        {
            if (points.Length != 4)
            {
                throw new ArgumentOutOfRangeException();
            }
            dataPoints = points;
            Invalidate();
        }
 
        /// <summary>
        /// Точки для отрисовки
        /// </summary>
        public PointF[] DrawingPoints { get; private set; }
 
        /// <summary>
        /// Опорные точки
        /// </summary>
        public PointF[] DataPoints
        {
            get { return dataPoints; }
            set
            {
                if (value.Length != 4)
                {
                    throw new ArgumentOutOfRangeException();
                }
                dataPoints = value;
                Invalidate();
            }
        }
 
        /// <summary>
        /// Опорная точка
        /// </summary>
        /// <param name="i">Индекс опорной точки</param>
        public PointF this[int i]
        {
            get { return dataPoints[i]; }
            set
            {
                dataPoints[i] = value;
                Invalidate();
            }
        }
 
        /// <summary>
        /// Обновить точки для отрисовки.
        /// </summary>
        public void Invalidate()
        {
            DrawingPoints = new PointF[N + 1];
            float dt = 1f / N;
            float t = 0f;
            for (int i = 0; i <= N; i++)
            {
                DrawingPoints[i] = B(t);
                t += dt;
            }
        }
 
        /// <summary>
        /// Функция кривой
        /// </summary>
        /// <param name="t">Параметр. Может изменяться от 0 до 1</param>
        /// <returns>Точка кирвой</returns>
        private PointF B(float t)
        {
            float c0 = (1 - t) * (1 - t) * (1 - t);
            float c1 = (1 - t) * (1 - t) * 3 * t;
            float c2 = (1 - t) * t * 3 * t;
            float c3 = t * t * t;
            float x = c0 * dataPoints[0].X + c1 * dataPoints[1].X + c2 * dataPoints[2].X + c3 * dataPoints[3].X;
            float y = c0 * dataPoints[0].Y + c1 * dataPoints[1].Y + c2 * dataPoints[2].Y + c3 * dataPoints[3].Y;
            return new PointF(x, y);
        }
 
        /// <summary>
        /// Отрисовка кривой.
        /// </summary>
        /// <param name="g">График для отрисовки</param>
        public void Draw(Graphics g)
        {
            Pen pen = new Pen(Color.Black, 2f);
            g.DrawLines(pen, DrawingPoints);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5
Похожие ответы