7

ユーザーから収集された一連のポイントに従って、CGContext へのパスを描画しています。ライン エッジの一部がギザギザに見えるランダムな入力ジッターがあるようです。わずかな羽がこの問題を解決すると思います。OpenGL ES を使用している場合は、パスをストロークしているスプライトにフェザーを適用するだけです。ただし、このプロジェクトでは、Quartz/CoreGraphics にとどまる必要があり、同様の解決策が見つからないようです。

羽に近づけるために、各線がわずかに大きく、透明度が高い5本の線を描いてみました。これにより、悪い結果が生じ、パフォーマンスが著しく低下します。

これは線画コードです:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y)));
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y;
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)];
4

1 に答える 1

2

先に進み、CGContextでアンチエイリアシングがまだオンになっていると仮定しますが、そうでない場合は、@ Davydのコメントが示唆しているように、それが最初に試してみることは明らかCGContextSetShouldAntialiasです。これは対象の関数です。

それが問題ではなく、その行がコンテキストによってアンチエイリアス処理されていると仮定しますが、それでも「よりソフトな」ものが必要です。私はこれを行うためのいくつかの方法を考えることができます。それはうまくいけば5回ストロークするよりも速いはずです。

まず、ストロークパス(つまり、現在のパスのストロークのアウトラインを表すパス)を取得してから、CGContextReplacePathWithStrokedPathこのパスをグラデーションで塗りつぶすことができます(または他の塗りつぶし手法で目的の結果が得られます)。これでうまくいきます。直線の場合は適切ですが、曲線のパスの場合は単純ではありません(グラデーションがストロークされたパスの領域を埋めており、線形または放射状になるため)。

もう1つのおそらくあまり明白ではないオプションは、この目的のためにCGのシャドウ描画を悪用することかもしれません。検索する関数は次のとおりです。CGContextSetShadowWithColor メソッドは次のとおりです。

  • GStateを保存します。CGContextSaveGState
  • 元のパスのバウンディングボックスを取得します
  • パスをコピーし、2.0 * bbox.widthを使用してそれ自体から離れるように変換しますCGPathCreateCopyByTransformingPath(注:X方向のみを使用してください。そうすれば、コンテキストでの反転について心配する必要はありません)
  • を使用してコンテキストを元のbboxにクリップしますCGContextClipToRect
  • コンテキストにシャドウを設定しますCGContextSetShadowWithColor
    • 最小限のブラー(0.5から開始し、そこから開始します。ブラーパラメーターは非線形であり、IMEは一種の推測とチェック操作です)
    • -2.0 * bbox幅、0.0高さに等しいオフセットで、ベーススペースにスケーリングされます。(注:これらのオフセットはベーススペースにあります。これは理解するのが面倒ですが、独自のスケール変換を追加しないと仮定すると、スケール係数は1.0または2.0になるため、実際には、 -2.0*bbox.widthまたは-4.0*bbox.widthのいずれかのoffset.width)
    • お好みの色。
  • 翻訳されたパスをストロークします。
  • GStateをポップしますCGContextRestoreGState

これにより、「ただの」影が残るはずです。これを微調整して、希望する結果を達成できれば幸いです。

とはいえ、CGの影の描画パフォーマンスは、IMEであり、完全に素晴らしいとは言えず、完全に決定論的とは言えません。5つの異なるストロークでパスを5回ストロークするよりも速いと思いますが、圧倒的にそうではありません。

この効果を達成することがあなたにとってどれだけの価値があるかということになります。

于 2012-02-08T13:49:06.957 に答える