File:Cardinal Spline Example.png
Description |
This image is a graphical representation of a Cardinal Spline. It is drawn on a 720x480 canvas and the curve has 10 control points. The tension is set to 0.1. The red squares repesent the position of the control points, and the red line represents the path of the curve. The image was created with the following perl script: use strict; use Image::Magick; use Math::Matrix; use Math::Gradient qw(gradient); my $rate = 500; my $tension = 0.1; my(@coords) = ( [ 23, 24], [123, 64], [167,200], [ 18,285], [293,467], [699,205], [487,181], [358,222], [262,130], [238, 24] ); my $image = Image::Magick->new; # Create new image $image ->Set(size=>'720x480'); # Set size $image ->ReadImage('xc:white'); # Make it all white foreach my $ra_coord (@coords) # For every set of coords in the list { my($x,$y) = @{$ra_coord}[0,1]; # Get the x and y $image ->Draw ( primitive => 'rectangle', points => (($x-3).','.($y-3).' '.($x+3).','.($y+3)), fill => 'red' ); # Draw a small rectangle at each coord } while (scalar(@coords) >= 4) # While there are at least 4 entries in the list { for my $u (gradient(0,1,$rate)) # iterate from 0 to 1 in 500 steps { my($x,$y) = &EvaluateCardinal2D(\@coords, $tension, $u); # Hand paramaters to formula $image ->Set("pixel\[$x,$y\]"=>'red'); # Set that pixel red } shift(@coords); # Remove the first entry of the list } $image ->Write("Cardinal_Spline_Example.png"); # Save image sub EvaluateCardinal2D { my($ra_coords,$T,$u) = @_; my $s = (1-$T)/2; my $u_matrix = new Math::Matrix # 4 x 1 ( # Matrix based off the point in the curve [($u ** 3), ($u ** 2), ($u), (1) ] ); my $cardinal_matrix = new Math::Matrix # 4 x 4 ( # Guts of the Cardinal Spline formula [(-1 * $s), (2 - $s), ($s - 2), ($s) ], [(2 * $s), ($s - 3), (3-(2 * $s)), (-1 * $s) ], [(-1 * $s), (0), ($s), (0) ], [(0), (1), (0), (0) ], ); my $x_matrix = new Math::Matrix # 1 x 4 ( # X coords for point: [${${$ra_coords}[0]}[0]], # 1 [${${$ra_coords}[1]}[0]], # 2 [${${$ra_coords}[2]}[0]], # 3 [${${$ra_coords}[3]}[0]] # 4 ); my $y_matrix = new Math::Matrix # 1 x 4 ( # Y coords for point: [${${$ra_coords}[0]}[1]], # 1 [${${$ra_coords}[1]}[1]], # 2 [${${$ra_coords}[2]}[1]], # 3 [${${$ra_coords}[3]}[1]] # 4 ); my $xt = int ($u_matrix * $cardinal_matrix * $x_matrix); # Compute for X my $yt = int ($u_matrix * $cardinal_matrix * $y_matrix); # Compute for Y return($xt,$yt); }
|
---|---|
Source |
Own work |
Date |
17 October 2006 |
Author | |
Permission (Reusing this file) |
See below. |
Summary
This image is a graphical representation of a Cardinal Spline. It is drawn on a 720x480 canvas and the curve has 10 control points. The tension is set to 0.1.
The red squares repesent the position of the control points, and the red line represents the path of the curve.
The image was created with the following perl script:
use strict; use Image::Magick; use Math::Matrix; use Math::Gradient qw(gradient); my $rate = 500; my $tension = 0.1; my(@coords) = ( [ 23, 24], [123, 64], [167,200], [ 18,285], [293,467], [699,205], [487,181], [358,222], [262,130], [238, 24] ); my $image = Image::Magick->new; # Create new image $image ->Set(size=>'720x480'); # Set size $image ->ReadImage('xc:white'); # Make it all white foreach my $ra_coord (@coords) # For every set of coords in the list { my($x,$y) = @{$ra_coord}[0,1]; # Get the x and y $image ->Draw ( primitive => 'rectangle', points => (($x-3).','.($y-3).' '.($x+3).','.($y+3)), fill => 'red' ); # Draw a small rectangle at each coord } while (scalar(@coords) >= 4) # While there are at least 4 entries in the list { for my $u (gradient(0,1,$rate)) # iterate from 0 to 1 in 500 steps { my($x,$y) = &EvaluateCardinal2D(\@coords, $tension, $u); # Hand paramaters to formula $image ->Set("pixel\[$x,$y\]"=>'red'); # Set that pixel red } shift(@coords); # Remove the first entry of the list } $image ->Write("Cardinal_Spline_Example.png"); # Save image sub EvaluateCardinal2D { my($ra_coords,$T,$u) = @_; my $s = (1-$T)/2; my $u_matrix = new Math::Matrix # 4 x 1 ( # Matrix based off the point in the curve [($u ** 3), ($u ** 2), ($u), (1) ] ); my $cardinal_matrix = new Math::Matrix # 4 x 4 ( # Guts of the Cardinal Spline formula [(-1 * $s), (2 - $s), ($s - 2), ($s) ], [(2 * $s), ($s - 3), (3-(2 * $s)), (-1 * $s) ], [(-1 * $s), (0), ($s), (0) ], [(0), (1), (0), (0) ], ); my $x_matrix = new Math::Matrix # 1 x 4 ( # X coords for point: [${${$ra_coords}[0]}[0]], # 1 [${${$ra_coords}[1]}[0]], # 2 [${${$ra_coords}[2]}[0]], # 3 [${${$ra_coords}[3]}[0]] # 4 ); my $y_matrix = new Math::Matrix # 1 x 4 ( # Y coords for point: [${${$ra_coords}[0]}[1]], # 1 [${${$ra_coords}[1]}[1]], # 2 [${${$ra_coords}[2]}[1]], # 3 [${${$ra_coords}[3]}[1]] # 4 ); my $xt = int ($u_matrix * $cardinal_matrix * $x_matrix); # Compute for X my $yt = int ($u_matrix * $cardinal_matrix * $y_matrix); # Compute for Y return($xt,$yt); }
Licensing
Lua error in package.lua at line 80: module 'strict' not found.
The above source code is released under the same conditions as the image itself. (PD by owner)
Missing from file history: Berland cropped the image 2007-03-05.
Lua error in package.lua at line 80: module 'strict' not found.
File history
Click on a date/time to view the file as it appeared at that time.
Date/Time | Thumbnail | Dimensions | User | Comment | |
---|---|---|---|---|---|
current | 01:07, 5 February 2023 | ![]() | 720 × 480 (7 KB) | Thales (talk | contribs) |
- You cannot overwrite this file.
File usage
The following page links to this file: