簡単な背景: Web ベースの描画アプリケーションに取り組んでおり、制御点を通過する 1 ピクセルの太いスプラインを描画する必要があります。
私が苦労している問題は、1 ピクセルの鉛筆ツールを使用しているかのように、p1 と p2 の間の各ピクセルを描画する必要があることです。したがって、アンチエイリアシングはなく、一度に 1 ピクセルずつです。これは、ライン/カーブ ライブラリ コードを使用せずに手動で行う必要があります。私のブラシ システムは、キャンバスにブラシ チップを適用するためのピクセル座標に依存しているためです。
基本的に、Bresenham アルゴリズムなどからの 1 ピクセルのステッピングと、Catmull-Rom 方程式によって返される座標を組み合わせる必要があります。Catmull-Rom ポイントが均一に分布していないため、問題が発生しています (したがって、曲線に 100 ピクセルが必要で、方程式を 100 回実行する必要があるとは言えません)。X デルタと Y デルタの最大値の推定開始値を使用し、ギャップを Bresenham で埋めようとしましたが、丸めにより、依然としていくつかの「ダーティ」なセクションが残ります (つまり、ラインは明らかに上に移動し、正しいですが、同じ Y コンポーネントを持つ 2 つのピクセルを取得するため、線の「太い」セクションになります)。
スプラインを描画するほぼすべてのグラフィックス プログラムが、私が求めているきれいなピクセル曲線をサポートする必要があるため、これは解決されたと確信しています。しかし、かなりの数学研究の後、私は少し混乱しており、まだ解決策がありません. 何かアドバイス?
編集:これは、レンダリングする必要があるかもしれない曲線の例です:
次のような予想される結果が得られる可能性があります (これは推定値であることに注意してください)。
Catmull-Rom スプライン方程式を使用すると、セグメントを作成するために 4 つのポイントが必要になります。P0 と P3 は、P1->P2 セグメントからの着信方向と発信方向の接線として使用されます。Catmull-Rom スプラインでは、t が 0 から 1 に移動するときに補間されるのは青色のセクションだけです。P0 と P3 を複製して、緑色の部分が確実にレンダリングされるようにすることができるので、それは私にとっては問題ではありません。
簡単にするために、接線が P0 と P3 の形式であるとすると、P1 と P2 の間の曲線上のピクセルをレンダリングする必要があります。必ずしも Catmull-Rom スプラインを使用する必要はありませんが、制御点を通過する必要があるこのジョブには適切なツールのようです。補間ポイントの不均一な分布が原因で、私はループに陥っています。
EDIT2:結果の曲線が汚いと言うときの意味の例を次に示します。
赤い矢印は、ピクセルがあってはならないいくつかの場所を示しています。これは、計算される座標の X 成分と Y 成分が同じ割合で変化しないために発生します。したがって、各コンポーネントが丸められると (正確なピクセル位置が得られます)、計算された座標が (42.4999, 50.98) であるため、X または Y のいずれかが増加しない場合があります。ラウンドを床または天井に交換しても、発生する場所が変わるだけなので、問題は解決しません。