Krzywa Beziera wg algorytmu

0

Hej, mam problem z rozwiazaniem zadania ze studiow , chodzi o krzywa Beziera ktora mamy narysowac tak jak na obrazku wg podanego algorytmu :
jezeli n= nMax to narysuj linie P1,P2 oraz P2,P3;
w przeciwnym razie oblicz 3 nowe punkty :

  1.       P12 = 0.5*(P1+P2)
        P23 = 0.5*(P2+P3)
        P123 = 0.5*(P12 + P23)
    

2.Wywolaj metode rekurencyjna z n-1 dla punktow P1,P12,P123 oraz P123,P23,P3!

Ponizszy obrazek pokazuje krzywa Beziera z punktami P1 (10,300),P2 (180,50),P3 (320,300) oraz n = 6.

screenshot-20171103152021.png

Jako zadanie jest implementacja tego algorytmu i przedstawienie takiej samej krzywej jak na obrazku .

Do tej pory udalo mi sie za pomoca Graphics.DrawBezier(); uzyskac cos podobnego ale niestety zostalo odrzcucone przez profesora .
Gdyby ktorys z Was mial ochote na godzine lub dwie korkow ( €) badz checi napisania kodu bylbym bardzo wdzieczny .
Przyznaje ze nie mam pojecia o co chodzi ze zmienna n i nMax i to zadanie pozera mi noce ;)

0

Skoro zadanie ze studiów to pewnie była do tego jakaś teoria, wzory itp. Te pkt. co wypisałeś to są wskazówki jak to wykonać, ale najistotniejszy jest tutaj wzór matematyczny, skąd to się wszystko bierze, bez tego ciężko to ruszyć.

1

Tutaj masz gotowca. RefreshPaint to metoda przypisana do zdarzenia Paint klasy PictureBox

using System;
using System.Drawing;
using System.Windows.Forms;

namespace forms
{
    public partial class Form1 : Form
    {
        PointF p1Start;
        PointF p2Start;
        PointF p3Start;
        int n;
        int nMax;

        Pen penCurve;
        Pen basePen;

        public Form1()
        {
            InitializeComponent();

            n = 6;
            nMax = 0;

            p1Start = new PointF(10, 300);
            p2Start = new PointF(180, 50);
            p3Start = new PointF(320, 300);

            penCurve = new Pen(Color.Red,1.3f);
            basePen = new Pen(Color.Black, 2.5f);
            
        }
        private void RefreshPaint(object sender, PaintEventArgs e)
        {
            DrawBase(e.Graphics);
            DrawBezier(n, p1Start, p2Start, p3Start, e.Graphics);
        }

        private void DrawBase(Graphics g)
        {
            g.DrawLine(basePen, p1Start, p2Start);
            g.DrawLine(basePen, p2Start, p3Start);
        }

        private void DrawBezier(int n, PointF p1, PointF p2, PointF p3, Graphics g)
        {
            if (n == nMax)
            {
                g.DrawLine(penCurve, p1, p2);
                g.DrawLine(penCurve, p2, p3);
            }
            else
            {
                PointF p12  = DoMath(p1, p2);
                PointF p23  = DoMath(p2, p3);
                PointF p123 = DoMath(p12, p23);

                DrawBezier(n - 1, p1, p12, p123, g);
                DrawBezier(n - 1, p123, p23, p3, g); 
            }
        }

        private PointF DoMath(PointF p1, PointF p2)
        {
            float x = (0.5f)*(p1.X + p2.X);
            float y = (0.5f)*(p1.Y + p2.Y);

            return new PointF(x, y);
        }
    }
}

Efekt:
screenshot-20171103194020.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1