views:

49

answers:

1

I posted a previous question about generating a bezier curve based on only the start and end points, and I was able thanks to the answers in that create a bezier curve using the information I have.

This is the code that allows me to draw the types of curve that I want on a form.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    Random rnd = new Random();
    Point startp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height));
    Point endp = new Point(rnd.Next(0, this.Width), rnd.Next(0, this.Height));
    int xMod = 0;
    int yMod = 0;
    if (startp.X > endp.X) {
        xMod = -1;
    } else {
        xMod = 1;
    }
    if (startp.Y > endp.Y) {
        yMod = 1;
    } else {
        yMod = -1;
    }
    Point control1p = new Point(endp.X + (rnd.Next(20, 50) * xMod), endp.Y + (rnd.Next(20, 50) * yMod));
    Point control2p = new Point(endp.X + (rnd.Next(5, 20) * xMod), endp.Y + (rnd.Next(5, 20) * yMod));
    Point[] pts = {
        startp,
        control1p,
        control2p,
        endp
    };
    Pen dashed_pen = new Pen(Color.Black, 0);
    dashed_pen.DashStyle = Drawing2D.DashStyle.Dash;
    for (int i = 0; i <= 2; i++) {
        e.Graphics.DrawLine(dashed_pen, pts(i), pts(i + 1));
    }
    e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality;
    Pen bez_pen = new Pen(Color.Black, 3);
    e.Graphics.DrawBezier(bez_pen, pts(0), pts(1), pts(2), pts(3))
}

Is there a way, or can someone help me with returning all the points that form the curve? I'd like for each point of a curve calculated from those points to be returned in an array of points, but I'm having no luck figuring it out, and haven't been able to find a similar solution on stackoverflow or google in general.

Thanks.

+1  A: 

What you want to do is to convert a Bezier Curve (Cubic from the looks of it) into a Polyline

Use the Equation on this page...Value of t should be between 0 to 1...Calculate all values of Bx(t) and By(t) by using the equation for values of t in increments of "0, 0.01, 0.02....1" (Convert them to integers of course) The smaller your increments, the more accurate your points will be.

Here's a C Sample of the DeCasteljau Algorithm (almost the same procedure, but its a bit optimized i believe) :)

st0le