ARTICLE

Drawing B-Spline Curves using GDI+

Posted by Avinash Pundit Articles | GDI+ in VB.NET August 02, 2003
The attached source code project draws spline curves between two points. Its a cubic spline fitting means program start drawing curve after four clicks.
Download Files:
 
Reader Level:

The attached source code project draws spline curves between two points. Its a cubic spline fitting means program start drawing curve after four clicks.

To run the project, download and unzip the attached file, build and run the project and click on the form.

Main source code:

Public Structure point
Public x As Integer
Public y As Integer
Public Sub setxy(ByVal i As Integer, ByVal j As Integer)
x = i
y = j
End Sub 'setxy
Public Sub clearxy()
x = 0
y = 0
End Sub 'clearxy
End Structure 'point 
Sub BSPLINE(ByVal p1 As Point, ByVal p2 As Point, ByVal p3 As Point, ByVal p4 As Point, ByVal divisions As Integer)
Dim a(4) As Double
Dim b(4) As Double
a(0) = (-p1.x + 3 * p2.x - 3 * p3.x + p4.x) / 6.0
a(1) = (3 * p1.x - 6 * p2.x + 3 * p3.x) / 6.0
a(2) = (-3 * p1.x + 3 * p3.x) / 6.0
a(3) = (p1.x + 4 * p2.x + p3.x) / 6.0
b(0) = (-p1.y + 3 * p2.y - 3 * p3.y + p4.y) / 6.0
b(1) = (3 * p1.y - 6 * p2.y + 3 * p3.y) / 6.0
b(2) = (-3 * p1.y + 3 * p3.y) / 6.0
b(3) = (p1.y + 4 * p2.y + p3.y) / 6.0
spline_out_x(0) = a(3)
spline_out_y(0) = b(3)
Dim i As Integer
For i = 1 To divisions - 1
Dim t As Single
t = CSng(i) / CSng(divisions)
spline_out_x(i) = a(3) + t * (a(2) + t * (a(1) + t * a(0)))
spline_out_y(i) = b(3) + t * (b(2) + t * (b(1) + t * b(0)))
Next i
End Sub 'BSPLINE
Public Sub plus_draw(ByVal x As Integer, ByVal y As Integer, ByVal pen_width As Integer, ByVal cl As Color)
Dim g As Graphics = Graphics.FromHwnd(Me.Handle)
g.DrawLine(
New Pen(cl, pen_width), x - 3, y, x + 3, y)
g.DrawLine(
New Pen(cl, pen_width), x, y - 3, x, y + 3)
End Sub 'plus_draw
Public Sub Form_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Movement_Click > 3 Then
pt(0) = pt(1)
pt(1) = pt(2)
pt(2) = pt(3)
pt(3).setxy(e.X, e.Y)
Dim no_of_interpolated_points As Integer = CInt(Math.Sqrt((Math.Pow(pt(2).x - pt(1).x, 2) + Math.Pow(pt(2).y - pt(1).y, 2))))
BSPLINE(pt(0), pt(1), pt(2), pt(3), no_of_interpolated_points)
Dim i As Integer
For i = 0 To no_of_interpolated_points - 1
plus_draw(
CInt(spline_out_x(i)), CInt(spline_out_y(i)), 2, Color.Blue)
Next i
Else
pt(Movement_Click).setxy(e.X, e.Y)
End If
Movement_Click = Movement_Click + 1
plus_draw(e.X, e.Y, 1, Color.Red)
End Sub 'Form_MouseUp

share this article :
post comment
 

hey can u plz tell em why it needs four points before drawing and curve didnt cover that initial points.
my requirement is to draw free hand curve on a picture box from first click to untill user stop..
kindly help!

Posted by mamta sharma Oct 25, 2010
Team Foundation Server Hosting
Become a Sponsor
PREMIUM SPONSORS
  • ceTE software specializes in components for dynamic PDF generation and manipulation. The DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and new content to existing PDF documents from within your applications. Visit DynamicPDF here
    The leading .NET charting control now features PDF, Flash and Silverlight export, visualization of large datasets and more. Deliver true charting functionality to your BI, Scorecard, Presentation or Scientific apps. Download evaluation now.
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor