2016-10-21 24 views
0

各ノードに値が付いた三角形(例:(A,B,C) -> (0.3, 0.1, 0.7))があります。 (1.0、緑:青、0.5 0.0赤色)の値は、以下の機能を有するRGB色にマッピングされるPathGradientBrushを使用した三角形の色勾配

var color = Color.FromArgb(alpha, 
    (int)((value > 0.5 ? 2*value - 1 : 0) * 255), 
    (int) ((value > 0.5 ? 2-2*value : 2*value) * 255), 
    (int)((value > 0.5 ? 0 : (1 - 2 * value)) * 255) 
); 

これらの値は、重心座標によって三角形(例えば、重量で線形補間されることを意図されています)、完全なアプリケーションでは、より大きな三角形のメッシュです。

ドローイングでは、3つのコーナーとその間にあるいくつかの点にポイントを持つGraphicsPathを作成します(この例ではおそらく残念です)。 PathGradientBrushでは、私はSurroundColorsの色をコーナーの値またはそれらの間の線形補間に設定しました。 CenterPointCenterValueは、(A+B+C)/3values.Sum()/3に設定されています。これは、ここでいくつかの値((0.0, 0.5, 1.0)のためによさそうだ:

good looking example

が、(ここでは(0.3, 0.8, 1.0)、三角形の上部にあるアーティファクトを参照してください)他の人のためにあまりよくありません:

not so good looking example

私は他のいくつかの戦略を試しました(例えば、中心点までの距離を重み付けし、他の場所に配置するなど)。しかし、これらのアーティファクトを取得するには三角形が必要ですが、描画はペイントハンドラで行われなければならず、スロー。どのように私は

  • 中心色を取り除くとOpenGL
  • またはそれらの成果物にはつながらない中央値および/または位置を得るのように色付け三角形をゲットすることができます。

コード問題を再現し、(疑問に貼り付けるには少し多すぎる)の周りに再生する:http://pastebin.com/gjjzqRvY

+0

私はLGBrushでこれを行うことはできません。 [制限事項と解決方法はこちら]を参照してください(http://stackoverflow.com/questions/30339553/fill-panel-with-gradient-in-three-colors/30341521?s=2|0.2326#30341521) – TaW

+0

@TaW:一般的には可能ではありませんが、この特定のユースケースでは可能です。下の私の答えを見てください。 –

答えて

0

私は最後の時間を自分の質問に答えなかったとき、私は思い出すことができません。

PathGradientBrush

  • 周囲の点の間の色の線形補間を行う - >境界上の全ての点は、色が
  • 境界上の補間色と中心点をasigned有する

    これは、次のカラーマッピングでうまくいきます:

    var color = Color.FromArgb(アルファ、 (int)(v) alue * 255)、 (int)((1-value)* 255)、)。

例えば:

0.3 * colorA + 0.7 * colorB 
= 0.3 * (0, 255, 0) + 0.7 * (255,0,0) 
= (76, 178) 

正確0.3ためcolormapping関数の結果である:エッジが0から1になった場合、ブラシの補間は、30%の計算になります。同じことが中心に向かう第2の補間にも当てはまる。

しかし、私は3色を持っていましたが、幸いなことに1つの極端な点は0.5です。 0.0 .. 0.5が問題なく機能し、0.5 .. 1.0が問題なく動作します。しかし、これは線形補間が分解されたことです。トリックは、グラデーションブラシにこの極端なポイントを与えることです:コーナーの最小値と最大値がマジックポイントを横切っていない、ちょうど中心値に行く:

  • コーナーの最小値と最大値は交差しません。
  • もしそれらが交差するなら、エッジとその上の点を見つけます。常に2つあります。ブラシの中心点はその中心にあり、値は極限点です。

将来の読者のためのヒント:

  • あなたのマッピングは、あなたのマッピングは多くを持っている場合は、運
  • の外にある(...、平方根を、罪/ COS、ログ)直線的ではない場合あなたが運命から外れている1つの極端なポイントよりも大きい。
  • パス上の3(交差しない)または5(交差)ポイントで十分です。交点に追加の2点を設定します。
関連する問題