Написать свой алгоритм рисования кривых Безье - 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);
}
}
}