Написать свой алгоритм рисования кривых Безье - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д