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

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

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

Доброго времени суток. Ребят появилось задание написать по комп графике реализацию рисования Кривых Безье. Класс с нуля, без использования встроенных функций. Нашел алгоритм для 4ех точек, но что то никак не появляется форма с моей функцией. Мои предположения что плохо связана графика с алгоритмом. Уже 3ий час сижу все никак. Может кто подскажет в чем проблема и как её можно решить. Надо до завтра решить вопрос т.к. зачет на носу уже. Заранее спасибо.
Листинг программы
  1. namespace WindowsFormsApplication5
  2. {
  3. public partial class Form1 : Form
  4. {
  5. private Pen pen = new Pen(Color.Black);
  6. private Graphics g;
  7. public Form1()
  8. {
  9. InitializeComponent();
  10. Image im = new Bitmap(pictureBox1.Width, pictureBox1.Height);
  11. g = Graphics.FromImage(im);
  12. g.Clear(Color.White);
  13. DrawBeze(new Point(320, 250), new Point(100, 200), new Point(300, 120), new Point(85, 63), g, pen);
  14. g.Dispose();
  15. }
  16. *******public static void DrawBeze(Point A,Point B,Point C, Point D,Graphics g,Pen p)
  17. *******{
  18. float Q1, Q2, Q3, Q4, T, T1, Step;
  19. int M, QX, QY;
  20. **************if (Math.Abs(D.X - A.X) > Math.Abs(D.Y - A.Y))
  21. **************{
  22. ******************M = D.X - A.X;
  23. **************}
  24. **************else
  25. ******************M = D.Y - A.Y;
  26. **************Step = 1 / M;
  27. **************T = 0;
  28. ***********while (T < 1)
  29. ***************{
  30. T = T + Step;
  31. if (T > 1){
  32. *******************T = 1;
  33. *******************T1 = 0;}
  34. else
  35. *******************T1 = 1 - T;
  36. ***************Q1 = T1 * T1 * T1;
  37. ***************Q2 = 3 * T1 * T1 * T;
  38. ***************Q3 = 3 * T1 * T ** T;
  39. ***************Q4 = ****T ** T ** T;
  40. ***************QX = (int)(Q1 * A.X + Q2 * B.X + Q3 * C.X + Q4 * D.X);
  41. QY = (int)(Q1 * A.Y + Q2 * B.Y + Q3 * C.Y + Q4 * D.Y);
  42. g.DrawRectangle(p,10,10,2,2);
  43. ***********}
  44. **************
  45. *******}
  46. }
  47. }

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

textual
Листинг программы
  1. using System;
  2. using System.Drawing;
  3.  
  4. namespace WindowsFormsApplicationTest2
  5. {
  6.     /// <summary>
  7.     /// Кривоая безье
  8.     /// </summary>
  9.     public class BezierCurve
  10.     {
  11.         /// <summary>
  12.         /// Количество точек для отрисовки.
  13.         /// </summary>
  14.         private const int N = 40;
  15.  
  16.         /// <summary>
  17.         /// Опорные точки.
  18.         /// </summary>
  19.         private PointF[] dataPoints;
  20.  
  21.         /// <summary>
  22.         /// Создание кривой безье
  23.         /// </summary>
  24.         /// <param name="points">Опроные точки</param>
  25.         public BezierCurve(PointF[] points)
  26.         {
  27.             if (points.Length != 4)
  28.             {
  29.                 throw new ArgumentOutOfRangeException();
  30.             }
  31.             dataPoints = points;
  32.             Invalidate();
  33.         }
  34.  
  35.         /// <summary>
  36.         /// Точки для отрисовки
  37.         /// </summary>
  38.         public PointF[] DrawingPoints { get; private set; }
  39.  
  40.         /// <summary>
  41.         /// Опорные точки
  42.         /// </summary>
  43.         public PointF[] DataPoints
  44.         {
  45.             get { return dataPoints; }
  46.             set
  47.             {
  48.                 if (value.Length != 4)
  49.                 {
  50.                     throw new ArgumentOutOfRangeException();
  51.                 }
  52.                 dataPoints = value;
  53.                 Invalidate();
  54.             }
  55.         }
  56.  
  57.         /// <summary>
  58.         /// Опорная точка
  59.         /// </summary>
  60.         /// <param name="i">Индекс опорной точки</param>
  61.         public PointF this[int i]
  62.         {
  63.             get { return dataPoints[i]; }
  64.             set
  65.             {
  66.                 dataPoints[i] = value;
  67.                 Invalidate();
  68.             }
  69.         }
  70.  
  71.         /// <summary>
  72.         /// Обновить точки для отрисовки.
  73.         /// </summary>
  74.         public void Invalidate()
  75.         {
  76.             DrawingPoints = new PointF[N + 1];
  77.             float dt = 1f / N;
  78.             float t = 0f;
  79.             for (int i = 0; i <= N; i++)
  80.             {
  81.                 DrawingPoints[i] = B(t);
  82.                 t += dt;
  83.             }
  84.         }
  85.  
  86.         /// <summary>
  87.         /// Функция кривой
  88.         /// </summary>
  89.         /// <param name="t">Параметр. Может изменяться от 0 до 1</param>
  90.         /// <returns>Точка кирвой</returns>
  91.         private PointF B(float t)
  92.         {
  93.             float c0 = (1 - t) * (1 - t) * (1 - t);
  94.             float c1 = (1 - t) * (1 - t) * 3 * t;
  95.             float c2 = (1 - t) * t * 3 * t;
  96.             float c3 = t * t * t;
  97.             float x = c0 * dataPoints[0].X + c1 * dataPoints[1].X + c2 * dataPoints[2].X + c3 * dataPoints[3].X;
  98.             float y = c0 * dataPoints[0].Y + c1 * dataPoints[1].Y + c2 * dataPoints[2].Y + c3 * dataPoints[3].Y;
  99.             return new PointF(x, y);
  100.         }
  101.  
  102.         /// <summary>
  103.         /// Отрисовка кривой.
  104.         /// </summary>
  105.         /// <param name="g">График для отрисовки</param>
  106.         public void Draw(Graphics g)
  107.         {
  108.             Pen pen = new Pen(Color.Black, 2f);
  109.             g.DrawLines(pen, DrawingPoints);
  110.         }
  111.     }
  112. }

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


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

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

13   голосов , оценка 3.692 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы