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