CreateJSラジアルグラデーションとマトリックス

xonorageous

FlashアプリケーションをHTML5Canvasに変換しています。開発のほとんどは終了しましたが、色を処理するために、フラッシュアプ​​リケーションに次のようなコードがあります。

matrix = new Matrix ();
matrix.createGradientBox (600, ColorHeight * 1200, 0, 80, ColorHeight * -600);
Animation_gradient_mc.clear ();
Animation_gradient_mc.beginGradientFill (fillType, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio);

CreateJSでの放射状グラデーションの宣言は次のとおりです。

beginRadialGradientFill(colors, ratios, x0, y0, r0, x1, y1, r1 )

マトリックスをグラデーション塗りつぶしに適用する方法を知っている人はいますか?

どんな助けでもいただければ幸いです。

前もって感謝します

編集

これが私が再現しようとしているグラデーションのいくつかの例です:

グラジエントスタート

ご覧のとおり、標準の放射状グラデーションとして始まります。

ただし、引き伸ばされたように見えることもあります。これがマトリックスが役立つと思います。

勾配2

マトリックスを使用してcreatejs.Graphics.Fillを作成することで同じ効果を作成しようとしましたが、何も実行されていないようです。

var matrix = new VacpMatrix();
    matrix.createGradientBox(
        600,
        discharge_gradient.color_height * 1200,
        0,
        80,
        discharge_gradient.color_height * -600
    );

    // test_graphics.append(new createjs.Graphics.Fill('#0000ff', matrix));

    console.log('matrix', matrix);

    test_graphics.append(new createjs.Graphics.Fill('#ff0000', matrix).radialGradient(
        discharge_gradient.colors,
        discharge_gradient.ratios,
        discharge_gradient.x0,
        discharge_gradient.y0,
        discharge_gradient.r0,
        discharge_gradient.x1,
        discharge_gradient.y1,
        discharge_gradient.r1
    ));

    var discharge_shape = new createjs.Shape(test_graphics);

I extended the Matrix2d class to add a createGradientBox method using code from the openfl project:

p.createGradientBox = function (width, height, rotation, tx, ty) {
    if (_.isUndefined(rotation) || _.isNull(rotation)) {
        rotation = 0;
    }

    if (_.isUndefined(tx) || _.isNull(tx)) {
        tx = 0;
    }

    if (_.isUndefined(ty) || _.isNull(ty)) {
        ty = 0;
    }

    var a = width / 1638.4,
        d = height / 1638.4;

    // Rotation is clockwise
    if (rotation != 0) {
        var cos = math.cos(rotation),
            sin = math.sin(rotation);

        this.b = sin * d;
        this.c = -sin * a;
        this.a = a * cos;
        this.d = d * cos;
    } else {
        this.b = 0;
        this.c = 0;
    }

    this.tx = tx + width / 2;
    this.ty = ty + height / 2;
}

I hope the extra information is useful.

Kaiido

I don't know createJS enough, nor Flash Matrix object, but to make this kind of ovalGradient with the native Canvas2d API, you will need to transform the context's matrix.

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var horizontalScale = .3;
var verticalScale = 1;

var gradient = ctx.createRadialGradient(100/horizontalScale, 100/verticalScale, 100, 100/horizontalScale,100/verticalScale,0);
gradient.addColorStop(0,"green");
gradient.addColorStop(1,"red");

// shrink the context's matrix
ctx.scale(horizontalScale, verticalScale)
// draw your gradient
ctx.fillStyle = gradient;
// stretch the rectangle which contains the gradient accordingly
ctx.fillRect(0,0, 200/horizontalScale, 200/verticalScale);
// reset the context's matrix
ctx.setTransform(1,0,0,1,0,0);
canvas{ background-color: ivory;}
<canvas id="canvas" width="200" height="200"></canvas>

So if you are planning to write some kind of a function to reproduce it, have a look at ctx.scale(), ctx.transform() and ctx.setTransform().

EDIT

As you noticed, this will also shrink your drawn shapes, also, you will have to calculate how much you should "unshrink" those at the drawing, just like I did with the fillRect. (agreed, this one was an easy one)

より複雑な形状に役立つ関数を次に示します。私は実際にそれをテストしなかったので(与えられた例でのみ)、それはどういうわけか失敗するかもしれませんが、それはあなたにそれを扱う方法についてのアイデアを与えることもできます:

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

function shrinkedRadial(ctx, shapeArray, xScale, yScale, gradientOpts) {

    // scaling by 0 is like not drawing
    if (!xScale || !yScale) return;

    var gO = gradientOpts;
    // apply our scale on the gradient options we passed
    var gradient = ctx.createRadialGradient(gO.x0 / xScale, gO.y0 / yScale, gO.r0, gO.x1 / xScale, gO.y1 / yScale, gO.r1);
    gradient.addColorStop(gO.c1_pos, gO.c1_fill);
    gradient.addColorStop(gO.c2_pos, gO.c2_fill);

    // shrink the context's matrix
    ctx.scale(xScale, yScale);

    ctx.fillStyle = gradient;
    // execute the drawing operations' string
    shapeArray.forEach(function(str) {
      var val = str.split(' ');
      var op = shapesRef[val[0]];
      if (val[1]) {
        var pos = val[1].split(',').map(function(v, i) {
          // if even, it should be an y axis, otherwise an x one
          return i % 2 ? v / yScale : v / xScale;
        });
        ctx[op].apply(ctx, pos);
      } else {
        // no parameters
        ctx[op]();
      }
    });
    // apply our gradient
    ctx.fill();
    // reset the transform matrix
    ctx.setTransform(1, 0, 0, 1, 0, 0);
  }

// just for shortening our shape drawing operations
// notice how arc operations are omitted, it could be implemented but...
var shapesRef = {
  b: 'beginPath',
  fR: 'fillRect',
  m: 'moveTo',
  l: 'lineTo',
  bC: 'bezierCurveTo',
  qC: 'quadraticCurveTo',
  r: 'rect',
  c: 'closePath'
};

var gradientOpts = {
  x0: 232,
  y0: 55,
  r0: 70,
  x1: 232,
  y1: 55,
  r1: 0,
  c1_fill: 'red',
  c1_pos: 0,
  c2_fill: 'green',
  c2_pos: 1
}

var shapes = ['b', 'm 228,133', 'bC 209,121,154,76,183,43', 'bC 199,28,225,34,233,59', 'bC 239,34,270,29,280,39', 'bC 317,76,248,124,230,133']

// our shape is drawn at 150px from the right so we do move the context accordingly, but you won't have to.
ctx.translate(-150, 0);

shrinkedRadial(ctx, shapes, .3, 1, gradientOpts);

ctx.font = '15px sans-serif';
ctx.fillStyle = 'black';
ctx.fillText('shrinked radialGradient', 3, 20);

// how it looks like without scaling : 

ctx.translate(50, 0)

var gO = gradientOpts;
var gradient = ctx.createRadialGradient(gO.x0, gO.y0, gO.r0, gO.x1, gO.y1, gO.r1);
gradient.addColorStop(gO.c1_pos, gO.c1_fill);
gradient.addColorStop(gO.c2_pos, gO.c2_fill);

ctx.fillStyle = gradient;

shapes.forEach(function(str) {
  var val = str.split(' ');
  var op = shapesRef[val[0]];
  if (val[1]) {
    var pos = val[1].split(',');
    ctx[op].apply(ctx, pos);
  } else {
    ctx[op]();
  }
});
ctx.fill();
ctx.font = '15px sans-serif';
ctx.fillStyle = 'black';
ctx.fillText('normal radialGradient', 160, 20);
<canvas id="canvas" width="400" height="150"></canvas>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

マルチスレッドCプログラムのシリアルポートへのスケジューリングとアクセス制御

分類Dev

グラフィカル アプリケーション/ポート/タスク マネージャー?

分類Dev

ライトボックスを備えたポリマーシングルページアプリケーション

分類Dev

デビットとmysqlのトランザクションごとのクレジット、またはより優れたアルゴスリムとのマッチング?

分類Dev

Swingアプリケーションのマルチスレッドデザインパターンとベストプラクティス

分類Dev

WatchOS2コンプリケーションのスケジュールされたアップデートをバックグラウンドで

分類Dev

デシリアライゼーション中に不変のリストを持つケースクラスにPOJOをマッピング

分類Dev

ローカルでホストされているクラスター(私のマシンとは異なるマシン)でのServiceFabricアプリケーションのデバッグ

分類Dev

Matplotlibアニメーションヒストグラムカラーマップ/グラデーション

分類Dev

ルックアサイドリストと低フラグメンテーションヒープ

分類Dev

Libgdxスライディングスクリーントランジション

分類Dev

単一のグラフィカルアプリを実行するためだけに、デスクトップまたはウィンドウマネージャーなしで小さなディストリビューションが必要

分類Dev

マルチスレッドアプリケーションでのオプションのデバッグ出力-つまり、デッドロックやバグを把握するためではなく、*クライアント用*を意味します。

分類Dev

JQueryトグルクラスとアニメーション

分類Dev

連続グラデーションカラーと固定スケールヒートマップggplot2

分類Dev

クロスプラットフォームのxamarinアプリケーションとネイティブライブラリバインディング

分類Dev

Firebaseクラウドメッセージング(FCM)せずに自分のアプリケーションをインストールしたすべてのデバイスにプッシュ通知を作成することが可能ですか?

分類Dev

アニメーションとのフラグメントトランザクションはグーグルマップを黒くします

分類Dev

コントローラのASP.NETコアルートとインデックスアクション

分類Dev

APIベースのマルチページクライアント側アプリケーションでルーティングを整理する方法は?

分類Dev

Nativescriptを使用してアプリケーションのデバッグバージョンとリリースバージョンを管理するためのベストプラクティスは?

分類Dev

C ++ライブラリと自己登録クラス:クライアントアプリケーションでファクトリマップが空です

分類Dev

マルチデックスおよびシングルトンクラスは、マニフェストアプリケーションタグでandroid:nameを使用します

分類Dev

リアルタイムデータベースFirebaseの「オールオアナッシング」トランザクション

分類Dev

EventSourcingでのマルチアグリゲートトランザクション

分類Dev

シングル(1)ページアプリケーションでサーバーからデータを取得する-ベストプラクティス

分類Dev

非ストリーミングアプリケーション/ JSONと春WebFluxフラックスの挙動

分類Dev

グラデーションマスクとして動的に生成された表示オブジェクト

分類Dev

クラスプロパティのビジュアルベーシックコレクション(リスト)

Related 関連記事

  1. 1

    マルチスレッドCプログラムのシリアルポートへのスケジューリングとアクセス制御

  2. 2

    グラフィカル アプリケーション/ポート/タスク マネージャー?

  3. 3

    ライトボックスを備えたポリマーシングルページアプリケーション

  4. 4

    デビットとmysqlのトランザクションごとのクレジット、またはより優れたアルゴスリムとのマッチング?

  5. 5

    Swingアプリケーションのマルチスレッドデザインパターンとベストプラクティス

  6. 6

    WatchOS2コンプリケーションのスケジュールされたアップデートをバックグラウンドで

  7. 7

    デシリアライゼーション中に不変のリストを持つケースクラスにPOJOをマッピング

  8. 8

    ローカルでホストされているクラスター(私のマシンとは異なるマシン)でのServiceFabricアプリケーションのデバッグ

  9. 9

    Matplotlibアニメーションヒストグラムカラーマップ/グラデーション

  10. 10

    ルックアサイドリストと低フラグメンテーションヒープ

  11. 11

    Libgdxスライディングスクリーントランジション

  12. 12

    単一のグラフィカルアプリを実行するためだけに、デスクトップまたはウィンドウマネージャーなしで小さなディストリビューションが必要

  13. 13

    マルチスレッドアプリケーションでのオプションのデバッグ出力-つまり、デッドロックやバグを把握するためではなく、*クライアント用*を意味します。

  14. 14

    JQueryトグルクラスとアニメーション

  15. 15

    連続グラデーションカラーと固定スケールヒートマップggplot2

  16. 16

    クロスプラットフォームのxamarinアプリケーションとネイティブライブラリバインディング

  17. 17

    Firebaseクラウドメッセージング(FCM)せずに自分のアプリケーションをインストールしたすべてのデバイスにプッシュ通知を作成することが可能ですか?

  18. 18

    アニメーションとのフラグメントトランザクションはグーグルマップを黒くします

  19. 19

    コントローラのASP.NETコアルートとインデックスアクション

  20. 20

    APIベースのマルチページクライアント側アプリケーションでルーティングを整理する方法は?

  21. 21

    Nativescriptを使用してアプリケーションのデバッグバージョンとリリースバージョンを管理するためのベストプラクティスは?

  22. 22

    C ++ライブラリと自己登録クラス:クライアントアプリケーションでファクトリマップが空です

  23. 23

    マルチデックスおよびシングルトンクラスは、マニフェストアプリケーションタグでandroid:nameを使用します

  24. 24

    リアルタイムデータベースFirebaseの「オールオアナッシング」トランザクション

  25. 25

    EventSourcingでのマルチアグリゲートトランザクション

  26. 26

    シングル(1)ページアプリケーションでサーバーからデータを取得する-ベストプラクティス

  27. 27

    非ストリーミングアプリケーション/ JSONと春WebFluxフラックスの挙動

  28. 28

    グラデーションマスクとして動的に生成された表示オブジェクト

  29. 29

    クラスプロパティのビジュアルベーシックコレクション(リスト)

ホットタグ

アーカイブ