2

GDIを使用してC++でグラデーションブラシを最初から実装しようとしています。GDI+やその他のグラフィックフレームワークを使用したくありません。グラデーションを任意の方向(任意の角度)にしたいと思います。

擬似コードの私のアルゴリズム:

      For each pixel in x dirrection
      For each pixel in the y direction
          current position = current pixel - centre                      //translate origin 
          rotate this pixel according to the given angle
          scalingFactor =( rotated pixel + centre ) / extentDistance    //translate origin back 
          rgbColor = startColor + scalingFactor(endColor - startColor)

extendDistanceは、長方形の中心から通る線の長さであり、グラデーションの角度に等しいグラデーションを持ちます。

これまでのところ順調です。これを描くことができて、見栄えがします。しかし、残念ながら、回転ビットのために、長方形の角の色が間違っています。結果は、90度の倍数である角度に対してのみ完璧です。問題は、スケーリング係数が長方形のサイズ全体にスケーリングされないことであるように見えます。

あなたが私のポイントを理解したかどうかはわかりませんが、それを視覚化せずに私の問題を説明するのは本当に難しいです。

誰かが私を助けたり、役立つ資料にリダイレクトしたりできるなら、私は感謝するでしょう。

4

1 に答える 1

1

OKみんながそれを修正しました。どうやら問題は、(長方形ではなく)グラデーションの塗りつぶしを回転させているときに、スケーリング係数を正しく計算していなかったことです。グラデーションがスケーリングされる距離は、グラデーションの方向に応じて変化します。実行する必要があるのは、回転後に四角形のエッジポイントが終了する場所を見つけることです。これに基づいて、グラデーションをスケーリングする距離を見つけることができます。したがって、基本的に私のアルゴリズムで修正する必要があるのは、extendDistanceです。

どうやってするの:

•四隅すべての座標を変換します

•minXとして4つのxすべての最小値を見つけます

•4つすべてのxの中で最大のものを見つけて、それをmaxXと呼びます

•yについても同じようにします。

•これらの2点間の距離(最大と最小)はextentDistanceです

于 2011-08-18T10:56:04.053 に答える