ファイル:Cardinal Spline Example.png

このファイルはウィキメディア・コモンズのものであり、他のプロジェクトで使用されている可能性があります。 ウィキメディア・コモンズでのファイル解説ページにある説明を以下に示します。
| 解説Cardinal Spline Example.png |
English: 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 represent the position of the control points, and the red line represents the path of the curve. The image was created with the following w: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);
}
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. |
| 日付 | 17 October 2006 |
| 原典 | 投稿者自身による著作物 |
| 作者 | H (talk) (Uploads) |
概要
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 represent the position of the control points, and the red line represents the path of the curve.
The image was created with the following w: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);
}
ライセンス
| Public domainPublic domainfalsefalse |
| この作品の著作権者である私は、この作品についての権利を放棄しパブリックドメインとします。これは全世界で適用されます。 一部の国では、これが法的に可能ではない場合があります。その場合は、次のように宣言します。 私は、あらゆる人に対して、法により必要とされている条件を除き、如何なる条件も課すことなく、あらゆる目的のためにこの著作物を使用する権利を与えます。 |
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.
キャプション
このファイルに描写されている項目
題材
image/png
a8413cfb6df53fd074f9410ab6a833e8a1d50fa1
7,439 バイト
480 ピクセル
720 ピクセル
ファイルの履歴
過去の版のファイルを表示するには、その版の日時をクリックしてください。
| 日時 | サムネイル | 寸法 | 利用者 | コメント | |
|---|---|---|---|---|---|
| 現在の版 | 2007年12月19日 (水) 02:16 | 720 × 480 (7キロバイト) | wikimediacommons>HighInBC | Instead of cropping an example which uses absolute coordinates, I have moved the curve closer to the edge |
ファイルの使用状況
このファイルを使用しているページはありません。