0

(Photoshopのように)ポイントツーポイントのグラデーションを生成できるアプリケーションを作りたいです。私は上から下へのグラデーションを生成する方法に精通していますが、ポイントツーポイントではありません。これは概念的にどのように行われますか。

ありがとう

4

3 に答える 3

3

これがまさにPhotoshop のやり方なのか、それとも最も最適なやり方なのかはわかりませんが、これが基本原則であるべきです。

2 つの点をベクトルを定義するものと考えてください。このための法線ベクトルを見つけることができます。これは、元のベクトルに対して垂直になります (それが法線ベクトルの定義であるため)。

線上の離散点 (ピクセル) ごとに、ベクトルと同じ長さの上下 (または左右) グラデーションの場合と同様に、グラデーション カラーを計算します。次に、現在選択されている点を通り、法線ベクトルと平行になるように、選択した色の線を描画します。

実際には、回転していることを除けば、上下のグラデーションに使用するアプローチと非常によく似ています。

于 2010-05-19T23:32:58.497 に答える
2

マイケル・マドセンの答えに基づいて構築-

塗りつぶしている領域内のすべての点について、線分上の最も近い点を計算します。(Google で検索する必要がありますが、例はたくさんあります。) 最も近い点の計算のある時点で、開始点の 0 から終了点の 1 までの範囲の値が計算されます。勾配関数が何であれ、それをプラグインします。

アルゴリズムの概要は基本的に...

pc = # the point you are coloring now
p0 = # start point
p1 = # end point
v = p1 - p0
d = Length(v)
v = Normalize(v) # or Scale(v, 1/d)

v0 = pc - p0

t = Dot(v0, v)
t = Clamp(t/d, 0, 1)

color = (start_color * t) + (end_color * (1 - t))

v を 1/d ではなく 1/d^2 でスケーリングすると、実際には make t/d just t を失う可能性があります。とにかく... これであなたはそこにたどり着けると思います。おそらく明らかに、前半は「静的」であるため、最後の 4 行をループするだけで済みます。

于 2010-05-20T00:09:57.363 に答える
0

このルーチンは、適切な値を使用して、画像内の各ポイントのファンクターを呼び出します。この値をカラー ルックアップ テーブルのインデックスとして使用すると、ブレンドが作成されます。Functor には、void (int x, int y, int value) というプロトタイプがあります。

/** Produce a linear gradient.

    This implementation uses float values.
*/
struct Linearf
{
  template <class Functor>
  void operator() (
    int rows,
    int cols,
    int x0, int y0,
    int x1, int y1,
    int const scale,
    Functor f)
  {
    if (x0 != x1)
    {
      // 1/m'
      float const m = float (y1 - y0) / (x0 - x1);

      for (int y = 0; y < rows; ++y)
      {
        float const p0 = m * (y - y0) + x0;
        float const p1 = m * (y - y1) + x1;
        float const d = (scale + 0.9999f) / (p1 - p0);

        for (int x = 0; x < cols; ++x)
        {
          if (x < p0)
          {
            f (x, y, 0);
          }
          else if (x >= p1)
          {
            f (x, y, scale);
          }
          else
          {
            f (x, y, d * (x - p0));
          }
        }
      }
    }
    else
    {
      // Special case for horizontal lines.
    }
  }
于 2012-08-30T17:08:11.183 に答える