ファイル:Cardinal Spline Example.png

提供: testwiki
ナビゲーションに移動 検索に移動
    元のファイル (720 × 480 ピクセル、ファイルサイズ: 7キロバイト、MIME タイプ: image/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 domain この作品の著作権者である私は、この作品についての権利を放棄しパブリックドメインとします。これは全世界で適用されます。
    一部の国では、これが法的に可能ではない場合があります。その場合は、次のように宣言します。
    私は、あらゆる人に対して、法により必要とされている条件を除き、如何なる条件も課すことなく、あらゆる目的のためにこの著作物を使用する権利を与えます。

    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.

    キャプション

    このファイルの内容を1行で記述してください

    このファイルに描写されている項目

    題材

    a8413cfb6df53fd074f9410ab6a833e8a1d50fa1

    7,439 バイト

    480 ピクセル

    720 ピクセル

    ファイルの履歴

    過去の版のファイルを表示するには、その版の日時をクリックしてください。

    日時サムネイル寸法利用者コメント
    現在の版2007年12月19日 (水) 02:162007年12月19日 (水) 02:16時点における版のサムネイル720 × 480 (7キロバイト)wikimediacommons>HighInBCInstead of cropping an example which uses absolute coordinates, I have moved the curve closer to the edge

    このファイルを使用しているページはありません。